FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

EmacsのExuberant Ctags導入試行(Verilog-HDLで使いものになるか?)

普段の開発には主にEmacsを使っているのだが、良くある事例として現在参照しているモジュールがどこにあるのか分からなかったり、この定数がどこから定義されているのか分からなかったりすることが良くありますよね。

ソフトウェアの世界だと、これらの関数定義にジャンプするためには、WindowsではVisual StudioのIntelliSenseが有名だが(僕も良くお世話になっている)、Emacs/Vimの世界ではctags/etagsというものがあるらしい。

ctags.sourceforge.net

これは現在のソースコードを解析して、関数の定義場所にジャンプしてくれる優れ物らしい。さっそく試してみよう。

Ubuntuでの導入手順

Ubuntuで導入するためには、普通にaptitudeするだけで良い。

sudo aptitude install exuberant-ctags

次に、ファイルの存在する場所でexuberant-ctagsを実行する。TAGSファイルが作成された。

$ etags `find . -name *.v` `find . -name *.vh`
$ ls -ltr
total 600
drwxrwxr-x  3 vagrant vagrant   4096 Nov 14 14:54 ip
drwxrwxr-x  5 vagrant vagrant   4096 Nov 14 14:54 common
drwxrwxr-x 13 vagrant vagrant   4096 Nov 14 14:54 mag_core
drwxrwxr-x 10 vagrant vagrant   4096 Nov 14 14:54 cocotb
drwxrwxr-x  3 vagrant vagrant   4096 Nov 14 14:59 tests
-rw-rw-r--  1 vagrant vagrant 592799 Dec 26 16:54 TAGS

.emacs/init.elの編集

emacsでのキーバインドを作成して、使いやすいようにしておく。以下のサイトを参考にした。

mugijiru.seesaa.net

;;
;; CTAGS
;;
(defun find-tag-next ()
  (interactive)
  (find-tag last-tag t))
(global-set-key (kbd "M-g .")   'find-tag-regexp)
(global-set-key (kbd "M->")     'find-tag-next)
(global-set-key (kbd "M-,")     'find-tag-other-window)
(global-set-key (kbd "M-g M-.") 'anything-c-etags-select)

CTagsの試行

例えば、Verilogファイルを開いていて、以下のようにモジュールのインスタンシエーション部にカーソルを当ててM-.を実行した。ここでは、mag_ifuというモジュールがどこに定義してあるのか探したい。

f:id:msyksphinz:20161227020016p:plain

そういえばまだTAGファイルを指定してなかったので、TAGファイルの場所を指定する。

f:id:msyksphinz:20161227020106p:plain

実行した。ところが、違うファイルが参照されてしまった。

f:id:msyksphinz:20161227020154p:plain

M->を何回か入力して、当該ファイルに飛んだ。どうやら、サーチには一工夫必要らしい。

f:id:msyksphinz:20161227020333p:plain

これ、最近流行りのVisual Studio Codeなどではどうなのかな?ちょっと試してみよう。