Rocket - core - pipeline int
https://mp.weixin.qq.com/s/w3gmBiUozd_SvoKQ70mxCA
简单介绍异常信号在流水线上的传递。
本文目录:
1. 中断和异常
2. id阶段
3. ex阶段
4. mem阶段
5. wb阶段
6. 对ctrl kill信号的影响
以下正文:
1. 中断和异常
从实现上看,流水线上对中断和异常做了区分:
中断信号为csr.io.interrupt。
异常按阶段分为:
a. id阶段的异常:
b. ex阶段没有异常;
c. mem阶段的异常:
d. wb阶段的异常;
中断和异常按阶段向下游累积,最后在wb阶段进行处理。
2. id阶段
id阶段对中断信号(csr.io.interrupt)进行检测,中断的发生会对id阶段产生即时的影响。
图示如下:
其中:
a. 中断信号csr.io.interrupt和其他可能发生的异常,触发id_xcpt;
b. 如果没有kill id阶段,则id_xcpt可以用于更新ex_reg_xcpt的值,向ex阶段传递;因为csr.io.interrupt会触发ctrl_killd,所以经过过滤之后,向ex_reg_xcpt传递的只是异常情况,而无中断情况;
c. 中断信号csr.io.interrupt向ex_reg_xcpt_interrupt传递;
3. ex阶段
中断和异常信号在ex阶段的传递情况如下:
其中:
a. 中断信息存放在ex_reg_xcpt_interrupt中,用于更新mem_reg_xcpt_interrupt的值;
b. ex_reg_xcpt中存放异常信息,它和ex_reg_xcpt_interrupt都可以触发ex_xcpt;而后经ctrl_killx过滤,向mem_reg_xcpt传递。同理,因为中断信号会导致ctrl_killx,所以传递给mem_reg_xcpt的实际上只有异常,而无中断的情况。
4. mem阶段
中断和异常在mem阶段的传递情况如下:
其中:
a. mem_reg_xcpt和mem_reg_xcpt_interrupt都可以触发mem_xcpt,mem_xcpt经过take_pc_wb的过滤,向wb_reg_xcpt传递。
5. wb阶段
wb阶段为流水线的最后一个阶段,本阶段只使用中断和异常信息,而不再继续传递:
其中:
a. wb_reg_xcpt会触发wb_xcpt,wb_xcpt用于触发take_pc,重新取指:
再取出的指令,即是中断或异常处理程序的指令。
b. wb_reg_xcpt会触发wb_pc_valid;
6. 对ctrl kill信号的影响
在xcpt/xcpt_interrupt信号向流水线下游传递的同时,也会引起ctrl kill信号的同时变化。
1) id
中断信号(csr.io.interrupt)会立即触发ctrl_killd,进而导致下一个时钟周期ex_reg_valid为假:
2) ex
在ex阶段,ex_reg_valid的值会触发ctrl_killx,然后ctrl_killx用于更新mem_reg_valid的值,导致下一个时钟周期mem_reg_valid为假:
3) mem
在mem阶段,mem_reg_valid会触发ctrl_killm,然后ctrl_killm被用于更新wb_reg_valid,导致下一个时钟周期wb_reg_valid的值为假:
4) wb
wb阶段使用wb_reg_valid的值进行判断和处理: