https://mp.weixin.qq.com/s/Lacj8qDWhn98BMPns-mJPw
简单介绍wb阶段异常的处理。
本文目录:
1. wb阶段的异常
2. 使用mtval记录异常内存地址信息
以下正文:
1. wb阶段的异常
wb阶段发生的异常如下:
a. misaligned store
b. misaligned load
c. store page fault
d. load page fault
e. store access
f. load access
根据规范,这些异常可以把引起异常的地址存入mtval寄存器中:
这里引起异常的地址,不是指令的地址,而是load/store的内存地址。
在实现中,也确实为这些异常填写了mtval寄存器:
2. 使用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阶段没有发生异常,如果发生异常,则优先处理mem阶段的异常:
wb_reg_xcpt记录mem阶段传下来的异常信息,位置靠前则优先处理。
d. 所以选择mem_reg_wdata;
4) mem_int_data传入wb_reg_wdata
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寄存器: