Rocket - core - ctrl_stalld和ctrl_killd
https://mp.weixin.qq.com/s/ObOJWdSvJKVWUsE2W71GEQ
简单介绍ctrl_stalld相关的实现。
1. 概述
顾名思义,ctrl_stalld的意思是stall id阶段,也就是挂起id阶段,不再继续前进。
同时,还有另外一个变量叫做ctrl_killd,同样顾名思义,ctrl_killd的意思是kill id阶段,也就是干掉id阶段,使其非法化。
那么两者的区别是什么呢?
2. ctrl_stalld
ctrl_stalld的作用主要有两处:
a. 用于触发ctrl_killd;
b. 用于停止ibuf:
从其作用上看,ctrl_stalld的作用比ctrl_killd还要大。但是从名字上看,ctrl_killd却比ctrl_stalld还要狠。
所谓stall,就是停止。stall id就是停止id阶段。包括两个方向:
a. id之前的阶段,比如if阶段不要再向id阶段传递新的指令;
b. id之后的阶段,id不再向其传递新的解码结果;
3. ctrl_killd
如果id阶段,不再向后续阶段传递解码结果,那么从效果上就相当于被kill了。
只是ctrl_killd还有另外一层意思,就是id阶段当前的指令不再执行,被废弃掉:
首先,id阶段的当前指令不再向后续阶段传递;
其次,id阶段会被if阶段过来的新指令给冲刷掉;而stall id阶段,因为暂停了if阶段,id阶段的当前指令并不会被冲刷掉。
不过在某些情况下,比如中断导致的ctrl_killd,并不是彻底kill id阶段,id阶段当前指令的pc会被通过流水线传递下去,最终仍会重新得到执行。只是这种重新执行,往往是重新从头开始进入流水线,而不是直接进入id阶段。从这个意义上而言,之前的id阶段,确实被kill了。
4. 总结
ctrl_stalld把id阶段以及其之前的阶段暂停,不再向流水线下游流动。而在不stall的情况下,ctrl_killd控制id阶段不向下游流动,id阶段本身也将被上游新来的指令冲刷掉。