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还在占用,其他指令不可使用;

 

posted @ 2022-03-20 11:18  wjcdx  阅读(146)  评论(0编辑  收藏  举报