Rocket - core - mem阶段异常的处理
https://mp.weixin.qq.com/s/l6YwgQ3bQKA22lX4fiCm1A
简单介绍mem阶段异常的处理。
本文目录:
1. mem阶段的异常
2. misaligned fetch
3. load/store exception breakpoint
以下正文:
1. mem阶段的异常
mem阶段发生的异常如下:
a. misaligned fetch:
b. load exception breakpoint;
c. store exception breakpoint;
2. misaligned fetch
根据规范,misaligned fetch可以把异常的指令地址存入mtval寄存器中:
但是在实现中,没有为Causes.misaligned_fetch异常填写mtval寄存器:
3. load/store exception breakpoint
根据规范,breakpoint异常可以把引起异常的地址存入mtval寄存器中:
这里引起异常的地址,不是指令的地址,而是load/store的内存地址。
在实现中,也确实为Causes.breakpoint异常填写了mtval寄存器。
1) load/store指令,需要在ex阶段使用alu计算内存地址
2) 因为ex阶段没有中断和异常信号,所以ex_pc_valid = 1,不考虑scie的情况下,mem_reg_wdata = alu.io.out:
3) mem_reg_wdata传入mem_int_wdata:
其中:
a. ex阶段没有异常信号传入,所以mem_reg_xcpt = 0;
b. 不是jalr指令,所以mem_ctrl.jalr = 0;
c. 没有发生mem_npc_misalighed,所以mem_npc_misaligned = 0;
因为根据位置决定的优先级,如果发生了mem_npc_misaligned,则优先处理该异常:
d. 所以选择mem_reg_wdata;
4) mem_int_data传入wb_reg_wdata
因为异常发生在mem阶段,而mem_reg_valid由ex阶段的值更新,所以mem_reg_valid = mem_pc_valid = 1:
所以mem_int_data可以传入mem_reg_wdata:
注:不考虑scie和fp。
5) wb_reg_data存入csr.io.tval:
6) csr.io.tval存入mtval寄存器: