Rocket - core - 中断和异常的优先级
https://mp.weixin.qq.com/s/PYporobINz5czzgY8p1odw
简单介绍中断和异常的优先级。
本文目录:
1. 中断在ID阶段被检测
2. ID阶段同时存在中断和异常信号
3. 各阶段的异常
4. 领先于中断的异常
以下正文:
1. 中断在ID阶段被检测
中断信号csr.io.interrupt只在id阶段进行检测,之后存入ex阶段的流水线寄存器中。id阶段受到即时的影响,而ex阶段的指令得以执行,在一个时钟之后才受到影响。
2. ID阶段同时存在中断和异常信号
如果ID阶段在检测到中断信号的同时,也发生了异常,则中断信号优先得到处理。
从实现上看,csr.io.interrupt信号导致异常信号无法向ex_reg_xcpt传递,到ex阶段只能看到ex_reg_xcpt_interrupt代表的中断信号:
3. 各阶段的异常
异常可以发生在ID/MEM/WB阶段,他们存在如下情况。
1) 一般情况,单个阶段发生异常,可以正常的得到处理。这种情况下,不存在优先级的情况。
2) 两个或多个阶段同时发生异常,靠后的流水线阶段的异常,先得到处理。其他阶段的异常,需要在处理返回之后,重新触发才能得到处理。(如果不触发,则不存在异常也就无需处理了。)
3) ID阶段先发生异常,当向下流动到EX阶段时,MEM阶段的指令发生了异常,以及与此类似的其他情况。无论发生的时间前后,在流水线上先到达WB阶段的异常优先得到处理。
4. 领先于中断的异常
ID阶段检测到的中断信号,在流动到EX阶段时,MEM阶段发生了异常,以及与此类似的情况。
无论发生时间的先后,在流水线上先到达WB阶段的优先处理。实际上,在流水线上先到达WB阶段的只能是异常。