Rocket - core - wb阶段异常的处理

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寄存器:

 

posted @ 2022-03-11 23:59  wjcdx  阅读(138)  评论(0编辑  收藏  举报