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寄存器中存放的是用于辅助软件处理异常而记录的信息。这里主要是触发异常的内存地址,无论是数据的地址还是指令的地址。