電子回路わからん日記

にゃーんと言いながら電子回路いじってます

Verilator、(Linterとして)はじめました。

どもです。

これから暖かくなるので、

Verilator(冷やし中華)、はじめました。w


Verilatorとは

Veripoolが開発するオープンソースのVerilog/SystemVerilogシミュレータです。

www.veripool.org

テストベンチやモジュールをマルチスレッド(!)のC++コードに変換(公式ではこの変換を"Verilate"と呼んでいます)し、C++コンパイラで実行可能形式にコンパイル後、実行することで高速なシミュレーションを実現しているのがウリのようです。

名だたる半導体メーカー(WD、Intel、NXPなど)でも使用されており、Chips AllianceやLinux Foundationから支援を受けているなど、業界ではかなり有名な様子。

公式では「Synopsys(VCS)/Siemens(Questa/ModelSim)/Cadence(Xcelium/Incisive/NC-Sim)と合わせた4大シミュレータの一つ」と豪語しています(本当か?)

veripool.org

AUDIY自身、Verilatorの勉強会を数年前に受けたことがあり、個人的には興味を持っていましたが当時はC++での記述が大量に出てきて正直「これならシミュレーションはIcarus VerilogとかQuartus等に付属しているやつで良いかな」という印象でした。

connpass.com


導入方法

主に3通りの導入方法があります。

veripool.org

それぞれの導入方法でのメリット・デメリットは以下の通りとなります。

パッケージマネージャを使用する

メリット
  • 確実に安定版が導入できる
  • 依存関係も合わせてインストールしてくれる
デメリット

gitからソースコードを入手しビルドする

メリット
  • 常に最新版を導入できる
  • パッケージマネージャで自動的にバージョンアップされないので特定のバージョンを長く使用可能
デメリット
  • 依存関係を自分で調べて導入しておく必要がある
  • OSや依存関係とのバージョンの整合性が取れないときにインストールに失敗する場合がある
  • 最新版導入のたびにビルドの必要がある

Dockerを使用する

メリット
  • ビルドせずに最新版を導入可能
  • 常に最新版を導入できる
  • コンテナを利用しているので依存関係を気にしなくて良い
デメリット
  • Dockerの知識が必要
  • Verilatorでは自前の環境より動作に若干時間がかかる
  • VerilatorではVSCodeとの連携が困難

今回はVSCodeのプラグインと連携させてLinter機能を使いたかったのと、AUDIYが使っているUbuntu 22.04 LTSではパッケージマネージャで配布されてるVerilatorのバージョンが4と古いので、gitからソースコードを入手しビルドしたいと思います。


ビルド方法

今回はWindowsマシン上にWSL2 + Ubuntu 22.04を構築して導入したいと思います。

WSL2の導入はこの記事が詳しいと思います。

www.aise.ics.saitama-u.ac.jp

Ubuntuが導入できたらあとは以下のページの内容の通りに依存関係を導入してインストールすれば問題ないと思います。

Ubuntu 22.04の場合では「zlibcが無い」とエラーが出ますが、その場合は無視して良いです。

veripool.org

ちなみにですが、

それ以前はC++でテストベンチ書く必要があったようですね・・・・
ちなみにC++テストベンチのサンプルコードはカオスです。

dora.bk.tsukuba.ac.jp


動かしてみる

テストベンチから実行形式を吐き出してみます。
とりあえずでてきた警告は無視させています。

github.com

 

  • verilator --cc --binary --timing --trace --trace-params --trace-structs --trace-underscore -Wno-TIMESCALEMOD -Wno-WIDTHTRUNC +1364-2005ext+v SDPRAM_SINGLECLK_tb.v

 

成功するとobj_dirというディレクトリ内に実行ファイルができますので、メモリ初期化ファイル(ram_init_file.mem)を同一ディレクトリに置いて

  • ./VSDPRAM_SINGLECLK_tb

 

vcdファイルが作成されるので、gtkwaveで読み込めば

 

vcd出力の際にオプションが必要になったり、一部のVerilog記述のシミュレーションが非対応だったり、

msyksphinz.hatenablog.com

Warningが出力される時点で実行形式は生成されない(厳しいな・・・・)ので、単純なシミュレーションだけであればIcarus Verilogの方が実行オプションも少なく使いやすい印象です。

github.com

 

WarningやErrorは結構細かい内容が網羅されている(悪く言えば制限が強い)ので、AUDIYのような「コーディングルールがフラフラしがち」な人には良い矯正ツールだと思います。


そこで考えた

「これ、Linterとして使えないか・・・?」

そこでAUDIYが使っているVSCodeのVerilogプラグインを調べてみると・・・・

marketplace.visualstudio.com

・・・・・ありました。

Verilatorと連携してVSCode内のLinterとして使えます!

もう少し設定を追っていきますと・・・

 

Verilatorの実行オプションを追加できたり

WSL上に構築したVerilatorを使用することもできるようです。

それではやっていきましょう。

「Verilog > Linting: Linter」を"verilator"に設定します。

「Verilog > Linting > Verilator: Arguments」に必要なオプションを追加します。
AUDIYの場合は「警告を全て出力」「遅延評価する」「Verilog記法はVerilog-2005で指定」にしました。

「Verilog > Linting > Verilator: Run At File Location」と「Verilog > Linting > Verilator: Use WSL」にともにチェックを付けます。

ではLinter実行結果を見ていきましょう。


Icarus VerilogとLint結果を比較

Icarus Verilog

なるほどなるほど・・・

"syntax error"を教えてくれるのは良いんですが何がどうダメなのか・・・

この行は問題ないのにその前の行のエラーに引っ張られてエラーになってしまっています・・・

Verilator

「"="がおかしくない?」とエラー箇所を推測しています

ここも同様ですね。「"end"周辺がおかしい」とわかります。

Icarus VerilogのLint機能にはありませんでしたが、VerilatorだとWarningも出してくれます。

「順序回路の中でブロッキング代入使ってるけど大丈夫?」というWarningです。

「ファイル末尾は行を入れておくのが推奨ですよ」とまで。かなり丁寧ですね。


ということで、VerilatorをLinterとして導入しました。

AUDIYのXには

github.com

とオススメもありましたが、こちらガチガチのSystemVerilogルールでLint(wire, reg宣言すらもWarningにするほどには)してて、Verilog主体のAUDIYにはまだまだ早い感じでした(設定ファイルを編集してLintルールを細かく設定できるのでいずれは使いこなしたい)。

WindowsのみならずLinuxマシンにも導入しているので、Linterのみならずシミュレータとしても使っていければと思います。