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阶段本身也将被上游新来的指令冲刷掉。

 

posted @ 2022-03-20 11:15  wjcdx  阅读(76)  评论(0编辑  收藏  举报