Flycheckを使用したVerilog(Verilog-HDL, SystemVerilog)のSyntax Checkを行う方法を紹介します。
Ubuntu環境での導入を想定していますので、他の環境に導入したい方は参考程度にご覧ください。
1. Flycheckとは
Flycheckとは、EmacsのSyntax Checkerです。
公式ページには以下のような説明がされています。
Flycheck is a modern on-the-fly syntax checking extension for GNU Emacs, intended as replacement for the older Flymake extension which is part of GNU Emacs.
Flycheck — Syntax checking for GNU Emacs
EmacsにはFlymakeというSyntax CheckerがBuilt-inパッケージとして用意されていますが、言語ごとに自分で設定を記述する必要があり、導入に手間がかかります。
Flycheckは、Flymakeで必要とされる設定が事前に組み込まれたSyntax Checkerです。細かい設定を行うことなく簡単に扱うことが出来ます。
私はFlymakeをまともに扱ったことがないので詳しく知らないのですが、おそらく、凝ったSyntax Checkを行いたい場合にはFlymakeの方が有用なのだと思います。
FlymakeとFlycheckの差については以下のページで詳しく説明されています。
2. ソフトウェアのインストール
さて、Flycheckの対応言語を紹介しているページを確認してみます。
Verilog
Supported Languages
verilog-verilator
Check syntax with Verilator.
Flycheckを用いてVerilogのSyntax Checkを行う場合、 VerilatorというEmacs外部のソフトウェアが必要となります。
今回初めて知ったのですが、Verilatorは、論理合成可能なVerilogを検証のためのC/C++等に変換するソフトウェアです。
つまるところトランスコンパイラな訳ですが、他の機能としてVerilogのLint機能が搭載されています。Flycheckは、このLint機能を利用してVerilogのSyntax Checkを行います。
Verilatorは以下のようにインストールすることが出来ます。
$ sudo apt install git make autoconf g++ flex bison $ cd <任意のディレクトリ> $ git clone http://git.veripool.org/git/verilator $ cd verilator $ export VERILATOR_ROOT=<任意のディレクトリ>/verilator $ autoconf $ ./configure $ make $ sudo make install
3. Syntax Checkerの適用
以下が私のFlycheckの設定になります。
(use-package flycheck
:diminish flycheck-mode
:defer t
:bind
(("M-l" . flycheck-list-errors)
("M-p" . flycheck-previous-error)
("M-n" . flycheck-next-error))
:hook
(after-init . global-flycheck-mode)
:init
(add-to-list 'display-buffer-alist ;; リストの表示設定
`(,(rx bos "*Flycheck errors*" eos)
(display-buffer-reuse-window
display-buffer-in-side-window)
(side . bottom)
(reusable-frames . visible)
(window-height . 0.125)))
:config
(setq flycheck-find-checker-executable 'verilog-verilator))
例として載せましたが、今回関係があるのは19行目の設定のみです。
Flycheckをインストールし、19行目の設定を記述してください。
以上のような設定を行い、Verilogファイルを開くとSyntax Checkerが動作します。

…しません。
何やらエラーが出てしまいます。
これについて調べていると、以下のissueを見つけました。
issue #1250 flycheck with verilator: non-zero exit code, but no errors
Verilatorの実行コマンドを$verilatorではなく$verilator_binにすることで動作するとのことです。
上記リンク先のissueには、flycheck-verilog-verilator-executableを設定することで解決すると書かれていますが、よく分からなかったのでFlycheckのソースコード自体に変更を加えました。
flycheck.elのソースコードにおいて、VerilatorのLint機能をコマンドで呼び出している箇所を以下のように変更します。
diff --git a/flycheck.el b/flycheck.el
index 3faac22..a4f2adc 100644
--- a/flycheck.el
+++ b/flycheck.el
@@ -10570,7 +10570,7 @@ Relative paths are relative to the file being checked."
"A Verilog syntax checker using the Verilator Verilog HDL simulator.
See URL `https://www.veripool.org/wiki/verilator'."
- :command ("verilator" "--lint-only" "-Wall"
+ :command ("verilator_bin" "--lint-only" "-Wall"
(option-list "-I" flycheck-verilator-include-path concat)
source)
:error-patterns
これでFlycheckによるVerilogのSyntax Checkerを動作させることが出来ます。

EmacsにはVerilogを記述するのに強力なverilog-modeがありますし、今後も使い続けたいですね。