[SystemVerilog]Sublime Text 2 + ctagsで環境を作る。

こんにちは。メインエディタは[恋に落ちるエディタSublime Text 2](http://www.sublimetext.com/)な@tethys_seesaaです。
どれくらい恋に落ちるかは[この辺り](http://liginc.co.jp/designer/archives/6774)をご参照下さい。

#はじめに。
SystemVerilogってOOPですよね。面倒ですよね。怖いですよね。
某社の人は[オブジェクト指向を恐れるなかれ！](http://lsifrontend.blog100.fc2.com/blog-entry-389.html)とおっしゃいますが、SystemVerilogでOOPは面倒です、怖いです、はい。
とはいえ、OOPなSystemVerilogのコードジャンプぐらいはSublime Text 2でできるように情報をかき集めてまとめてみました。
環境はCentOS 6.5です。

#コードジャンプといえば、
はい、`ctags`ですね。
CentOSでインストールされているctagsを打ち込むとこんな感じです。

```bash
$ ctags --list-languages
:
Tcl
Tex
Vera
Verilog
VHDL
Vim
:
```
ということで、SystemVerilogはありません。Veraはなぜかあります（笑）。
SystemVerilogを作ってみましょう。

#ctagsプラグインのインストール
[こちら](http://codechord.com/2013/03/sublimetext2-ctags/)を参照して下さい。 
CentOSでも、ctagsプラグインは/usr/local/binを前提にしているようなので、/usr/binから`ctags`のシンボリックリンクを貼りました。

#SystemVerilog用設定ファイル
[Verification Guild](http://www.verificationguild.com/modules.php?name=Forums&file=viewtopic&t=1621)のこのコードを参考にしました。参考じゃない…。

```
--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*\binterface\b\s*(\b\w+\b)/\1/i,interface/ 
--regex-SystemVerilog=/^\s*\btypedef\b\s+.*\s+(\b\w+\b)\s*;/\1/e,typedef/ 
--regex-SystemVerilog=/^\s*`define\b\s*(\b\w+\b)/\1/d,define/ 
--regex-SystemVerilog=/}\s*(\b\w+\b)\s*;/\1/e,typedef/ 

--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|logic|reg|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|event)\b)(\s*\[.+\])*\s*(\b\w+\b)/\6/v,variable/ 
--regex-SystemVerilog=/(\b(input|output|inout)\b)?\s*(\[.+\])*\s*(\b(wire|reg|logic)\b)\s*(\[.+\])*\s*(#(\(.+\)|\S+)\))?\s*(\b\w+\b)/\9/v,variable/ 
--regex-SystemVerilog=/(\b(parameter|localparam)\b).+(\b\w+\b)\s*=/\3/a,parameter/ 

--SystemVerilog-kinds=+ctfmpied
```

こちらを、 ~/.ctags　として保存します。

#サンプルコード
いかにもな、OOPコードを用意してみました。

```verilog:base.sv
class base;
  int x = -1;

  function new (int a);
    x = a;
  endfunction

  virtual function void invoke();
    $display("Error!");
  endfunction

endclass
```

```verilog:extend.sv
class extend extends base;

  function new(int a);
    super.new(a);
  endfunction

  function void invoke();
    $display("Good!");
  endfunction

endclass
```

```verilog:tb.sv
program tb();

  base   b;
  extend e;

  initial begin
    e = new(8);
    e.invoke();

    b = new(5);
    b.invoke();
  end

endprogram
```

#ctagsを実行する。
Linux版だとショートカットキーが割り当てられていないので、プロジェクトファイルから指定します。
![sublime.png](https://qiita-image-store.s3.amazonaws.com/0/32925/a11d3da3-d942-2e41-f982-1475b03789ad.png)

うまくいくと、以下のような二つの.tagsファイルができます。このファイルは特に編集しないので、編集無視リストに放り込んでもいいです。
![sublime.png](https://qiita-image-store.s3.amazonaws.com/0/32925/afc4d834-ffd6-f88c-f498-a28525b3889e.png)

#あとは、
例えば、tb.svにある「base」にカーソルを合わせて、Ctrl+T, Ctrl+T を実行すると、定義しているclassのあるコードにジャンプします。元のコードに戻るには、Ctrl+T, Ctrl+Bです。classをCtrl+T, Ctrl+Tしていくと、ベースclassに戻るはずです。

#で、ナニが嬉しいの？
UVMとか導入するとき？

#おわりに。
vimにctagsは常識らしいですし、Sublime Textでもctagsはほぼ常識となりつつあるようです。
SystemVerilog + Sublime Text 2は無かったのでおぼえがきに記しました。
ctagsのSystemVerilogはメンテナンス誰かしてくれませんかねー。

おしまい。