Rocket - core - csr.io.interrupt

https://mp.weixin.qq.com/s/KShCBLy5TqFVZg-uvcW-aw 

 

简单介绍csr.io.interrupt相关的实现。

 

本文目录:

1. csr.io.interrupt

2. id_xcpt

3. ex_reg_xcpt_interrupt

4. ex_reg_cause

5. ctrl_killd

 

以下正文:

1. csr.io.interrupt

csr.io.interrupt表示发生了中断:

csr.io.interrupt在RocketImpl中主要有下文四处使用,下面逐一进行研究。

 

2. id_xcpt

id_xcpt表示id阶段检测到的异常:

这里除了csr.io.interrupt能够触发id_xcpt之外,还有另外7种情况。即id_xcpt包含csr.io.interrupt,亦即id_xcpt所代表的异常包含了中断和id阶段检测到的一些异常情况。

 

id_xcpt有两处用法,一个是传递给流水线寄存器(pipeline register) ex_reg_xcpt:

 

一个是用于调整ex阶段alu的运算:

 

3. ex_reg_xcpt_interrupt

ex_reg_xcpt_interrupt表示是否发生了中断:

其中包含三个条件:

a. !take_pc: 表示不需要重新取指;

b. ibuf…valid: 表示ibuf可以已经取出指令;

c. csr.io.interrupt: 表示发生了中断;

概括而言,就是在流水线正常流动的情况下,发生了中断。

 

ex_reg_xcpt_interrupt这个变量在ex阶段使用,所以中断的发生对ex阶段产生影响。中断每时每刻都可能发生,流水线的每个阶段都可以检测中断是否发生,问题在于各个阶段有没有检测,而不能说中断发生在某个阶段。

 

4. ex_reg_cause

当发生中断时,ex_reg_cause中记录id_cause传递下来的中断原因:

 

5. ctrl_killd

如果中断发生,就要kill id阶段:

从中可以看出,id阶段的异常并没有触发ctrl_killd。所以ex_reg_xcpt代表id阶段发生异常的情况,不包括中断:

因为如果发生中断,则ctrl_killd=true, id_xcpt无法传递给ex_reg_xcpt。

 

posted @ 2022-02-19 17:55  wjcdx  阅读(96)  评论(0编辑  收藏  举报