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的效果参考如下图示:

 

posted @ 2022-03-21 20:17  wjcdx  阅读(79)  评论(0编辑  收藏  举报