2023年2月5日日曜日

Verilator使ってみた


https://www.veripool.org/verilator/より引用

Verilog初心者の中の人です。今回はVerilogシミュレーションツールであるVerilatorをお試ししてみました。またこのツールの売りであるSim実行速度を簡易的に計測したので、併せて紹介します。




1.Verilatorとは何か

VerilatorはVerilog/SystemVerilog向けのRTLシミュレーションシステムの一種になります。LGPL3/Artistic License2.0で配布されており商用利用も可です。この手のツールは大体がライセンス必須のクローズドソースであることが多いですが、Verilatorはその点で異なったものになります。Verilatorの売りはSimの実行速度であり、有償のツールと同等かそれ以上の性能が出ると主張しています[1]。

2.お試ししてみる



今回は簡単なUART送信回路を作成し、そのテストベンチをVerilatorで書いてみました。
今回はFPGA開発日記さんの記事を参考にしながら、.vcdの波形出力まで行うテストベンチを書きました。またUART送信回路自体は、FPGA上での実機動作が確認できているものを流用しました。書いてみた感想としてはTB本体の準備はそこまで差がないのですが、Verilator(C++)の方が入力するデータの準備や出てきたデータを料理が楽でした。また実行時間もVerilogのTBを実行していた時と比べ何となく速い気がしました。

3.Verilog版TestBenchとの比較


実行時間が体感で速そうだったので、実際に計測してみました(Verilator公式でも高速実行アピールがあるので、本当だとは思っていましたが)。計測方法としては、対象回路に対して同じタイミングで信号を印加するTBをVerilogとVerilator(C++)で準備し、Simにかかった時間をパラメータごとに10回計測し均しました。計測の諸条件は以下の通りです。
  • PC:XPS13(9310)
  • CPU:Intel Corei7-1185G(3GHz)
  • RAM:16GB
  • OS:Ubuntu 20.04.5 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)
  • Icarus Verilog version 10.3
  • Verilator 5.005 devel rev v5.004-76-g5ef373500
  • g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
  • Sim内で変わるパラメータは終了ステップ数のみ(100スタートで10倍毎に計測)
  • 実行時間はLinuxのtimeコマンドで計測
  • .VCDファイル生成時間を両者ともに含む
  • コンパイラの最適化設定は両者デフォルトの状態
実測結果は以下のようになりました。

x軸実行ステップ、y軸実行時間のグラフ
(両対数グラフなことに注意)

このグラフから実行ステップ数が短いとVerilatorを使ってもそこまで高速化の恩恵が得られないのですが、ある程度以上のステップ数になるとVerilatorの方が10倍のオーダで高速に実行できそうなことが分かりました。(生データはこちら)

4.その他

不定が扱われない様子
(左:Verilog、右:Verilator)

Verilog側で出ていた出力波形の不定がVerilator側では出ていないことに気が付きました。これはVerilatorが信号を4値(0, 1, Z, X)としてではなく2値(0, 1)として扱うことに起因しているようです[2]。不定伝搬等を検出するためにはいくつかの工夫が必要だと思われます。

©2023 shts All Right Reserved.