执行命令 bash verif/regress/dv-riscv-arch-test.sh
bash verif/regress/dv-riscv-arch-test.sh
备注, 这里我们设置了环境变量
export RISCV=RISCV_TOOLS
export DV_SIMULATORS=veri-testharness,spike
export NUM_JOBS=$(nproc)
执行输出日志
[install-verilator.sh] Entry values:
VERILATOR_BUILD_DIR=''
VERILATOR_INSTALL_DIR=''
Setting VERILATOR_INSTALL_DIR to '/cva6/tools/verilator-v5.008'...
Setting VERILATOR_BUILD_DIR to '/cva6/tools/verilator-v5.008/build-v5.008'...
Verilator already installed in '/cva6/tools/verilator-v5.008'.
Spike already installed in '/cva6/tools/spike'.
Spike already installed in '/cva6/tools/spike'.
Repo: https://github.com/riscv-non-isa/riscv-arch-test
Branch: main
Hash: a5a49fc9f244192649e57fe61b4513d9bc39b1e3
Spike dir: /cva6/verif/core-v-verif/vendor/riscv/riscv-isa-sim
Executing command: python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml --target cv64a6_imafdc_sv39 --iss_yaml=cva6.yaml --iss=veri-testharness,spike --issrun_opts=+tb_performance_mode+debug_disable=1+UVM_VERBOSITY=UVM_NONE --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld
执行python3 cva6.py调用顺序
Executing command: python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml --target cv64a6_imafdc_sv39 --iss_yaml=cva6.yaml --iss=veri-testharness,spike --issrun_opts=+tb_performance_mode+debug_disable=1+UVM_VERBOSITY=UVM_NONE --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld
以下是执行该脚本时的主要函数调用顺序:
-
main()
:- 初始化全局变量。
- 获取当前工作目录并解析命令行参数。
- 加载配置文件。
- 设置
issrun_opts
和log_format
。 - 记录 UVM seed。
- 设置日志记录器。
- 检查工具版本。
- 创建日志文件处理程序。
- 创建输出目录。
- 添加 ISA 扩展。
- 如果设置了
verilog_style_check
参数,则运行 Verilog 风格检查。
-
run_test
(如果指定了c_tests
、elf_tests
或asm_tests
参数):- 根据测试类型(C 文件、汇编文件或 ELF 文件)编译和运行定向测试。
-
openhw_process_regression_list
(如果没有指定定向测试且未设置--co
参数):- 处理回归测试列表并获取匹配的测试。
-
gen
(如果steps
参数包含gen
或all
):get_generator_cmd
:- 设置编译和仿真命令。
do_compile
:- 编译指令生成器。
do_simulate
:- 运行指令生成器。
-
gcc_compile
(如果steps
参数包含gcc_compile
或all
):- 使用 RISC-V GCC 工具链编译汇编程序。
-
iss_sim
(如果steps
参数包含iss_sim
或all
):- 运行 ISS 仿真。
-
iss_cmp
(如果steps
参数包含iss_cmp
或all
):- 比较 ISS 仿真结果。
-
sys.exit(RET_SUCCESS)
:- 成功完成后退出程序。
参数解释
--testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml
:指定回归测试列表文件。--target=cv64a6_imafdc_sv39
:指定目标配置。--iss_yaml=cva6.yaml
:指定 ISS 配置文件。--iss=veri-testharness,spike
:指定使用的 ISS。--issrun_opts=+tb_performance_mode+debug_disable=1+UVM_VERBOSITY=UVM_NONE
:指定 ISS 运行选项。--linker=../tests/riscv-arch-test/riscv-target/spike/link.ld
:指定链接器文件。
总结
主要函数调用顺序从 main
函数开始,根据输入参数和配置文件逐步调用其他函数以完成编译、仿真和结果比较等任务。
main函数
函数调用顺序分析
下面我们将从 main
函数开始,逐步分析在指定输入参数情况下 cva6.py
脚本中各个函数的调用顺序。
输入参数
python3 cva6.py --testlist=../tests/testlist_riscv-arch-test-cv64a6_imafdc_sv39.yaml --target=cv64a6_imafdc_sv39 --iss_yaml=cva6.yaml --iss=veri-testharness,spike --issrun_opts=+tb_performance_mode+debug_disable=1+UVM_VERBOSITY=UVM_NONE --linker=../tests/riscv-arch-test/riscv-target/spike/link.ld
main 函数
def main():
try:
global issrun_opts
global test_iteration
global log_format
cwd = os.path.dirname(os.path.realpath(__file__))
args = parse_args(cwd)
load_config(args, cwd)
if args.axi_active == "yes":
args.issrun_opts = args.issrun_opts + " +uvm_set_config_int=*uvm_test_top,force_axi_mode,1"
elif args.axi_active == "no":
args.issrun_opts = args.issrun_opts + " +uvm_set_config_int=uvm_test_top,force_axi_mode,0"
if args.gen_sv_seed > 0 and args.sv_seed != "1":
logging.error('You cannot use gen_sv_seed and sv_seed options at the same time')
if args.gen_sv_seed > 0:
args.issrun_opts = args.issrun_opts + " +ntb_random_seed_automatic"
log_format = 1
elif args.gen_sv_seed == 0:
args.issrun_opts = args.issrun_opts + " +ntb_random_seed=" + args.sv_seed
args.gen_sv_seed = 1
log_format =