Rocket - core - wb_reg_flush_pipe

https://mp.weixin.qq.com/s/6WVmHCY0nd_AtOBByfgJVA

 

简单介绍wb_reg_flush_pipe的作用。

 

 

1. wb_reg_flush_pipe值的由来

 

1) wb_reg_flush_pipe

wb_reg_flush_pipe的值是通过流水线从mem_reg_flush_pipe传递而来的。

如果没有kill mem阶段,则可以把mem_reg_flush_pipe传递给wb_reg_flush_pipe:

这里kill mem的典型情况是mem_reg_valid为假,即mem阶段流水线寄存器的值不合法。

 

2) mem_reg_flush_pipe

 

mem_reg_flush_pipe的值从ex_reg_flush_pipe传递而来:

如果不考虑debug的情况,mem_reg_flush_pipe直接在ex_pc_valid的控制下,由ex_reg_flush_pipe传递而来。

 

ex_pc_valid主要的情况为ex_reg_valid,即ex阶段流水线寄存器的值是合法的。在中断的情况下,ex_pc_valid也为真。

 

3) ex_reg_flush_pipe

 

ex_reg_flush_pipe的值使用id阶段生成的值更新:

这里存在两种情况:

a. 指令为fence_i指令;

b. csr指令要求flush流水线;

 

2. wb_reg_flush_pipe的使用

 

wb_reg_flush_pipe可以导致take_pc_wb,进而导致take_pc,要求重新取指。重新取指的pc是随着flush pipe一路传递而来的wb_reg_pc,其源头为ibuf.io.pc。

 

3. 对流水线的影响

 

所谓flush pipe就是刷新流水线。即以带有flush效果的指令为分界,之前的指令都执行完成之后,才能重新取指进行执行。

 

以fence_i指令为例:

a. 在ID阶段,fence_i指令导致ex_reg_flush_pipe的值将要被更新为1:

因为fence_i是一条正常指令,所以ctrl_killd = 0;

 

b. 在EX阶段,fence_i指令正常执行:

mem_reg_flush_pipe将要被更新为1。

 

c. 在MEM阶段,fence_i指令正常执行:

wb_reg_flush_pipe将要被更新为1。

 

d. 在WB阶段,fence_i指令触发take_pc:

take_pc实时导致之前的各阶段被废弃(killd/killx/killm),并重新取指。

 

posted @ 2022-03-12 00:05  wjcdx  阅读(85)  评论(0编辑  收藏  举报