Vivado Simulator は 2019.2 から UVM をサポートしているらしい。つまり、GoogleのRISC-Vランダムパタンジェネレータのriscv-dvはVivadoで使うことができるのだろうか?オフィシャルにはサポートはされていないが、コマンドラインをいろいろ変えることで使えるようになるかもしれない。やってみよう。
ざっくりと動かし方だが、リポジトリをダウンロードして以下のようにすればパタンを生成できるらしい。以下はSynopsys社のVCSを使う場合。
python3 run.py --test riscv_arithmetic_basic_test --simulator vcs
このVCSの定義は、yaml
で記述されている。
riscv-dv/yaml/simulator.yaml
compile: cmd: - "vcs -file <cwd>/vcs.compile.option.f +incdir+<setting> +incdir+<user_extension> -f <cwd>/files.f -full64 -l <out>/compile.log -LDFLAGS '-Wl,--no-as-needed' -CFLAGS '--std=c99 -fno-extended-identifiers' -Mdir=<out>/vcs_simv.csrc -o <out>/vcs_simv <cmp_opts> <cov_opts> " cov_opts: > -cm_dir <out>/test.vdb sim: cmd: > <out>/vcs_simv +vcs+lic+wait <sim_opts> +ntb_random_seed=<seed> <cov_opts> cov_opts: > -cm_dir <out>/test.vdb -cm_log /dev/null -cm_name test_<seed>_<test_id>
で、これにVivadoのオプションを付ければどうだろう、という話だ。Vivadoのコンパイルはxvlog
, xelab
, xsim
の3段階になっているので、これらを実行するようにオプションを追加してみる。
- tool: vivado compile: cmd: - "xvlog -i <setting> -i <user_extension> -i /home/msyksphinz/work/riscv/riscv-dv/src -i /home/msyksphinz/work/riscv/riscv-dv/test -L uvm -f <cwd>/files.f -sv -define UVM_REGEX_NO_DPI --log <out>/compile.log <cmp_opts>" - "xelab riscv_instr_gen_tb_top -relax -s top -timescale 1ns/1ps"
で、これでコンパイルをしてみても上手く行かない。通常のEDAツールとVivadoはオプション体系がかなり違うからだ。
index 9945943..0fbc226 100644 --- a/files.f +++ b/files.f @@ -13,8 +13,8 @@ // limitations under the License. // HEADERS -+incdir+${RISCV_DV_ROOT}/src -+incdir+${RISCV_DV_ROOT}/test +// +incdir+${RISCV_DV_ROOT}/src +// +incdir+${RISCV_DV_ROOT}/test
ファイルリストの中で+incdir
が使用できない。
UVMの中でunqiue
とshuffle
が使えない。これはショックだ。
diff --git a/src/riscv_amo_instr_lib.sv b/src/riscv_amo_instr_lib.sv index d42d87c..3b8abe5 100644 --- a/src/riscv_amo_instr_lib.sv +++ b/src/riscv_amo_instr_lib.sv @@ -39,7 +39,7 @@ class riscv_amo_base_instr_stream extends riscv_mem_access_stream; foreach (rs1_reg[i]) { !(rs1_reg[i] inside {cfg.reserved_regs, reserved_rd, ZERO}); } - unique {rs1_reg}; + // unique {rs1_reg}; }
diff --git a/src/riscv_asm_program_gen.sv b/src/riscv_asm_program_gen.sv index 96cca5f..4318e3b 100644 --- a/src/riscv_asm_program_gen.sv +++ b/src/riscv_asm_program_gen.sv @@ -302,7 +302,7 @@ class riscv_asm_program_gen extends uvm_object; virtual function void insert_sub_program(ref riscv_instr_sequence sub_program[], ref string instr_list[$]); - sub_program.shuffle(); + // sub_program.shuffle(); foreach(sub_program[i]) begin sub_program[i].post_process_instr(); sub_program[i].generate_instr_stream(); @@ -1584,7 +1584,7 @@ class riscv_asm_program_gen extends uvm_object; idx++; end end - instr_stream.shuffle(); + // instr_stream.shuffle(); endfunction
このあたりを修正すると、とりあえずはxelab
が動くようになる。
python3 run.py --test riscv_arithmetic_basic_test --simulator vivado
Vivado Simulator 2020.2 Copyright 1986-1999, 2001-2020 Xilinx, Inc. All Rights Reserved. Running: /opt/Xilinx/Vivado/2020.2/bin/unwrapped/lnx64.o/xelab riscv_instr_gen_tb_top -relax -s top -timescale 1ns/1ps Multi-threading is on. Using 6 slave threads. Starting static elaboration Pass Through NonSizing Optimizer WARNING: [VRFC 10-3705] select index 62 into 'fd_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:647] WARNING: [VRFC 10-3705] select index 62 into 'fd_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:650] WARNING: [VRFC 10-3705] select index 62 into 'fs2_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:653] WARNING: [VRFC 10-3705] select index 62 into 'fs2_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:656] WARNING: [VRFC 10-3705] select index 62 into 'fs1_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:659] WARNING: [VRFC 10-3705] select index 62 into 'fs1_value' is out of bounds [/home/msyksphinz/work/riscv/riscv-dv/src/riscv_instr_cover_group.sv:663] ...
が、どうもxelabの処理が終了しないようだ。処理があまりにも重たいのか、オプションが足りないのだろうか?
ちなみに、xsim
の実行にもひと手間必要だ。Vivadoのxsim
では+
オプションが使用できないからだ。そこで、-testplusargs
にすべて切り替えていく。
xsim -R top -testplusarg UVM_TESTNAME=riscv_instr_base_test -testplusarg num_of_tests=2 -testplusarg start_idx=0 -testplusarg asm_file_name=out_2021-03-06/asm_test/riscv_arithmetic_basic_test --log out_2021-03-06/sim_riscv_arithmetic_basic_test_0.log -testplusarg instr_cnt=10000 -testplusarg num_of_sub_program=0 -testplusarg directed_instr_0=riscv_int_numeric_corner_stream,4 -testplusarg no_fence=1 -testplusarg no_data_page=1 -testplusarg no_branch_jump=1 -testplusarg boot_mode=m -testplusarg no_csr_instr=1 -runall
とりあえずこれでコマンド自体にエラーは無くなるが、xelab
が終了しないのでそもそも動作しない。やっぱり無理なのかなあ...