CVA6 Ubuntu实例化仿真

CVA6 Ubuntu实例化仿真

环境:Ubuntu24.04
参考仓库:openhwgroup/cva6
内容参考:CVA6 Ubuntu Demo

构建CVA6 APU

1.拉取仓库并初始化子模块

当前目录~/

1
2
3
4
5
6
7
8
sudo apt install git

git clone https://github.com/openhwgroup/cva6.git

cd cva6

git submodule update --init --recursive

2.GCC工具链构建

当前目录~/

磁盘空间:构建和安装裸机工具链大约需要3.5 GB的磁盘空间源代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt-get install autoconf automake autotools-dev curl git libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool bc zlib1g-dev


mkdir cva6toolchain

# user 替换为你的用户名
export RISCV=/home/user/cva6toolchain

INSTALL_DIR=$RISCV

bash get-toolchain.sh

cd ./cva6/util/toolchain-builder

bash get-toolchain.sh

bash build-toolchain.sh $INSTALL_DIR

3.配置相应环境

当前目录~/cva6/util/toolchain-builder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt install cmake

sudo apt-get install help2man device-tree-compiler

cd ~/cva6

# 安装你的Ubuntu对应的python版本
sudo apt install python3.12-venv

python3 -m venv cva6

source ./cva6/bin/activate

pip3 install -r verif/sim/dv/requirements.txt

4.验证CVA6仿真链路

当前目录~/cva6

使用smoke-tests-*.sh系列快速验证指令生成器(corev-dv)+ CVA6 仿真链路的可用性

1
2
3
4
export DV_SIMULATORS=veri-testharness,spike


bash verif/regress/smoke-gen_tests.sh

5.运行CVA6仿真

当前目录~/cva6

CVA6的模拟通过verif/sim/cva6.py使用

环境变量DV_SIMULATORS允许你指定使用哪个模拟器

1
2
3
4
5
6
7
8
9
10
11
12
13
source verif/sim/setup-env.sh

export DV_SIMULATORS=veri-testharness

cd ./verif/sim

python3 cva6.py --target cv32a60x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml \
--c_tests ../tests/custom/hello_world/hello_world.c \
--linker=../../config/gen_from_riscv_config/linker/link.ld \
--gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib \
-nostartfiles -g ../tests/custom/common/syscalls.c \
../tests/custom/common/crt.S -lgcc \
-I../tests/custom/env -I../tests/custom/common"

在这一步执行时发现,不明原因导致Verilator并没有安装在对应的目录下,导致报错。最简单的解决方案是构建一个symbolic link

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd ../../tools/

ln -s ./verilator-v5.008 ./verilator

cd ../verif/sim/

python3 cva6.py --target cv32a60x --iss=$DV_SIMULATORS --iss_yaml=cva6.yaml \
--c_tests ../tests/custom/hello_world/hello_world.c \
--linker=../../config/gen_from_riscv_config/linker/link.ld \
--gcc_opts="-static -mcmodel=medany -fvisibility=hidden -nostdlib \
-nostartfiles -g ../tests/custom/common/syscalls.c \
../tests/custom/common/crt.S -lgcc \
-I../tests/custom/env -I../tests/custom/common"

最后,在cva6/verif/sim/out_data/veri-testharness_sim目录下可以看到仿真输出的文件。

复盘

问题

  • log来看,verif/regress/smoke-gen_tests.shcorev-dv自动生成默认指定了目标架构为cv32a65x,该路径下还存在可指定架构的测试文件。

  • 如果不使用symbolic link的方案,直接执行install-verilator.sh也可自动安装。但该方案暂时还未试验,有效性未知。

  • 仿真输出的日志文件只有汇编/机器码和大量的警告,但并没有看到 printf 语句被正确执行。官方仓库似乎给出了解决方案——使用RISC-V代理内核进行模拟,但目前在执行bash verif/regress/veri-testharness-pk-tests.sh的过程会莫名退出。

关于verif/sim/cva6.py模拟的使用

一、基础配置类

参数 全称/简写 核心作用 示例/说明
-h/--help 帮助 打印参数说明并退出 无额外参数,仅查看帮助
--target 目标架构 指定预定义的 RISC-V 架构目标 --target rv32imc(32位IMC架构)、--target rv64gc(64位GC架构)
-o/--output 输出目录 指定测试产物的输出目录 -o test_output(结果放到test_output目录)
-tl/--testlist 测试列表 指定回归测试的配置文件 -tl cva6_base_testlist.yaml(加载预定义测试列表)
-tn/--test 测试名称 指定执行的单个测试/所有测试 -tn riscv_load_store_test-tn all
-i/--iterations 迭代次数 覆盖测试列表的迭代次数 -i 5(每个测试执行5次,种子递增)
-si/--simulator 仿真器 指定RTL仿真器(默认VCS) -si verilator(用Verilator)、-si vcs(用VCS)
--iss 参考模拟器 指定RISC-V指令集参考模拟器 --iss spike(用Spike对比)、--iss ovpsim

二、测试生成/编译/仿真选项

参数 核心作用 示例/说明
--co 仅编译,不运行仿真 快速校验编译链路
--cov 使能功能覆盖率收集 用于测试覆盖度分析
--so 仅仿真,跳过生成/编译 复用已有编译文件,快速重跑
--cmp_opts 传递编译参数给测试生成器 --cmp_opts "-O2"(给GCC加O2优化)
--sim_opts 传递参数给RTL仿真器 --sim_opts "+UVM_VERBOSITY=UVM_HIGH"(提高日志等级)
--gcc_opts 传递参数给RISC-V GCC编译器 --gcc_opts "-march=rv32imc -mabi=ilp32"
-s/--steps 指定仅执行部分测试步骤 -s gen,gcc_compile(仅生成+编译)
--lsf_cmd 指定集群调度命令 大规模测试时提交到集群(本地执行留空)

三、ISA/架构定制类

参数 核心作用 示例/说明
--isa 指定RISC-V基础ISA子集 --isa rv32im(32位IM指令集)
--priv 指定特权级模型 --priv m(仅M模式)、--priv sv39(SV39虚拟内存)
-m/--mabi 指定编译的ABI -m ilp32(32位ILP32 ABI)、-m lp64(64位LP64 ABI)
--isa_extension 指定扩展指令集 --isa_extension "zba,zbb,zcb"(启用Z系列扩展)
--spike_params 传递参数给Spike模拟器 --spike_params "--hartids=0"(指定hart ID)

四、定向测试指定类(手工测试用)

参数 核心作用 示例/说明
--asm_tests 指定手工编写的汇编测试文件 --asm_tests tests/custom/hello_world.S
--c_tests 指定手工编写的C测试文件 --c_tests tests/custom/hello_world.c
--elf_tests 指定已编译的ELF可执行文件 --elf_tests build/hello_world.elf

五、随机种子控制类(生成式测试核心)

参数 核心作用 约束/示例
--start_seed 起始种子,后续迭代递增 不能与--seed/--seed_yaml混用;--start_seed 100
--seed 固定种子,仅执行1次迭代 隐含--iterations=1;不能与其他种子参数混用;--seed 12345
--seed_yaml 复用之前测试的种子文件 隐含--iterations=1--seed_yaml seedlist.yaml

六、调试/辅助类

参数 核心作用 示例/说明
-v/--verbose 打印详细执行日志 调试时开启
--noclean 保留上一次测试的输出文件 便于对比多次测试结果
-d/--debug 生成调试命令的日志文件 -d debug.log(命令记录到debug.log)
--stop_on_first_error 遇错即停 快速定位问题,无需执行完所有测试
--verilog_style_check 执行Verilog风格校验 规范代码格式,常用于CI流程

七、其他定制类

参数 核心作用 示例/说明
--iss_yaml 指定参考模拟器的YAML配置 --iss_yaml cva6.yaml(适配CVA6的Spike配置)
--simulator_yaml 指定RTL仿真器的YAML配置 --simulator_yaml simulator.yaml
-ct/--custom_target 指定自定义架构目标目录 适配非预定义架构时使用
-l/--linker 指定自定义链接脚本 -l custom_link.ld(定制内存布局)

CVA6 Ubuntu实例化仿真
http://ruak.github.io/2026/01/23/CVA6-Ubuntu实例化仿真/
作者
HUANGDAN
发布于
2026年1月23日
许可协议