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中。

 

 

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