Emacsにおいてverilog-mode + flymake + verilatorで自動でlintチェックを行えるようにする。
verilog-mode-flymake.el
;;; flymake
(require 'flymake)
;; チェック後にエラーしても終了しないようにする
(defadvice flymake-post-syntax-check
(before flymake-force-check-was-interrupted)
(setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
;; Verilog HDL用のflymake初期化関数
(defun flymake-verilog-init()
(let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace))
(main-file (file-relative-name temp-file (file-name-directory buffer-file-name)))
(sub-files (flymake-verilog-get-files)))
(list "verilator_bin" (append (list "--lint-only" main-file) sub-files))))
;; verilog-modeのverilog-library-files設定からサブモジュールのファイルリストを取得する
(defun flymake-verilog-get-files()
(save-excursion
(goto-char (point-min))
(if (re-search-forward "verilog-library-files:( *\"\\([^)]+\\)\" *)" nil t)
(split-string (match-string-no-properties 1) "\" *\"") (list))))
;; Verilog HDLのファイル拡張子と初期化関数を登録する
(push '(".+\\.s?v$" flymake-verilog-init) flymake-allowed-file-name-masks)
;; エラーメッセージのパターンを登録する
(push '("^%.+: \\(.+\\):\\([0-9]+\\): \\(.*\\)$" 1 2 nil 3) flymake-err-line-patterns)
;; verilog-modeでflymakeを有効にする
(add-hook 'verilog-mode-hook '(lambda () (flymake-mode t)))
verilog-modeのverilog-library-filesの記載があれば、そこからファイル一覧を取得しverilatorへ渡している。
こうすることでインスタンスしているサブモジュールとの接続もチェックすることができる。
Local Variableの値を編集してもverilog-library-filesの値はファイルを再読み込みしないと反映されないようなので、
編集後に反映されるようにゴリ押しで実装している。
verilog-mode-flymake-sample.v
module foo( /*AUTOARG*/ );
/*AUTOINPUT*/
/*AUTOOUTPUT*/
/*AUTOWIRE*/
bar bar( /*AUTOINST*/ );
baz baz( /*AUTOINST*/ );
endmodule
// Local Variables:
// verilog-library-files:("bar.v" "baz.v")
// End: