svlint: SystemVerilog linter
はじめに
svlint は自作の SystemVerilog linter です。
もともとは社内向けに軽量でライセンス不要な SystemVerilog の linter が欲しかったので作りました。このときの成果物が昔 SystemVerilog Advent Calendar 2020 で紹介した sv-parser と svls です。
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するコード例なども挙げてあります。
最近の開発状況
2019年に開発した際には、社内で使うルールを網羅してストップしていました。その後、社内ルールの追加に合わせて細々とメンテナンスしていましたが、2021年末頃に Dave McEwan さんという方がプルリクエストを出してくれるようになりました。
最初のPRがこちら。ポート名の prefix ルールです。
その後もハイペースでPRを出していただいて、現時点で追加行数トップです。
(本当は Contributors のページが分かりやすいのですが、 Dave さんはコミットと Github アカウントが不一致しているようで集計されていませんでした)
user | ++ | -- |
---|---|---|
DaveMcEwan | 12,282 | 1,056 |
dalance | 9,976 | 4,226 |
先ほどのルール一覧の詳細説明やリントエラー時のメッセージなど、私の適当かつそっけない英文だった部分もちゃんとしたものにしていただきました。
まだ大きなプルリクエストがいくつか予定されているので、今後の発展にもご期待ください(他力本願ですいません…)。
Discussion
svlintをinstallしてみようと思い、以下を実行したのですがエラーでインストールできませんでした。
何が悪いのか何か分かりますでしょうか?
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
手元のWSL2環境で試してみましたが、エラーは起きませんでした。
sv-parserのコンパイルは結構メモリを消費するのでメモリ不足で落ちている可能性があります。
その場合はメモリの割り当てを増やせば解決するかもしれません。
あるいは以下のビルド済みのバイナリのlinux版を使っていただいても大丈夫です。
ありがとうございます。
とりあえずLinux向けにビルド済みのものを問題なく使う事ができました。