はじめに
この記事は SystemVerilog Advent Calendar 2020 の25日目です。
7日目の記事と若干被ってますが、svlsというSystemVerilog向けのLanguage Serverについて紹介します。
Language ServerとはMicrosoftが仕様策定したLanguage Server Protocol(LSP)というプロトコルをしゃべるサーバです。
このサーバは接続してくるエディタに対して、タグジャンプや補完、リント、フォーマットなど様々な機能を提供します。
従来こういった機能はエディタ毎に実装されていましたが、共通のプロトコルができたことで、1つLanguage Serverを書けば対応するあらゆるエディタがこの機能を利用できるようになりました。
最近のモダンなプログラミング言語ではこのLanguage Serverが標準で用意されることも多いですが、残念ながらSystemVerilogにはそのような動きはありません。(あまり真面目に調べたことはないですが、商用ツールでも聞いたことないです)
ないなら作ろうということで、7日目に紹介したSystemVerilogパーサライブラリを使ってLanguage Serverを実装したのがこのsvlsです。実装言語はRustです。
svls
どんなことができるかというのは以下のスクリーンショットを見てください。
赤背景でリントエラーが表示され、それを修正するとその結果がリアルタイムに反映されます。
(表示のされ方はエディタやLSPプラグインによって異なります)
また、シンタックスエラーもリアルタイムに表示されます。
こちらはVSCodeの例で、末尾の;
が抜けているケースです。
(以下はgifにするのが面倒だったので静止画です…)
マウスホバーで詳細(というほどのものでもないですが)が表示されます。
当初リントエラー表示を目的にしていましたが、このシンタックスエラー表示も思いのほか便利です。svlsが使っているパーサは言語規格に対して非常に厳格に作ってあります。一方、商用含めてSystemVerilogの処理系(シミュレータや合成ツールなど)は文法が適当なことが多く、ツールによって規格違反の記述が通ったり通らなかったりします。
そのため、svlsを使って確実に規格の範囲内で書くようにすると、ツールの差異で問題になりにくくなると思います。(また規格通りなのに通らない商用ツールがあれば、ベンダーに文句を言うこともできます)
使い方
基本的な流れは
- svlsのバイナリをダウンロードしてパスの通ったところに置く
- エディタのLanguage Serverとして登録する
という感じです。詳細は以下を見てください。
今のところ以下のエディタで動作するようです。
- VSCode
- Vim
- Neovim
- Emacs
他にもLanguage Serverに対応したエディタなら動くはずです。
SystemVerilogをよく書く方にはぜひ使っていただければと思います。