Learning RISC-V - Introducing XiangShan and NutShell
背景介绍
如果想深入了解操作系统是怎么运行、实现的,可以学习 Linux Kernel,它能够让我们知道任务是怎样调度,内存是怎么管理等等;
如果想深入了解 SOC 是怎么运转、通信的,各模块 IP 之间是如何连接的,这要看各个 IP 的 Spec 手册,像 ARM 的手册对系统的组织或原理介绍的较为详细;
如果阅读 Spec 仍觉得有些细节不够深入,对微架构实现不清晰、指令流水转运转不明朗,那就直接深入到最低层,看 RTL 实现!
开源的 RTL,目前 RISC-V 是一个较好的学习对象,好在国内也已经搭建起多个开源处理器项目,其中 NutShell 和 XiangShan 就是出色且值得学习的实现;
我们由外至内,先了解如何仿真、运行 RTL,再逐层的去剖析其内部各模块真正的实现;
先来看 XiangShan 项目,
XiangShan
香山处理器 Verilog 的仿真运行,要依赖几个其它模块,
像 Difftest 用来做指令的差分验证架构,NEMU 做为差分验证的模拟器执行端,
Mill 编译为硬件代码,还有 Verilator 实现硬件代码的仿真等,
我们单个去下载、编译这些项目的话较复杂,
还好香山为我们提供好了环境的简单适配,不得不说这个项目真的很贴心!
构建 XiangShan
我们直接克隆环境适配工程(详细说明见官方文档),
git clone https://github.com/OpenXiangShan/xs-env
依赖模块的搭建,
/* 安装系统依赖模块,编译安装指定版本的 Verilator */
sudo -s ./setup-tools.sh
/* 更新 gitsubmodule,配置环境变量,编译 NEMU 等 */
source setup.sh
生成可综合的单核代码
在 /xs-env/XiangShan 下运行 make verilog ,该命令将会编译香山的 Chisel 代码,生成 Verilog,输出的文件在 XiangShan/build/XSTop.v
提示: make verilog命令生成的Verilog文件用于生成FPGA的bitstream和流片,去除了Difftest等仿真用的调试模块。 如果需要生成带有Difftest的用于仿真的Verilog文件,可以使用make sim-verilog命令。
仿真模拟运行
我们使用 Verilator 生成香山核的仿真程序,进入 XiangShan 目录,运行命令
make emu CONFIG=MinimalConfig EMU_TRACE=1 -j32
将会生成一个最小配置的香山的仿真程序,生成结束后,可以在 ./build/ 目录下看到一个名为 emu 的仿真程序。其中,CONFIG=MinimalConfig 指定了香山核使用的配置,EMU_TRACE=1 会为仿真程序添加波形输出功能,允许在仿真过程中启用波形输出。
(编译过程可能消耗较大系统内存,如 Build Fail,可通过修改 ./build.sc 下 -Xmx 参数以降低内存消耗程度)
在 /xs-env/NEMU下运行,
make clean
make riscv64-xs-ref_defconfig
make -j
这个命令会将 NEMU 模拟器编译成动态链接库,将会在 build 目录下生成文件 riscv64-nemu-interpreter-so,从而接入到香山仿真差分测试中。
利用前面生成好的香山仿真程序,NEMU 动态链接库与 workload,可以默认在差分测试框架打开的情况下让香山核运行指定的应用程序,
./build/emu -i $NOOP_HOME/ready-to-run/linux.bin
如果有看到 Kernel Log 输出,则说明已经模拟运行成功;
NutShell
NutShell 是 OSCPU (Open Source Chip Project by University) 团队开源的 RISC-V 处理器项目,
其复杂程度要远小于香山,拿它来作为入门是个不错的选择,
编译和运行
需要注意的是,NEMU 要选择适合 NutShell 的配置,
配置文件使用
make riscv64-nutshell-ref_defconfig
随后即可以如下方式编译、启动 NutShell,
source ./env.sh
make clean
make emu EMU_CXX_EXTRA_FLAGS="-DFIRST_INST_ADDRESS=0x80000000"
./build/emu -b 0 -e 0 -i ./ready-to-run/linux.bin -C 75000000 --diff ../NEMU/build/riscv64-nemu-interpreter-so
同样有看到 Kernel Log 输出的话,则说明已经模拟运行成功;
展望
我们前面提到过,相对于 XiangShan 而 NutShell 更适合初学者学习,其架构实现及 Chisel 的编写均要比 XiangShan 容易理解;
那么后面的篇章,会先以 NutShell 展开,而且还是围绕 Inorder 的实现展开,学会了 Inorder 再去看 OOO(Out Of Order),最后再去征服 XiangShan 也不迟,一步一脚印;