Rocket - core - ex_reg_xcpt_interrupt
https://mp.weixin.qq.com/s/CS0dRvIfPCAiEH_tMVvpRw
简单介绍ex_reg_xcpt_interrupt相关的实现。
本文目录:
1. ex_reg_xcpt
2. ex_reg_xcpt_interrupt
以下正文:
1. ex_reg_xcpt
ex_reg_xcpt表示在没有kill id阶段的情况下,把id_xcpt的值传给ex_reg_xcpt :
1) ctrl_killd
ctrl_killd的赋值如下:
图示如下:
ctrl_killd的意义为kill id阶段,不再向ex阶段进行传递。所以这里使用ctrl_killd过滤id_xcpt来决定是否向ex_reg_xcpt进行传值。
2) ex_reg_xcpt中只包含id阶段传递过来的异常,而不包括中断
从ctrl_killd的赋值中可以看出,csr.io.interrupt会触发ctrl_killd,所以如果发生中断,id_xcpt则不会向ex_reg_xcpt进行传值。而id_xcpt中包含两类情况:a) 中断;b) id阶段发现的异常;所以这里ex_reg_xcpt中只包含了id阶段传递过来的异常,而不包括中断。
2. ex_reg_xcpt_interrupt
首先,从名称上看:
a. ex表示ex阶段;
b. reg表示寄存器;
c. xcpt表示异常;
d. interrupt表示中断;
如果把interrupt理解为对xcpt的进一步阐释,那么ex_reg_xcpt_interrupt的意义就是ex阶段寄存器记录的(异常中的)中断。
1) 赋值
代码如下:
图示如下:
其中:
a. !take_pc表示没有要求从新的pc重新取指;
b. ibuf…valid表示ibuf输出的指令是合法的;
c. csr.io.interrupt表示发生了中断;
综合起来,就是在流水线正常运行的情况下,发生了中断。
2) 并非ex阶段发生了中断
中断每时每刻都可能发生,流水线的各个阶段每时每刻也都存在。所以中断发生时,流水线每个阶段都可以检测到中断,只是有没有去检测的问题。某个阶段检测到了中断的发生,并不能认为中断发生在该阶段。
3) 而是标识检测到了中断的变量,在ex阶段使用
ex_reg_xcpt_interrupt在ex阶段使用:
其中:
a. 如果检测到发生了中断,则ex_pc_valid为真。ex_pc_valid控制ex阶段的寄存器是否向mem阶段传递。所以中断发生时ex阶段执行的指令,是可以向mem阶段流动的。
b. ex阶段本身不会发生异常,所以只记录从id阶段传递下来的异常和中断到ex_xcpt中。