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中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-02-19 Rocket - 断句 - Diplomacy and TileLink from the Rocket Chip