FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Google RISC-V DVをVivado Simulatorで動かす方法はあるか?

Vivado Simulator は 2019.2 から UVM をサポートしているらしい。つまり、GoogleRISC-Vランダムパタンジェネレータのriscv-dvはVivadoで使うことができるのだろうか?オフィシャルにはサポートはされていないが、コマンドラインをいろいろ変えることで使えるようになるかもしれない。やってみよう。

github.com

ざっくりと動かし方だが、リポジトリをダウンロードして以下のようにすればパタンを生成できるらしい。以下は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の中でunqiueshuffleが使えない。これはショックだ。

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が終了しないのでそもそも動作しない。やっぱり無理なのかなあ...