CVA6 Ubuntu实例化仿真
CVA6 Ubuntu实例化仿真
环境:Ubuntu24.04
参考仓库:openhwgroup/cva6
内容参考:CVA6 Ubuntu Demo
构建CVA6 APU
1.拉取仓库并初始化子模块
当前目录~/
1 | |
2.GCC工具链构建
当前目录~/
磁盘空间:构建和安装裸机工具链大约需要3.5 GB的磁盘空间源代码。
1 | |
3.配置相应环境
当前目录~/cva6/util/toolchain-builder
1 | |
4.验证CVA6仿真链路
当前目录~/cva6
使用smoke-tests-*.sh系列快速验证指令生成器(corev-dv)+ CVA6 仿真链路的可用性
1 | |
5.运行CVA6仿真
当前目录~/cva6
CVA6的模拟通过verif/sim/cva6.py使用
环境变量DV_SIMULATORS允许你指定使用哪个模拟器
1 | |
在这一步执行时发现,不明原因导致Verilator并没有安装在对应的目录下,导致报错。最简单的解决方案是构建一个symbolic link。
1 | |
最后,在cva6/verif/sim/out_data/veri-testharness_sim目录下可以看到仿真输出的文件。
复盘
问题
从
log来看,verif/regress/smoke-gen_tests.sh由corev-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实例化仿真/