这是一个基于verilator
的RISC-V
CPU开发仿真框架。
开发前请在myinfo.txt
文件中填写报名一生一芯
时的学号和自己的姓名。例如:
ID=202100001
Name=张三
操作系统:Linux Ubuntu v20.04
verilator要求统一使用v4.204
版本,可以从这里下载安装包。使用下面的命令安装verilator
和gtkwave
。
# 安装verilator,需要先下载verilator的安装包
tar vxf verilator_installer.tar.gz
./install_verilator.sh
# 安装gtkwave
sudo apt-get install gtkwave
关于开发环境的详细安装流程,可参考讲座-Verilator介绍。
git clone --recursive -b 2021 https://github.com/OSCPU/oscpu-framework.git oscpu
如果子仓库克隆失败,可在oscpu
目录下使用下面的命令重新克隆子仓库。
git submodule update --init --recursive
参与一生一芯
还需要设置git信息。
# 使用你的编号和姓名拼音代替双引号中内容
git config --global user.name "2021000001-Zhang San"
# 使用你的邮箱代替双引号中内容
git config --global user.email "zhangsan@foo.com"
我们提供了脚本build.sh
用于自动化编译、仿真和查看波形。下面是build.sh
的参数说明,也可在oscpu目录下使用./build.sh -h
命令查看帮助。
-e 指定一个例程作为工程目录,如果不指定,将使用"cpu"目录作为工程目录
-b 编译工程,编译后会在工程目录下生成"build"(difftest)或"build_test"子目录,里面存放编译后生成的文件
-t 指定verilog顶层文件名,如果不指定,将使用"top.v" 或"SimTop.v"(difftest)作为顶层文件名,该参数在接入difftest时无效
-s 运行仿真程序,即"build/emu"程序,运行时工作目录为"build"(difftest)或"build_test"子目录
-a 传入仿真程序的参数,比如:-a "1 2 3 ......",多个参数需要使用双引号
-f 传入c++编译器的参数,比如:-f "-DGLOBAL_DEFINE=1 -ggdb3",多个参数需要使用双引号,该参数在接入difftest时无效
-l 传入c++链接器的参数,比如:-l "-ldl -lm",多个参数需要使用双引号,该参数在接入difftest时无效
-g 使用gdb调试仿真程序,该参数在接入difftest时无效
-w 使用gtkwave打开工作目录下修改时间最新的.vcd波形文件
-c 删除工程目录下编译生成的"build"文件夹
-d 接入香山difftest框架
-m 传入difftest框架makefile的参数,比如:-m "EMU_TRACE=1 EMU_THREADS=4",多个参数需要使用双引号
projects
目录下几个例程可用于了解如何基于verilator
和香山difftest框架
来开发仿真CPU。
examples/counter
目录下存放了4位计数器的例程源码。可以使用下面的命令编译和仿真。
./build.sh -e counter -b -s
如果verilator
安装正确,你会看到下面的输出
Simulating...
Enabling waves ...
Enter the test cycle:
输入测试周期数后仿真程序退出,并在projects/counter/build_test/
路径下生成.vcd
波形文件。
projects/cpu
目录下存放了单周期RISC-V
CPU例程源码,源码实现了RV64I
指令addi
。可以使用下面的命令编译和仿真。
./build.sh -b -t rvcpu.v -s
输入inst.bin
和回车后程序结束运行,并在projects/cpu/build_test/
路径下生成.vcd
波形文件。其中inst.bin
为bin
目录下的一个RISC-V
测试程序,里面存放了3条addi
指令。
projects/cpu_diff
目录下存放了接入香山difftest框架
的单周期RISC-V
CPU例程源码,源码实现了RV64I
指令addi
。关于香山difftest框架
的详细介绍,可参考讲座-Difftest 处理器验证方法介绍。可以使用下面的命令编译和仿真。
# 编译仿真
./build.sh -e cpu_diff -d -b -s -a "-i inst_diff.bin"
# 编译仿真,并从CPU上报至difftest的时钟周期0开始输出波形
./build.sh -e cpu_diff -d -b -s -a "-i inst_diff.bin --dump-wave -b 0" -m "EMU_TRACE=1"
仿真程序运行后,终端将打印绿色的提示内容HIT GOOD TRAP at pc = 0x8000000c
。说明程序运行到自定义的0x6b
指令,并且此时存放错误码的a0
寄存器的值为0,即程序按照预期结果成功退出。关于0x6b
自定义指令作用,可参考讲座-AM运行环境介绍。如果指定输出波形,将在projects/cpu_diff/build/
路径下生成.vcd
波形文件。
projects/cpu_diff
目录下存放了通过AXI总线
接入香山difftest框架
的单周期RISC-V
CPU例程源码,源码实现了RV64I
指令addi
和AXI总线
读逻辑。可以使用下面的命令编译和仿真。
./build.sh -e cpu_axi_diff -d -s -a "-i inst_diff.bin --dump-wave -b 0" -m "EMU_TRACE=1 WITH_DRAMSIM3=1" -b
在oscpu
目录下使用命令可以通过gtkwave
查看输出的波形,其中xxx
表示例程名。
# 未接入difftest
./build.sh -e xxx -w
# 接入difftest
./build.sh -e xxx -d -w
在实现了能够运行所有cpu-tests
和riscv-tests
测试用例的指令后,可以通过以下命令对CPU进行一键回归测试。该命令会将bin
目录下的所有.bin
文件作为参数来调用接入了香山difftest框架
的仿真程序,其中xxx
表示例程名。
# 未接入AXI总线
./build.sh -e xxx -b -r
# 接入AXI总线
./build.sh -e xxx -b -r -m "WITH_DRAMSIM3=1"
通过测试的用例,将打印PASS
。测试失败的用例,打印FAIL
并生成对应的log文件,可以查看log文件来调试,也可以另外开启波形输出来调试。