FPGA開発日記

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

RISC-Vのランダムテストriscv-tortureを試す

f:id:msyksphinz:20180909010643p:plain

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)