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),并重新取指。