/oscpu-framework

A Verilator-based demo.

Primary LanguageVerilog

oscpu-framework

这是一个基于verilatorRISC-VCPU开发仿真框架。

开发前请在myinfo.txt文件中填写报名一生一芯时的学号和自己的姓名。例如:

ID=202100001
Name=张三

开发环境

操作系统:Linux Ubuntu v20.04

开发软件:verilatorgtkwave

verilator要求统一使用v4.204版本,可以从这里下载安装包。使用下面的命令安装verilatorgtkwave

# 安装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。

counter

examples/counter目录下存放了4位计数器的例程源码。可以使用下面的命令编译和仿真。

./build.sh -e counter -b -s

如果verilator安装正确,你会看到下面的输出

Simulating...
Enabling waves ...
Enter the test cycle:

输入测试周期数后仿真程序退出,并在projects/counter/build_test/路径下生成.vcd波形文件。

cpu

projects/cpu目录下存放了单周期RISC-VCPU例程源码,源码实现了RV64I指令addi。可以使用下面的命令编译和仿真。

./build.sh -b -t rvcpu.v -s

输入inst.bin和回车后程序结束运行,并在projects/cpu/build_test/路径下生成.vcd波形文件。其中inst.binbin目录下的一个RISC-V测试程序,里面存放了3条addi指令。

cpu_diff

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波形文件。

cpu_axi_diff

projects/cpu_diff目录下存放了通过AXI总线接入香山difftest框架的单周期RISC-VCPU例程源码,源码实现了RV64I指令addiAXI总线读逻辑。可以使用下面的命令编译和仿真。

./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-testsriscv-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文件来调试,也可以另外开启波形输出来调试。

扩展

一生一芯官网

会议汇总

讲座回放

RISC-V Unprivileged Spec

RISC-V Privileged Spec

cpu-tests

riscv-tests

香山difftest框架

NEMU

DRAMsim3

AXI4 specification