windows の ctags と taglist.vim を systemverilog に対応させる

概要

今回はctagsで作成したタグファイルを利用する taglist.vim を SystemVerilog に対応させて使用します。

前回、 windows の Gvim にタグジャンプを導入しました。
windows10のgvimでctagsを導入しタグジャンプを使ってみる

今回の設定が完了すると、Gvimを使って変数一覧や、ポート一覧なんかをこんな感じに表示できるようになります。

taglist

素敵。ポートも出てるし、 wire と reg も分かれてるし。デフォルトの ctags はverilog には対応しますが、 SystemVerilog には対応しません。

対応させるには

  1. .sv,.svhなどのファイルをverilogとして読み込む
  2. 正規表現を使って文法マッチさせる

のいずれかの方法を取る必要が有ります。

SystemVerilogのファイルをVerilogのファイルとみなして読み込む

ctagsでタグファイルを生成する際、

ctags -e --language-force=verilog *.sv

とすると、.svファイルをverilogとみなして読み込んでくれます。当然ながら、verilogにはないenumや、logicなどの記述は無視されてしまいます。
module や reg , wire などはきちんと認識されるので、とりあえずレベルであれば十分です。

正規表現を使って文法をマッチさせる

ctagsにはオプションとして、正規表現を指定できます。

1
2
3
4
5
6
<lang>
 
<div class="hcb_wrap">
 
<pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>--regex-=/line_pattern/name_pattern/[flags]
Define regular expression for locating tags in specific language.</code>

マッチした部分をflagとして出力します。
SystemVerilog に対応させるとこうなります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--langdef=SystemVerilog 
--langmap=SystemVerilog:.sv.svh.svi 
--regex-SystemVerilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bclass\b\s*(\b\w+\b)/\3/c,class/ 
--regex-SystemVerilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\btask\b\s*(\b(static|automatic)\b)?\s*(\w+::)?\s*(\b\w+\b)/\6/t,task/ 
--regex-SystemVerilog=/^\s*(\b(static|local|virtual|protected)\b)*\s*\bfunction\b\s*(\b(static|automatic)\b)?\s*\b\w+\b(\s*\[.+\])*\s*(\w+::)?\s*(\b\w+\b)/\7/f,function/ 
 
--regex-SystemVerilog=/^\s*\bmodule\b\s*(\b\w+\b)/\1/m,module/ 
--regex-SystemVerilog=/^\s*\bprogram\b\s*(\b\w+\b)/\1/p,program/ 
--regex-SystemVerilog=/^\s*(\bvirtual\b)?\s*(\binterface\b)\s*(\b\w+\b)/\3/i,interface/ 
--regex-SystemVerilog=/^\s*\btypedef\b\s+.*\s+(\b\w+\b)\s*;/\1/T,typedef/ 
--regex-SystemVerilog=/^\s*`define\b\s*(\b\w+\b)/\1/d,define/ 
--regex-SystemVerilog=/}\s*(\b\w+\b)\s*;/\1/E,enum/ 
 
--regex-SystemVerilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\b(shortint|int|longint)\b)\s*(\bunsigned\b)?(\s*\[.+\])*\s*(\b\w+\b)/\7/v,variable/ 
--regex-SystemVerilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\b(byte|bit|integer|time)\b)(\s*\[.+\])*\s*(\b\w+\b)/\6/v,variable/ 
--regex-SystemVerilog=/^\s*(\b(static|local|private)\b)*\s*(\b(real|shortreal|chandle|string)\b)(\s*\[.+\])*\s*(\b\w+\b)/\6/v,variable/ 
--regex-SystemVerilog=/^\s*(\b(static|local|private)\b)*\s*(\bevent\b)(\s*\[.+\])*\s*(\b\w+\b)/\5/e,event/ 
 
--regex-SystemVerilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\breg\b)(\s*\[.+\])*\s*(\b\w+\b)/\5/r,reg/ 
--regex-SystemVerilog=/^\s*(\bwire\b)(\s*\[.+\])*\s*(\b\w+\b)/\3/w,wire/ 
--regex-SystemVerilog=/^\s*(\b(static|local|private|rand)\b)*\s*(\blogic\b)(\s*\[.+\])*\s*(\b\w+\b)/\5/l,logic/ 
 
--regex-SystemVerilog=/^\s*\b(input)\b\s*(\[.+\])*\s*(wire|reg|logic)*\s*(\[.+\])*\s*(#(\(.+\)|\S+)\))?\s*(\w+)/\7/I,inputport/ 
--regex-SystemVerilog=/^\s*\b(output)\b\s*(\[.+\])*\s*(wire|reg|logic)*\s*(\[.+\])*\s*(#(\(.+\)|\S+)\))?\s*(\w+)/\7/O,outputport/ 
--regex-SystemVerilog=/^\s*\b(inout)\b\s*(\[.+\])*\s*(wire|reg|logic)*\s*(\[.+\])*\s*(#(\(.+\)|\S+)\))?\s*(\w+)/\7/B,ioport/ 
--regex-SystemVerilog=/(\b(parameter|localparam)\b).+(\b\w+\b)\s*=/\3/P,parameter/ 
 
--SystemVerilog-kinds=+ctfmpied

このぺーじを参考にしながら、宣言を分けたものになります。

もともとのは wire も reg も integer も全部 variable として扱われてしまうのと、I/Oポートがなかったので、私が使いやすいように修正したものになります。

最後の Flags の部分は ctags で生成されるファイルを使用するアプリケーションによって変更してください。

書き込んだものを設定ファイルとして保存し、ファイル名を ctags.cnf としてタグを作りたいファイルがあるドライブの直下に置くことで、対応が完了します。

D:\work\rtl\
ディレクトリにあるファイルのタグを作成したい場合、Dドライブ直下に ctags.cnf を置いてください。

%USERPROFILE% に置いておけばいいってのもあったけど、自分の環境ではうまく動きませんでした。

langmap に .v を加えれば、 verilog もこっちで解析してくれるようになります。

taglistにsystemverilogを対応させる

vim のプラグインに taglist というものがあり、ctags で生成した tags ファイルを使用して、様々な表示をさせることが出来ます。

パッケージ管理を利用している場合、以下からインストールしてください。
https://github.com/yegappan/taglist

手動でインストールする場合は以下より。
taglist本体

下にスクロールして、 package のリンクから本体を落としたら、 gvim の plugin フォルダの中に展開します。

SystemVerilog 対応のため、 plugins\taglist_**\pugin の中にある taglist.vim を修正します。
537行目あたりに verilog の記述があるため、その下に以下を追加します。

1
"system verilog language let s:tlist_def_systemverilog_settings = 'SystemVerilog;m:module;c:constant;P:parameter;I:input;O:output;B:inout;i:interface;' . \ 'e:event;r:reg;w:wire;l:logic;E:enum;t:task;T:typedef;p:port;v:variable;f:function'

左辺の def_systemverilog_settings の部分は、 vim の filetype です。
vimのEXコマンドで確認できます。

1
:echo &amp;filetype

右辺最初の SystemVerilog の部分は ctags.cnf に書いた

–langdef=SystemVerilog

の部分です。これらを組み合わせると、何にでも対応させることが出来ます。
あとは vimrc の中に以下の行を追加すれば完成です。

set tags=./tags;

使ってみる

コマンドプロンプトで HDL のあるディレクトリの一番上の階層で

1
ctags -R

で tags ファイルを作成、コードのどれか一つを開いて

1
:Tlist

これで、最初の画像のような表示が可能になりました。
struct や union なんかは対応させてません。使わないので。。。

“windows の ctags と taglist.vim を systemverilog に対応させる” への1件の返信

コメントを残す

%d人のブロガーが「いいね」をつけました。