Verilatorを使って簡単RTLシミュレーション
本記事は HDL Advent Calendar 2022 の 6日目の記事です。
ハードでロックな皆さまは自宅でもRTLシミュレーションしたいと思っているはずです。
前日の記事は Vivado Simulatorだったので、本日は Verilator記事になります。
本記事の要約
Verilator v5で、とてもお手軽になりました。
Verilatorの導入障壁
個人的には Verilatorの嫌な制限としてタイミング指定(#10;
)の記述が出来ないことがありました。
テストベンチでクロック生成したい時にこんな感じで書けないんですよね。
always begin #(50ns / 2); clk <= ~clk; end
なので、SystemC側でクロック生成したりしてました。(メンドクサイ)
またリセット解除なども非同期で行いたかったので、時間指定で制御したかったのです。
Verilator v5リリース
嬉しい改善だったので、早速試しました。
しかも、--binary
オプションでより手軽になってるじゃありませんか!
ということで、昔SystemCで作ってたやつを改造して SystemVerilogのみで作ってみました。(即席で作ったので細かいところは気にしないで頂けるとタスカリマス)
01_apb ├ ─ ─ Makefile ├ ─ ─ README.md ├ ─ ─ rtl │ ├ ─ ─ clk_gate.sv │ ├ ─ ─ dut_reg.sv │ └ ─ ─ dut_top.sv └ ─ ─ tb ├ ─ ─ apb_if.sv └ ─ ─ tb_top.sv
- 実行
$ git clone https://github.com/Kocha/try_verilator.git $ cd try_verilator/01_apb $ make # : 省略 ./obj_dir/run.x Start simulation. Release resetn : 0.425 us Set wakeup : 1.225 us End simulation : 3.325 us - tb/tb_top.sv:76: Verilog $finish
という感じで、動くかと思います。
波形を確認したい場合は waves.vcd
ファイルが生成されるはずで、
波形Viewerで確認してみてください。
まとめ
Verilator v5になり簡単なテストベンチを作って、すぐRTLシミュレーションができるようになったんじゃないかと思います。
まだまだ文法的にサポートしていないものもあります*1 が、全然使えると思います!
最後に
まだまだ HDL Advent Calendar 2022 空きがありますので是非参加してみてください。
*1:コメントにしてますので探してみてください