基于RISC-V的流水线处理器
RISC-V是一个基于精简指令集原则的开源指令集架构。它由加州大学伯克利分校的David Patterson教授领导下的小组完成,至今已成为RISC处理器中一股强劲的新生力量。
至今github上已有多款优秀的基于RISC-V指令集的微处理器项目被发布,如蜂鸟E203、RocketChip等,但它们所涉及的知识层级较深,初学者很难迅速上手。而CSDN上也没有找到类似的RISC-V处理器的项目,因此笔者决定从零开始,由基础指令集做起,实现一款基于RISC-V指令集的微处理器。
RISC-V指令集
实现一款处理器,首先也是最重要的就是要确定处理器的指令集架构。
RISC-V指令集可以分为以下几个子集:
- RV32I:基本整数集,包括整数计算指令,LOAD/STORE,以及控制指令。RV32I拥有32位寻址空间,32个32位寄存器。
- RV32E:指令与RV32I相同,但是寄存器数量变为16个,用于嵌入式环境。
- RV64I:整数指令,拥有64位寻址空间,32个64位寄存器。
- RV128I:整数指令,拥有128位寻址空间,32个128位寄存器。
上述子集是RISC-V的基本指令集。在实际设计中,我们可以根据需要加入如下的扩展指令集:
- M:标准乘法和除法扩展,增加了乘法和除法的指令,并把结果保存在整数寄存器。
- A:标准原子指令扩展,增加了原子的读,修改,以及写存储器的指令。
- F:标准单精度浮点扩展,增加了浮点寄存器,单精度计算指令,以及单精度的LOAD/STORE指令。
- D:标准双精度浮点扩展,同样增加了浮点寄存器,且增加了双精度计算指令,双精度的LOAD/STORE指令。
上述均为RISC-V基金会认证的扩展指令集,此外还有V/P/T等处于草稿修改阶段的扩展指令集,这里就不再赘述了。
RV32I
在本次设计中,我们要实现的是基于最基本的整数指令集——RV32I的微处理器。就让我们从RV32I的具体指令格式看起。
下图展示了RV32I的基本指令格式。为了简化译码过程,源寄存器(rs1 和