Rocket - core - wb_reg_wdata

https://mp.weixin.qq.com/s/6Xb2INIqWP5mFy2nR3l6AA

 

简单介绍wb_reg_wdata相关的实现。

 

1. wb_reg_wdata的正常使用

 

正常情况下,wb_reg_wdata寄存器用于存放要回写到寄存器的数据,比如数学运算指令的运算结果,用于生成rf_wdata:

 

不考虑scie和fpu的情况下,wb_reg_wdata来自于mem_int_wdata:

 

如果是add/sub等指令,mem_int_wdata使用mem_reg_wdata更新:

 

在不考虑scie的情况下,mem_reg_wdata使用alu.io.out的计算结果进行更新:

 

在没有异常的情况下,alu的输入参数使用指令编码中指定的源参数寄存器或者立即数:

 

2. wb_reg_wdata的异常使用

 

在id阶段发生异常的情况下,会对alu的运算参数进行调整:

这些调整主要是用于计算发生异常的指令的地址。因为指令也存在某种存储比如内存中,所以这里计算的是引发异常的指令的内存地址。之所以这样说,是为了以示区别,因为指令地址pc本身也会沿着流水线向下游传递。

 

alu的计算结果alu.io.out存入mem_reg_wdata中:

 

在发生中断的情况下,mem_reg_wdata同样用于生成mem_int_wdata的值:

这也是mem_int_wdata中int所代表的中断的意义。

 

mem_int_wdata用于更新wb_reg_wdata:

 

在发生中断的情况下,wb_valid为假,不能wb_reg_wdata不能用于回写寄存器:

 

其用途在于在tval_valid的控制下,用于更新csr.io.tval的值(以及用于更新csr寄存器的值):

 

csr.io.tval的值用于填入mtval这样的寄存器。mtval寄存器中存放的是用于辅助软件处理异常而记录的信息。这里主要是触发异常的内存地址,无论是数据的地址还是指令的地址。

 

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