Rocket - core - ex_slow_bypass
https://mp.weixin.qq.com/s/5FpKbfJFWPXZCFFXrhAXDQ
简单介绍ex_slow_bypass相关的实现。
1. ex_slow_bypass
ex_slow_bypass表示指令为sc,或者访问的内存大小小于4字节的情况:
ex_slow_bypass用于更新mem_reg_slow_bypass的值:
2. mem_reg_slow_bypass
mem_reg_slow_bypass是一个寄存器,用于生成mem_mem_cmd_bh信号:
3. mem_mem_cmd_bh
mem_mem_cmd_bh表示是否可以快速完成指令要求的内存命令。其取值的真值表如下:
其中:
a. fastLoadWord表示是否支持快速Load字大小的数据,如果不支持,则无论访问内存的大小是字节、半字、字,都无法快速完成;
b. fastLoadByte表示是否支持快速Load字节大小的数据,如果支持,则load byte和load Half-word也和load-word一样快;如果不支持,则需要判断访存大小,如果是字节、半字则慢,如果是字则快;
c. 这里隐含的一个情况是:如果不支持fastLoadWord,则不支持fastLoadByte。如果支持fastLoadWord,也不一定支持fastLoadByte。这与生成dcache_bypass_data时的用法相一致:
先判断更不可能的fastLoadByte,然后在判断可能性更高的fastLoadWord。因为如果先判断fastLoadWord,即便判断了也无法直接取数据。
4. mem_cannot_bypass
mem_cannot_bypass中将mem_ctrl.mem和mem_mem_cmd_bh一起用于判断内存操作是否不能快速完成,如果不能快速完成,则不能用于向后续指令bypass数据,而必须要将后续指令bypass。
这里加入mem_ctrl.mem是因为mem_mem_cmd_bh中只判断了访存的大小,并没有判断是否内存操作。
在mem_ctrl.mem为真的情况下,加入mem_cannot_bypass的真值表如下:
cannot bypass理解起来需要转一个弯,这里将其取反一下:
5. dcache_bypass_data
dcache_bypass_data也与fastLoadWord和fastLoadByte相关,其定义如下:
在mem_ctrl.mem为真的情况下,其真值表如下:
dcache_bypass_data的使用如下:
如果mem_ctrl.mem为假,则使用第三个匹配项。
如果mem_ctrl.mem为真,则使用第四个匹配项。结合上方的真值表,针对dcache_bypass_data的三种可能的情况:
a. wb_reg_wdata不存在被用于作为转发的情况,实际上wb_reg_wdata中也没有存放load的结果,不能用于bypass;也就是说,如果既不支持fastLoadWord,也不支持fastLoadByte,那么load指令都不能bypass。
b. io.dmem.resp.bits.data和io.dmem.resp.bits.data_word_bypass都存在用于转发的情况;
如果Load的数据要用于bypass,那么必须在dcache命中的情况下,只有这样load指令才能在WB阶段返回数据。如果不命中的情况下,则无法在WB阶段返回数据。如此将会导致需要bypass数据的指令被replay,即重新执行:
replay_ex_load_use的效果参考如下图示: