lynxeyedの電音鍵盤

MBDとFPGAと車載で使うデバイスの備忘録

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 ../
cd KyogenRV/
make clean
make riscv-tests

これでテストコードのhex生成からリグレッションテストまで一貫して行います。終了するまで3分ほどかかりました。長い。
ちょっと工夫しないとなぁ。

IntelliJGUIで実行すると便利

IntelliJ IDEAユーザの方はmake riscv-testsするのではなくterminalで

make tester-gen

すると、テストコード生成までで終えてくれます。あとはGUIで行う方がpass/failが分かりやすいと思います。
/src/test/scala/TestCoreAll.scalaが自動生成されたコードです。
下図のようにクリックし、[Run TestCoreAll]を選択します。


f:id:Lynx-EyED:20200715074632p:plain

実行中。プログレスバーも出て進行度がわかります。


f:id:Lynx-EyED:20200715074741p:plain

リグレッションテストがどこでfailしたかも一目瞭然。(下図の場合はfence.i命令テストでエラー)


f:id:Lynx-EyED:20200715074900p:plain
最終的に48個中5個failしています。

f:id:Lynx-EyED:20200715075040p:plain
修正していきます。