Rocket - core - sboard.set
https://mp.weixin.qq.com/s/UuIy-KkdlsE9aK7XwGA0GA
简单介绍sboard.set相关的实现。
1. sboard.set
sboard用于记录对通用寄存器的占用,每个比特位代表一个寄存器。sboard.set用于实现对相应位的置位。
1) sboard.set
sboard.set方法的定义如下:
其调用如下:
其中:
a. wb_set_sboard && wb_wen表示是否使能某一位的置位;
b. wb_waddr表示要置的位对应的寄存器号;
2) wb_set_sboard
wb_set_sboard的赋值如下:
不考虑div和rocc的情况,只剩下一种dcache miss的情况:
wb_dcache_miss包含两个条件:
a. wb阶段的当前指令涉及内存操作;
b. dcache没有响应;
反推以下:在dcache命中的情况下,mem阶段发起的load/store只需要一个时钟周期即可以得到响应,即在wb阶段可以得到响应。
3) wb_wen
wb_wen表示wb阶段要回写寄存器:
其中:
a. wb_valid表示当前wb阶段的指令合法;
b. wb_ctrl.wxd表示当前指令要回写某个寄存器;
wb_valid包含的条件如下:
a. wb_reg_valid表示流水线寄存器合法,即上一个时钟周期的mem阶段没有ctrl_killm;
b. wb阶段当前指令不需要重新执行:如果需要重新执行,则当前则不需要执行;
c. wb阶段未检测到异常:如有异常则会被异常打断,等异常处理完成之后会恢复执行,当前则不需要执行;
2. sboard.clear
sboard.clear的调用关系如下:
其中:
a. ll_wen表示要是否要清除某一个通用寄存器对应的位;
b. ll_waddr表示通用寄存器的编号;
c. ll表示long-latency,即(相对不延迟而言的)长延迟;
1) ll_wen
ll_wen的赋值如下所示:
如果忽略rocc和div的情况,则ll_wen只在dmem_resp_replay && dmem_resp_xpu的情况下被置为真。
在这两个条件中:
a. dmem_resp_replay表示dcache返回了数据,并且带有replay标志;推测replay标志的意思是读取内存之后返回的,而不是直接从dcache中返回的。在DCache的实现中,如果是cached response,replay被置为false:
如果是uncached response,replay被置为true:
b. dmem_resp_xpu取自tag的最低位,这一位记录自请求时传入的tag:
因为后续没有计划研究DCache,所以这里推测一下:
可以看到io.dmem.req的填充发生在ex阶段;在mem阶段填入了s1_data.data;在cached response的情况下,把s2填充到resp中:
所以可以推测对应关系如下:
a. s0对应ex阶段;
b. s1对应mem阶段;
c. s2对应wb阶段;
在DCache的实现中,也有线索可以证实这一推测:
2) ll_waddr
ll_waddr表示要写的目标寄存器的编号,这个也记录自请求时传入的值。
3. id_sboard_clear_bypass
因为在sboard.set和sboard.clear中间有一个long-latency,所以会导致hazard:
id_sboard_hazard用于检测是否存在hazard的情况,其中:
a. sboard.read(rd)表示寄存器rd对应的位置位,亦即寄存器rd被占用;
b. !id_sboard_clear_bypass(rd)表示没有要清除相应位,即当前时钟周期寄存器rd还在占用,其他指令不可使用;