RISC-Vの実装を作るとまずはテストパタンを生成してテストを流してみたくなるのだが、RISC-Vにはテスト用のパタンがいくつか用意されている。
RISC-V Tortureのダウンロードとインストール
RISC-V TortureのConfiguration
Tortureの生成パタンの構成を変えたいときは、config/*.config
を変更するとよいらしい。
config/default.config
torture.generator.nseqs 200 torture.generator.memsize 1024 torture.generator.fprnd 0 torture.generator.amo true torture.generator.mul true torture.generator.divider true torture.generator.segment true torture.generator.loop true torture.generator.loop_size 64 torture.generator.mix.xmem 10 torture.generator.mix.xbranch 20 torture.generator.mix.xalu 50 torture.generator.mix.fgen 10 ...
RISC-V Tortureのテスト生成
実際にテストを生成してみた。
$ make igentest java -Xmx1G -Xss8M -XX:MaxPermSize=128M -jar sbt-launch.jar 'testrun/run' OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0 [info] Loading project definition from /home/masayuki/work/riscv-torture/project [info] Set current project to torture (in build file:/home/masayuki/work/riscv-torture/) [info] Running torture.testrun.TestRunner Physical mode running:List(spike, +signature=output/test.spike.sig, output/test) running:List(spike, +signature=output/test.spike.sig, output/test) /////////////////////////////////////////////////////// // All signatures match for output/test /////////////////////////////////////////////////////// [success] Total time: 1 s, completed 2018/09/06 10:18:52
テストの中身を見てみる。アセンブラで記述してあり、ランダムパタンの様相を呈している。
// random assembly code generated by RISC-V torture test generator // nseqs = 200 // memsize = 1024 #include "riscv_test.h" RVTEST_RV64UF RVTEST_CODE_BEGIN j test_start crash_backward: RVTEST_FAIL test_start: freg_init: freg_s_init: la x1, freg_init_data flw f0, 0(x1) flw f2, 16(x1) flw f4, 32(x1) flw f10, 80(x1) flw f13, 104(x1) flw f15, 120(x1) ... pseg_0: addi x18, x0, -1973 addi x29, x0, 1316 sraiw x4, x28, 24 remw x6, x30, x30 la x5, test_memory-184 addiw x1, x30, 1106 fmul.d f24, f9, f1 slti x20, x10, 2037 sll x24, x10, x27 fmadd.d f5, f16, f9, f3 mulh x26, x22, x22 ...
output
ディレクトリが生成されていた。
$ tree output/
output/
├── Makefile
├── test
├── test.S
├── test.spike.sig
└── test.stats
テスト結果の検証については、signatureのdiffを取ってチェックするらしい。
Rocket-Chip環境でtortureテストを実施する
Rocket-Chipのリポジトリにもtortureがサブリポジトリとして格納されているので、これを使ってみよう。
cd torture
make
Verilatorでの実行が失敗するので、Makefile
を以下のように変更した。
index a85579f..8138c8b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ SBT ?= java -Xmx1G -Xss8M -XX:MaxPermSize=128M -jar sbt-launch.jar RTL_CONFIG := DefaultConfig -C_SIM := ../emulator/emulator-rocketchip-$(RTL_CONFIG) +C_SIM := ../emulator/emulator-freechips.rocketchip.system-$(RTL_CONFIG) R_SIM := ../vsim/simv-rocketchip-$(RTL_CONFIG) TEST := output/test.S OPTIONS := $(empty)
実際にテストを実行してみる。Rocket-Chipにも+signature=filename
オプションが通じるらしい。
$ make ctest java -Xmx1G -Xss8M -XX:MaxPermSize=128M -jar sbt-launch.jar 'testrun/run -c ../emulator/emulator-freechips.rocketchip.system-DefaultConfig -a output/test.S ' OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0 [info] Loading project definition from /home/masayuki/work/rocket-chip/torture/project [info] Set current project to torture (in build file:/home/masayuki/work/rocket-chip/torture/) [info] Running torture.testrun.TestRunner -c ../emulator/emulator-freechips.rocketchip.system-DefaultConfig -a output/test.S Physical mode running:List(spike, +signature=output/test.spike.sig, output/test) running:List(spike, +signature=output/test.spike.sig, output/test) running:List(../emulator/emulator-freechips.rocketchip.system-DefaultConfig, +max-cycles=10000000, +signature=output/test.csim.sig, output/test) This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1. Listening on port 46292 /////////////////////////////////////////////////////// // All signatures match for output/test /////////////////////////////////////////////////////// [success] Total time: 25 s, completed 2018/09/06 20:29:47
Nightly Testの実施
これはランダムテストを用いたリグレッションみたいなものかな?
一度に複数のテストも生成してリグレッションテストをすることができそうだ。
$ make cnight ... [warn] there was one deprecation warning; re-run with -deprecation for details [warn] one warning found [info] Running torture.overnight.Overnight -c ../emulator/emulator-freechips.rocketchip.system-DefaultConfig -g none Physical mode running:List(spike, +signature=output/test_1536233603600.spike.sig, output/test_1536233603600) running:List(spike, +signature=output/test_1536233603600.spike.sig, output/test_1536233603600) running:List(../emulator/emulator-freechips.rocketchip.system-DefaultConfig, +max-cycles=10000000, +signature=output/test_1536233603600.csim.sig, output/test_1536233603600) This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1. Listening on port 45600 /////////////////////////////////////////////////////// // All signatures match for output/test_1536233603600 /////////////////////////////////////////////////////// Physical mode running:List(spike, +signature=output/test_1536233629933.spike.sig, output/test_1536233629933) running:List(spike, +signature=output/test_1536233629933.spike.sig, output/test_1536233629933)