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:コメントにしてますので探してみてください