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。