秀丸エディタverilog入力支援設定 のバックアップソース(No.4)

更新

[[公開メモ]]

#contents

* Verilog を書くためのエディタとして秀丸は結構便利に使えそうです [#y8d3f721]

Xilinx ISE の内蔵エディタや Meadow も試したのですが、
今のところ秀丸エディタが一番使いやすいと感じています。

* 強調表示 [#t2b131a2]

Verilog 用の定義ファイルが標準添付されているので、
何もしなくても色分け表示されます。

* アウトライン表示 [#ab97b421]

アウトライン用にツリー情報を定義をしてやることで、

&attachref(tree.png,,50%);

のように、モジュール内の見出しを表示して、クリック一つでジャンプしたり、

&attachref(fold.png,,50%);

のように、コードの一部を折りたたんで隠せます。かなり便利。

** ツリー定義用ファイル [#a174632d]

以下の内容を verilog-tree.highlight と言う名前で、
C:\Users\<user>\AppData\Roaming\Hidemaruo\Hidemaru\Setting\ フォルダに保存します。

 /<TreeWord>
 /0000,0002,0000,00000000,00010113,"^[ \\t]*(end)?module",""
 /0000,0002,0000,00000000,00012111,"^\\);",""
 /0001,0002,0000,00000000,00010111,"^[ \\t]*/////[^/]",""
 /0002,0002,0000,00000000,00010111,"^[ \\t]*////[^/]",""
 /0003,0002,0000,00000000,00010111,"^[ \\t]*///[^/]",""
 /0004,0002,0000,00000000,00010111,"^[ \\t]*(end)?(task|function)",""

メニューの [その他(O)]-[ファイルタイプ別の設定(C)]-[アウトライン]-[解析] から、
[読み込み(O)...] の一覧にこのファイル名が表示されるので、それを選べばOKです。

&attachref(tree-dialog.png,,50%);

通常 // で始める行末までのコメントを、~
~/// と3つ重ねて始めることでアウトライン上の区切りとして使っています。~
~//// のように4つ重ねるとさらに強い区切りに、5つならその上、
というように階層化が可能になっています。

* 単語補完 [#z696f486]

&attachref(auto-completion.png,,50%);

同じファイル内の信号線やタスク、関数の名前を拾って、自動補完をしてくれます。

何も設定はいりません。

* 入力支援マクロ [#e48de296]

まだまだ荒削りで使い込まれていないのですが、
簡単に試したところ、以下のような動作を実現できました。

マクロの起動は任意キーに割り当てられるので、
以下の動作をワンキーで行えます。

- モジュール名から定義行に飛ぶ~
&attachref(VERILOG-FIND-MODULE.MAC);
- 飛んだ先から元の位置に戻る~
&attachref(VERILOG-RETURN.MAC);
- モジュール名からインスタンシエーションのひな形を生成する~
&attachref(VERILOG-INSTANTIATE-MODULE.MAC);
- モジュール定義の検索対象フォルダーを選択する~
&attachref(VERILOG-SET-ROOT.MAC);

各 .MAC ファイルは~
C:\Users\<user>\AppData\Roaming\Hidemaruo\Hidemaru\Macro\ ~
に放り込むことで、使えるようになります。

すなわち、[マクロ(M)]-[マクロの実行(X)] の一覧に現れます。

また、[マクロ(M)]-[マクロの登録(E)] に割り当てることができるようになります。

&attachref(macro-registration.png,,50%);

上図のように [マクロの登録(E)] をしておけば、
[マクロ(M)] メニューに [グループ名] で指定した [Verilog] という名前の項目が現れ、
そのサブメニューから上記コマンドを起動できます。

さらに、[その他(O)]-[キー割り当て(K)...] から、
例えば Ctrl+Space に [Verilogモジュール定義へ移動] を割り当てれば、
モジュール名の上で Ctrl+Space を押すと定義行へ飛べて、
もう一度 Ctrl+Space を押すと元の位置へ戻ることができます。

** モジュール名から定義行に飛ぶ [#r8936839]

モジュール名を書いておいて、あるいは、
インスタンシエート部分のモジュール名にキャレットを合わせておいて
上記のマクロを呼び出すと、モジュールの定義位置にキャレットが移動します。

該当モジュールが同じファイル内に無い場合でも、
あらかじめ設定したプロジェクトフォルダ内のすべての *.v 
ファイルからそのモジュールの定義を検索して、
見つけ出します。

&attachref(module-jump1.png,,66%);

&attachref(module-jump2.png,,66%);

例えば上図のように infrastructure というモジュール名の上で
マクロを起動すれば、自動的に infrastructure.v を開いて
モジュール定義の上にキャレットが移動します。

ファイル内部を grep して飛び先を探しているので、
モジュールを定義しているファイル名とモジュール名が
一致していなくても大丈夫です。

** 飛んだ先から元の位置に戻る [#u51938df]

モジュール定義を確認したら元の位置に戻って作業を続けたいことも多いです。

そこで、モジュール定義行にジャンプする際に移動元を覚えておいて、
後から元の位置に戻れるようにしてあります。

このマクロは単体で呼んでも良いのですが、
キャレットを "module”という単語上に置いて
上記の VERILOG-FIND-MODULE.MAC を呼ぶと、
自動的に「元の位置に戻る」マクロが呼ばれるため、
VERILOG-FIND-MODULE.MAC を連続して2回呼ぶことで、
使用位置と定義位置とを行ったり来たりできます。

** モジュール名からインスタンシエーションのひな形を生成する [#v6e9cf8e]

モジュール名を書いてマクロを起動すると、
インスタンシエーションのひな形を生成します。

例えば、以下のような定義が serial_flash_rom.v にあるとき、

 LANG:verilog
 module serial_flash_rom #(
     parameter DATA_BITS = 32,
     parameter ADDR_BITS = 10,
     parameter ADDR_OFFSET = 0
 ) (
     // implement 時には最適化で失われるダミーの非同期リセット (シミュレーション用)
     input wire GSR_in,
 
     input wire clk,  // 100 MHz
 
     input wire  [DATA_BITS-1:0] idata,
     output wire [DATA_BITS-1:0] odata,
     input wire  [ADDR_BITS-1:0] addr,
     input wire  we,
     
     output wire spi_seln,
     output wire spi_clk,
     input wire spi_miso,
     output wire spi_mosi
 );

main.v 上で、

 LANG:verilog
 serial_flash_rom

とだけタイプして上記マクロを起動すると、ひな形として

 LANG:verilog
  serial_flash_rom #(
 	.DATA_BITS(),
 	.ADDR_BITS(),
 	.ADDR_OFFSET()
 ) serial_flash_rom_inst (
 	.GSR_in(GSR_in),
 	.clk(clk),
 	.idata(idata),
 	.odata(odata),
 	.addr(addr),
 	.we(we),
 	.spi_seln(spi_seln),
 	.spi_clk(spi_clk),
 	.spi_miso(spi_miso),
 	.spi_mosi(spi_mosi)
 );

を生成します。

起動時に信号線に接頭辞を付けるかどうか聞くメニューが出るので、
適当な接頭辞を与えることで

 LANG:verilog
  serial_flash_rom #(
 	.DATA_BITS(),
 	.ADDR_BITS(),
 	.ADDR_OFFSET()
 ) serial_flash_rom_inst (
 	.GSR_in(flash_GSR_in),
 	.clk(flash_clk),
 	.idata(flash_idata),
 	.odata(flash_odata),
 	.addr(flash_addr),
 	.we(flash_we),
 	.spi_seln(flash_spi_seln),
 	.spi_clk(flash_spi_clk),
 	.spi_miso(flash_spi_miso),
 	.spi_mosi(flash_spi_mosi)
 );

のようにもできます。

デフォルトではモジュール名が接頭辞になりますが、
モジュール名が長い場合などは、接頭辞を手動で入力すれば
どんな接頭辞でも自由に付けられます。

** モジュール定義の検索対象フォルダーを選択する [#cafca22c]

デフォルトでは、編集中ファイルと同じフォルダおよび、
その下位フォルダからモジュール定義を検索します。

したがって、サブフォルダ内でマクロを起動すると、
モジュール定義を見つけられない可能性があります。

そこで、検索開始フォルダを明示的に指定することが可能になっています。

ただ、一旦秀丸を起動し直すと忘れてしまうため、
もし指定するのであれば秀丸の起動ごとに指定しなおさなければなりません。

悪しからず。

** できたらいいと思っている内容 [#v87ef646]

秀丸マクロに手を染めると、何でもできそうに思えてきます、が、
マクロ記述にかまけていると本業が進まないのもまた事実(−−;

*** モジュール定義から wire 宣言を生成する [#t64c317e]

モジュール入出力線に対応する wire 定義を生成できるとうれしい。

ぜひほしいところなのですが、
モジュール定義が ANSI C 形式でされていればまだしも、
そうでない場合にはビット幅等の情報を抜き出すのが結構面倒な気がして二の足を踏んでいます。

*** モジュール定義から wire+reg 宣言を生成する(テストベンチ用) [#df8eaf40]

同上。

*** `include 文から対象のファイルを開く [#e33ec857]

grep コマンドを使えばできそう。

*** 同じマクロで状況を見て移動先を決めるのが使いやすい [#zd578b93]

例えば、Ctrl+Space を押した際の動作として、

+ `include 行であればファイルを開く
+ 単語上であれば、その名前のモジュール定義へ飛ぶ
+ それ以外ならもとの位置に戻る

のようにできれば、かなり縦横無尽にソースを渡り歩ける。

** だんだん分かってきたのでマクロの構成を見直し中 [#g1d9fc93]

秀丸マクロには、

- マクロはそれぞれ別ファイルに保存される。
- マクロからは同じファイルに書かれたサブルーチンしか呼び出せない。

という条件があるので、複数のマクロで同じサブルーチンを使い回すには、
それぞれのマクロファイルにサブルーチンコードのコピーを置かなければならない。

それはあまりに無様なので、

- マクロから別のマクロを呼び出せる

を利用して、再利用可能な機能は独立したマクロとして記述するのが良さそう。

以下、まだ構想段階:

- VERILOG-JUMP.MAC
-- 状況により適切な飛び先へ移動する
--- `include 行であれば VERILOG-OPEN-INCLUDE.MAC を呼ぶ
--- モジュール名っぽい物の上であれば VERILOG-FIND-MODULE.MAC を呼ぶ
--- それ以外では VERILOG-RESTORE-POSITION.MAC を呼ぶ
-- "try" が指定されていれば何もせず状況判断結果を返す
- VERILOG-OPEN-INCLUDE.MAC
-- `include ファイルを開く
-- "try" が指定されていればエラーを表示しない
- VERILOG-FIND-MODULE.MAC
-- モジュール定義へ飛ぶ
-- "try" が指定されていればエラーを表示しない
-- モジュール定義を見つけられなければ 検索パス や 検索ワイルドカード を指定し直すメニューを表示する
- VERILOG-SAVE-POSITION.MAC
-- 現在位置あるいは指定位置を記憶する
-- 履歴は5つまで。それ以降は古い物から忘れる。
-- "VERILOG_HIST" というスタティック変数に格納される
- VERILOG-RESTORE-POSITION.MAC
-- 記憶した場所へ戻る
-- 記憶した場所が無ければ何もしない
- VERILOG-SETUP-SEARCH-PATH.MAC
-- モジュール定義ファイルの検索開始フォルダを設定する
-- "VERILOG_ROOT" というスタティック変数に格納される
- VERILOG-SETUP-SEARCH-MASK.MAC~
-- モジュール定義ファイルの検索に使うワイルドカードを設定する
-- "VERILOG_MASK" というスタティック変数に格納される
- VERILOG-INSTANTIATE-MODULE.MAC
-- キャレット位置のモジュール名から実体化のひな形を作成する
-- モジュール定義を見つけられなければ 検索パス や 検索ワイルドカード を指定し直すメニューを表示する

ファイルは増えるけれど、コードの重複は減る。

また、ユーザーが直接呼び出す可能性があるのは VERILOG-JUMP.MAC と
VERILOG-INSTANTIATE-MODULE.MAC だけになるので、使い方を覚えやすい。

* 多数ファイルを開いてタブで管理 [#j5ad64fd]

[ウィンドウ(W)]-[タブモード] にチェックを入れれば、
多数のファイルを開いた場合にもタブで容易に切り替えができますし、
タブをドラッグすれば別ウィンドウとして切り離すなども容易です。

* 更新されたファイルの自動再読込 [#i7994f3e]

[その他(O)]-[動作環境(E)...] から [上級者向けの設定(A)] にチェックを入れて、
[ファイル]-[排他制御] で

&attachref(exclusive.png,,50%);

- 排他制御:しない
- 同じファイルを開く場合: 読み直しする
- 書き換えられてないか確認: 時々チェックする & 自動で再読込する

としておきます。

コンパイルエラーメッセージファイルなどを開きっぱなしにしておけば
自動で再読込されるので、ファンクションキー F11 
からのタグジャンプで該当のエラー行に飛んだり、便利に使えます。

* コメント [#p17ab0b1]

#article_kcaptcha

Counter: 21133 (from 2010/06/03), today: 2, yesterday: 0