Chiselを使ったRISC-Vの勉強(11. riscv-testsの自動化)
riscv-testsのリグレッションテストコードを自動生成
あまり記事にするほど内容は厚くないのですが備忘録として。
一つのテストコードをpassできても、今までpassできていたものがfailしてしまうロジックを埋め込んでしまう可能性は否めません。
全てのリグレッションテストを通しでpassさせる必要があります。今回の構成の場合、マシンモード/メモリウォーキング非搭載/32bit整数のみ/圧縮命令なしなのでrv32ui-p-/rv32mi-p-に対応すれば良く、テストコードは少なめの48個です。
まぁ比較的少ないのですが、手動で書いているとしんどいのです。
"rv32ui-p-add.hex test using Driver.execute" should "be pass test." in { iotesters.Driver.execute(Array(), () => new CpuBus())(testerGen = c => { CpuBusTester(c, "src/sw/rv32ui-p-add.hex") }) should be (true) }
こんな感じのコードをリグレッションテスト数だけ作り、今後64bit拡張、Sv39搭載なども考えているのでテストは増大することになります。今のうちにpythonで自動化することにしました。
参考にさせていただいたのはid:msyksphinz氏のブログ。
msyksphinz.hatenablog.com
方針を決めていきます。
- 手作業で頑張る部分
- riscv-testsをgit cloneし、kyogenrvのプロジェクト内にmakeするところまでは手動(これは1回実行すればいいはずなので)
- 自動化した部分
- フォルダ内のrv32ui-p-* rv32mi-p-*で始まるelfファイルを走査し、hexファイルを作る
- 作成したhexファイルのScalaTestコードを自動生成
- テストコード実行
使い方
readmeには記載したのですが、改めて。
- kyogenrvを導入
git clone http://github.com/panda5mt/KyogenRV
- riscv-testsを導入します
git clone https://github.com/riscv/riscv-tests cd riscv-tests git submodule update --init --recursive
- リンカスクリプトの修正
nano env/p/link.ld
プログラム (.text)セクションが0x00000000
から開始されるように修正
SECTIONS { . = 0x00000000; # -> ここを修正 .text.init : { *(.text.init) } . = ALIGN(0x1000); .tohost : { *(.tohost) } . = ALIGN(0x1000); .text : { *(.text) } . = ALIGN(0x1000); .data : { *(.data) } .bss : { *(.bss) } _end = .; }
- link.ldを上書きしriscv-testsをビルド
autoconf ./configure --prefix=<KyogenRVsプロジェクトのルートディレクトリのフルパス>/tests/ make make install cd ../
- KyogenRVのプロジェクトディレクトリに戻ります
cd KyogenRV/ make clean make riscv-tests
これでテストコードのhex生成からリグレッションテストまで一貫して行います。終了するまで3分ほどかかりました。長い。
ちょっと工夫しないとなぁ。
IntelliJのGUIで実行すると便利
IntelliJ IDEAユーザの方はmake riscv-tests
するのではなくterminalで
make tester-gen
すると、テストコード生成までで終えてくれます。あとはGUIで行う方がpass/failが分かりやすいと思います。
/src/test/scala/TestCoreAll.scala
が自動生成されたコードです。
下図のようにクリックし、[Run TestCoreAll]を選択します。
実行中。プログレスバーも出て進行度がわかります。
リグレッションテストがどこでfailしたかも一目瞭然。(下図の場合はfence.i命令テストでエラー)