1. 起因
我写下这篇专栏一方面是因近来学了riscv处理器,希望能写点笔记留存一下;另一方面也是应好友邓之邀,出一个不那么复杂便于初学者学习的小白教程。从开始学习RISCV处理器的时候我花了不少时间去找参考资料,但要么结构过于复杂不便于初学者理解,要么就是没有对照的结构图。所以,打算写一个更偏向于从零开始的小白教程,从指令集开始,再一步一步搭建RISCV处理器核,最后根据搭建的架构图再去写代码。
2. 建议
- 本项目RISCV处理器的设计参考《计算机组成与设计:硬件软件接口 RISC-V版》一书,如果时间充足的话非常建议先阅读该书前四章再来学习;
- 代码可在gitee下载(点此下载),在看代码之前,推荐先看本教程专栏,搭配食用效果更佳。
- 代码的使用方法详见工程文件中的README
3. 关于项目
3.1 优点
- 实现的RISCV处理器核比较基础,对初学小白相对友好;
- 项目文件里面包含所有的设计和测试文件以及完整的Makefile脚本,可以“开箱即用”;
- 教程专栏里面有RISCV处理器核的搭建过程以及最终的架构图,可以给代码提供参考;
- 代码具有详细的注释;
3.2 缺点
- 实现的RISCV处理器核比较基础,例如中断、
缓存(已填坑)等暂未实现; - 目前只测试了各指令的执行,测试方法待完善;
todo 部分store、load指令有点问题
3.3 RISCV处理器核规格
本项目实现的RISCV处理器核特点如下:
- 具有五级流水线;
- 实现RV32I指令集;
- 能够处理流水线冒险与前递;
- 使用官方指令集测试文件进行测试;
- 包含Makefile脚本,开箱即用
3.4 硬件架构图
3.5 项目文件层次
├── doc
│ └── riscv-spec-20191213.pdf
├── Makefile
├── pic
│ ├── Hardware_Architecture.png
│ ├── RISCV_assembly_instructions.jpg
│ └── RV32I_Base_Instruction_Set.jpg
├── README.txt
├── rtl
│ ├── chip
│ │ └── riscv_soc.v
│ ├── riscv_core
│ │ ├── alu_add.v
│ │ ├── alu_ctrl.v
│ │ ├── alu_ex.v
│ │ ├── defines.v
│ │ ├── dff.v
│ │ ├── ex_mem.v
│ │ ├── Hazard_Detection_Forwarding_unit.v
│ │ ├── id_ex.v
│ │ ├── if_id.v
│ │ ├── imm_gen.v
│ │ ├── jump_ctrl_unit.v
│ │ ├── main_ctrl.v
│ │ ├── mem_wb.v
│ │ ├── mux2.v
│ │ ├── mux3.v
│ │ ├── or_gate.v
│ │ ├── pc.v
│ │ ├── regs.v
│ │ └── riscv_core.v
│ └── wrap
│ ├── dram.v
│ ├── dual_ram.v
│ └── iram.v
├── script
│ ├── count.pl
│ └── report.pl
├── sim
│ ├── filelist.f
│ ├── insts.txt
│ └── wave_rcfiles
└── tb
├── generated
│ ├── ...
├── my_inst_txt
│ ├── blt_inst_test.txt
│ ├── bne_inst_test.txt
│ ├── ex_mem_risk.txt
│ ├── ex_risk.txt
│ ├── jal_inst_test.txt
│ ├── load_use_risk.txt
│ └── mem_risk.txt
├── inst_txt
│ ├── ...
└── riscv_soc_tb.v
13 directories, 323 files
4. 后续计划
增加中断
增加cache缓存(已填坑)
完善处理器的测试,跑个回归测试...
使用交叉编译器运行c语言代码
5. 文章链接
参考资源:
《计算机组成与设计:硬件软件接口 RISC-V版》
手把手教你设计RISC-V 处理器 第0期-蓄势待发_哔哩哔哩_bilibili
大家一起从零设计RISC-V处理器(一)之开篇_risc-v设计_芯王国的博客-CSDN博客
来自广东