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

 

posted @ 2022-02-19 18:00  wjcdx  阅读(174)  评论(0编辑  收藏  举报