Chisel3を始めるにあたって(2/2)
scalaでHDLが記述できるライブラリの導入
前回までの記事で、Compressorのscala上での実装について解説した。今回はscala上でのテスト方法、verilogの生成方法、verilogでの検証について解説する。
scalaでのテスト
chiselにはテストをするためのツールセットも用意されている。今回はScalaTestと合わせて使って、Compressorが正しく振る舞っているのかテストしてみる。
ScalaTestの導入
前回build.sbt
を記載した際に一緒に追加しているため、sbt上でtest
と打つだけで実行できる。
テストの記述
/src/test/scala/audio/CompressorSpec.scala
※ 2019/03/19追記:ChiselFlatSpecを継承させるのが良い
例によって解説していく
ScalaTest
scalaはとにかくDSLがすごいので、scalaTestも文章のように書ける。詳しくはscalatestの仕様を参照。
FlatSpecに関しては以下のような雛形である。
PeekPokeTester
これはchiselで作成したモジュールに何かしらの入力やクロックを与え、出力値を観測するテストセットである。
使用にあたっては、Moduleを駆動するDriverとセットで使用するらしい。
3重ループを組んでややこしくしているだけなので、要所だけ抜き出した。入力を与え、クロックを駆動し、出力値を確認するだけである。
テストは可能な限りキチンと書くべきである。特にこの後動かなくなった場合に切り分けが大変になりことが想定できるからである。(最適化、使い方、変換後のverilogに問題がある、chisel上での設計に問題があるなど)
これで$ sbt test
がきちんと通ることを確認したら、いよいよverilogを出力する。
verilog出力
Compressor.scala
の末尾に以下の記述を増やす。処理としては実行可能なプログラムにして、verilogを生成するプログラムを書く。
class Compressor
とかぶっていると感じるかもしれないが、scalaではいわゆるstaticなものはobjectに定義する。
extends App
はそのままエントリポイントになる。
chisel3.Driver.execute
でverilogを生成。
これで、プロジェクトルートにCompressor.v
が生成される。
verilogシミュレーション
生成されたverilogが正しく動作しているか、波形確認も含めて実施。
テストベンチ作成
まずはテストベンチを記述。詳細は解説しないが、scalaでのテストと同じように入力を変化させながら出力の振る舞いを確認するようにしている。
$dumpfile
と$dumpvars
であとで波形確認したいデータをvcdファイルに出力しておく。
/verilog/Compressor_tb.v
テストベンチ実行
icarus-verilogで実行してみる。
これでa.out
というシミュレーション実行ファイルが作成されるので、vvp
で実行する。
シミュレーションを実行すると、テストベンチに記述したとおり.vcdファイルが作成される。
波形表示
.vcdファイルはgtkwaveでそのまま開ける。テストベンチで予期したとおりの振る舞いになっているか確認する。
なおmacOSの最新の場合、署名問題で起動できない場合があるので設定→セキュリティをイジる必要があった。
まとめ
駆け足ながら一通りのフローを舐めた。おそらく自分で見返すことが訪れると思う。
ともあれ新規参入者にはかなりハードルが高いと感じる。HLSでさえもHDL設計能力が求められるのに、Chiselがそれから逃げられるツールではないことは自明である。(HLSの場合、最適化しやすいC言語を書くようなスキルが要求される)
しかしながらaltHDLとしては、scalaでそのままテストが書けることが何より設計を楽にするのではないかと感じる。
verilatorもあるので好みの問題かもしれないが…。個人的には書いた言語と同じ言語でテストをしたいのである。