FPGA開発日記

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

RISC-V Compliance Task Groupのテストパタンを試す(2. 自作RISC-Vシミュレータでテストパタンを通す)

f:id:msyksphinz:20181016221815p:plain

RISC-V Foundationが公開しているテストパタンには、riscv-toolsリポジトリの中に含まれているriscv-testsテストパタンとは別に、RISC-V Compliance Task Groupのテストパタンが公開されている。

github.com

ダウンロードして試行することができる。デフオルトではriscvOVPsimが動いているようだ。

前回自作RISC-Vシミュレータを使ってテストパタンを動かす試行を少ししたのだが、テストが結構落ちてしまった。 原因を解析すると、いろいろシミュレータに設定を追加しなければならなかったり、テストの設定を変えなければならなかったり。。。 しかし、riscv-testsで落ちなかったにも関わらずriscv-complianceでは落ちたので、実装を作ったときは両方とも流してみた方が良いかもね。

テストパタンは以下のカテゴリが用意されている。

$ ls -1 riscv-test-suite/
rv32i
rv32im
rv32imc
rv32mi
rv32si
rv32ua
rv32uc
rv32ud
rv32uf
rv32ui
rv64i
rv64im

それぞれで、必要となるアーキテクチャの構成が違うので注意。例えば、rv32iはC系列の命令(16ビット長命令)は動かない前提で作ってあるので注意。

例えば、C命令がサポートされている場合は2-byte alignの場所にジャンプできるが、C命令がサポートされていないテストで2-byte alignの場所にジャンプすると例外が発生する。

m命令(設定レジスタ)のテストパタンはいまだにいくつか落ちるが、それ以外は問題なく通過するようになった。 というか、テストを通すためにオプションを新設する必要があったりしたので、それを対応した。(`--archオプションを追加した。今のところC命令とビット長しか効果が無いけど)。

github.com

usage: ./swimmer_riscv [options] ...
options:
      --max_size          Max size of log file [MB] (unsigned int [=0])
      --max               Max instructions to simulate (unsigned long [=0])
      --binfile           Binary file to simulate. (string [=])
      --hexfile           Hex file to simulate. (string [=])
      --only_info_load    Debug Info is only loaded (only enable with --binfile)
      --debug             Generate debug log
      --out               Output log filename (string [=])
      --load-dump         Dump Loaded Bin file (only enable with --binfile)
      --parallel          CPU Parallel Execution
      --init_pc           Initial Program Counter Value (string [=])
      --stop-host         Stop simulation by accessing MTOHOST
      --use-pk            Location of RISC-V Proxy Kernel (string [=])
      --arch              Support RISC-V Architecture (ex. --arch rv32imafd.../rv64imafd...) (string [=rv64imafdc])
      --trace-hier        Generate Hierarcical Trace
      --trace-out         Hierarcical Trace Output Filename (string [=])
      --vmlinux           Location of vmlinux (string [=])
      --logstart          cycle of log start (unsigned long [=0])
      --printstep         print number of steps each cycle (unsigned long [=0])
      --signature         Generate Signature and filename  (string [=])
  -v, --version           Show Version Information
  -?, --help              print this message