背景介绍
CSR,即Control and Status Register,控制与状态寄存器,属于CPU自带的一类寄存器(注意这里需要跟前文所述的通用数据寄存器区别开来,后文对这种寄存器称之为数据寄存器,以示区分)。在机器模式(Machine Mode,本项目只支持该模式)下这些存储器主要包括以下六类:
- 处理器信息相关:例如处理器的厂商信息,架构信息,核心数等等,是一个芯片自身的I固有信息。
- 中断配置相关:例如中断开关以及中断入口等信息。
- 中断响应相关:例如中断原因,中断返回地址等信息。
- 存储器保护相关:设置不同地址空间的存储器的访问属性,例如可读可写可执行等等。
- 性能统计相关和调试接口相关
CSR的访问与当前指令,或者说程序处于何种模式密切相关,不同模式下所能访问的CSR数量都不同。如果强行访问一个本不应该在该模式下访问的CSR则会触发非法指令的异常。所以在设计CSR访问逻辑时,需要知道该CSR允许在哪(些)种模式下可以访问,而这需要仔细研读RISC-V SPEC相关的部分。除此之外,一条CSR指令并不会比一条ADD指令更复杂。同样可以套用前面总结的设计模板。
开始Coding
与先前所实现的指令类似,实现CSR
指令,需要以下几个EXU子模块的协同配合:
- exu_decode:指令解码模块,负责解析具体的访存指令。
- exu_regfile:寄存器文件模块,源操作数需要从此模块读出,读存储器的结果需要写回到此模块。
- exu_alu:指令执行模块,具体指访存地址的生成,以及其他控制信号。
- exu_wbck:结果写回模块,负责结果写回
基于上述划分标准,以下将详细介绍各个模块的设计细节。
指令译码
首先,我们需要从riscv-spec上找到CSR
指令所对