💡

svlint: SystemVerilog linter

2022/12/04に公開3

はじめに

svlint は自作の SystemVerilog linter です。

https://github.com/dalance/svlint

もともとは社内向けに軽量でライセンス不要な SystemVerilog の linter が欲しかったので作りました。このときの成果物が昔 SystemVerilog Advent Calendar 2020 で紹介した sv-parser と svls です。

https://qiita.com/dalance/items/2c318ef6559eed8f2dc9

https://qiita.com/dalance/items/dc721a7e22fe10b2f5d4

svlint の紹介は2019年に作ったときに一度書きましたが、最近の状況更新も兼ねて、再度紹介します。

svlint

svlint は SystemVerilog 用の linter です。SystemVerilog 用の linter としては商用のEDAツールが良く使われますが、商用なので普通はライセンス数の制限があり、CIなどで気軽に並列数を増やして実行するわけにはいきません。また、商用ツールは合成不能記述を検出するなど高度な機能を持っていますが、その分実行時間がかかることが多いです。

そのため社内リポジトリに push する度に CI で実行できるような軽量でライセンス数制約のない linter を OSS として開発しました。

基本的には構文解析だけ行って各 lint ルールを判定するので、意味解析を伴うような(たとえば未使用変数の指摘のような)ことは現時点では行えません。できることは、例えば「always_ff中でブロッキング代入を使っている」というような構文だけから判定できるものになります。

また、linter としての機能というわけではありませんが、パーサライブラリである sv-parser は IEEE Std 1800-2017 をかなり厳密に解釈したパーサになっているので規格外の記述を検出するのにも使用できます。(商用EDAツールは歴史的な経緯からか、規格外の記述が通ってしまうことがよくあり、他社ツールに持って行った際にトラブルになりがちです)

実際の実行画面は以下のような感じです。

具体的なルール一覧は以下で確認できます。単にルールの設定が書かれているだけでなく、そのルールを採用すべき状況や理由、Pass/Failするコード例なども挙げてあります。

https://github.com/dalance/svlint/blob/master/RULES.md

最近の開発状況

2019年に開発した際には、社内で使うルールを網羅してストップしていました。その後、社内ルールの追加に合わせて細々とメンテナンスしていましたが、2021年末頃に Dave McEwan さんという方がプルリクエストを出してくれるようになりました。

最初のPRがこちら。ポート名の prefix ルールです。

https://github.com/dalance/svlint/pull/104

その後もハイペースでPRを出していただいて、現時点で追加行数トップです。
(本当は Contributors のページが分かりやすいのですが、 Dave さんはコミットと Github アカウントが不一致しているようで集計されていませんでした)

user ++ --
DaveMcEwan 12,282 1,056
dalance 9,976 4,226

先ほどのルール一覧の詳細説明やリントエラー時のメッセージなど、私の適当かつそっけない英文だった部分もちゃんとしたものにしていただきました。

まだ大きなプルリクエストがいくつか予定されているので、今後の発展にもご期待ください(他力本願ですいません…)。

Discussion

VegaVega

svlintをinstallしてみようと思い、以下を実行したのですがエラーでインストールできませんでした。

> cargo install svlint
.
.
.
   Compiling nom-packrat-macros v0.5.0
   Compiling clap_derive v3.2.18
   Compiling nom-tracable v0.7.0
   Compiling nom-recursive v0.3.0
   Compiling nom-packrat v0.5.0
   Compiling sv-parser-error v0.12.2
   Compiling enquote v1.1.0
   Compiling clap v3.2.23
   Compiling sv-parser-parser v0.12.2
   Compiling sv-parser-pp v0.12.2
   Compiling sv-parser v0.12.2
error: could not compile `sv-parser-syntaxtree`

Caused by:
  process didn't exit successfully: `rustc --crate-name sv_parser_syntaxtree --edition=2018 /home/orimitsu/.cargo/registry/src/github.com-1ecc6299db9ec823/sv-parser-syntaxtree-0.12.2/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=a55ab76e12ed96be -C extra-filename=-a55ab76e12ed96be --out-dir /tmp/cargo-installQRu6jH/release/deps -L dependency=/tmp/cargo-installQRu6jH/release/deps --extern sv_parser_macros=/tmp/cargo-installQRu6jH/release/deps/libsv_parser_macros-eae50e8f66b65514.so --cap-lints allow` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: failed to compile `svlint v0.6.0`, intermediate artifacts can be found at `/tmp/cargo-installQRu6jH`

何が悪いのか何か分かりますでしょうか?
Building [======================> ] 112/118: sv-parser-pp, svlint, sv-parser-parser, sv-parser-syntaxtree
の所でErrorになっているようです。

実行環境
Window 10, WSL 2
Ubuntu 22.04.1 LTS
Kernel: Linux 5.15.79.1-microsoft-standard-WSL2
cargo 1.61.0

dalancedalance

手元のWSL2環境で試してみましたが、エラーは起きませんでした。
sv-parserのコンパイルは結構メモリを消費するのでメモリ不足で落ちている可能性があります。
その場合はメモリの割り当てを増やせば解決するかもしれません。
あるいは以下のビルド済みのバイナリのlinux版を使っていただいても大丈夫です。

https://github.com/dalance/svlint/releases

VegaVega

ありがとうございます。
とりあえずLinux向けにビルド済みのものを問題なく使う事ができました。