RISC-Vの実装を作るとまずはテストパタンを生成してテストを流してみたくなるのだが、RISC-Vにはテスト用のパタンがいくつか用意されている。
RISC-V Tortureのダウンロードとインストール
RISC-V TortureのConfiguration
Tortureの生成パタンの構成を変えたいときは、config/*.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
テストの中身を見てみる。アセンブラで記述してあり、ランダムパタンの様相を呈している。
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)