EmacsにVerilogのSyntax Checkerを導入する

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の方が有用なのだと思います。

FlymakeFlycheckの差については以下のページで詳しく説明されています。

Flycheck versus Flymake

2. ソフトウェアのインストール

さて、Flycheckの対応言語を紹介しているページを確認してみます。

Verilog
verilog-verilator
Check syntax with Verilator.

Supported Languages

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の設定になります。

  1. (use-package flycheck
  2.   :diminish flycheck-mode
  3.   :defer t
  4.   :bind
  5.   (("M-l" . flycheck-list-errors)
  6.    ("M-p" . flycheck-previous-error)
  7.    ("M-n" . flycheck-next-error))
  8.   :hook
  9.   (after-init . global-flycheck-mode)
  10.   :init
  11.   (add-to-list 'display-buffer-alist  ;; リストの表示設定
  12.                `(,(rx bos "*Flycheck errors*" eos)
  13.                  (display-buffer-reuse-window
  14.                   display-buffer-in-side-window)
  15.                  (side            . bottom)
  16.                  (reusable-frames . visible)
  17.                  (window-height   . 0.125)))
  18.   :config
  19.   (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機能をコマンドで呼び出している箇所を以下のように変更します。

  1. diff --git a/flycheck.el b/flycheck.el
  2. index 3faac22..a4f2adc 100644
  3. --- a/flycheck.el
  4. +++ b/flycheck.el
  5. @@ -10570,7 +10570,7 @@ Relative paths are relative to the file being checked."
  6.    "A Verilog syntax checker using the Verilator Verilog HDL simulator.
  7.  
  8.  See URL `https://www.veripool.org/wiki/verilator'."
  9. -  :command ("verilator" "--lint-only" "-Wall"
  10. +  :command ("verilator_bin" "--lint-only" "-Wall"
  11.              (option-list "-I" flycheck-verilator-include-path concat)
  12.              source)
  13.    :error-patterns

これでFlycheckによるVerilogのSyntax Checkerを動作させることが出来ます。


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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です