秀丸エディタverilog入力支援設定 の履歴(No.8)
更新Verilog を書くためのエディタとして秀丸は結構便利に使えそうです†
Xilinx ISE の内蔵エディタや Meadow も試したのですが、 今のところ秀丸エディタ(hidemaru.exe)が一番使いやすいと感じています。
強調表示†
Verilog 用の定義ファイルが標準添付されているので、 何もしなくても色分け表示されます。
アウトライン表示†
アウトライン用にツリー情報を定義をしてやることで、
のように、モジュール内の見出しを表示して、クリック一つでジャンプしたり、
のように、コードの一部を折りたたんで隠せます。かなり便利。
ツリー定義用ファイル†
以下の内容を 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です。
通常 // で始める行末までのコメントを、
/// と3つ重ねて始めることでアウトライン上の区切りとして使っています。
//// のように4つ重ねるとさらに強い区切りに、5つならその上、 というように階層化が可能になっています。
単語補完†
同じファイル内の信号線やタスク、関数の名前を拾って、自動補完をしてくれます。
何も設定はいりません。
入力支援マクロ†
まだまだ荒削りで使い込まれていないのですが、 簡単に試したところ、以下のような動作を実現できました。
- `include 文から参照先ファイルを開く
- モジュール名から定義行に飛ぶ
- 飛んだ先から元の位置に戻る
- モジュール名からインスタンシエーションのひな形を生成する
マクロソースファイル†
一番上が最新版です:
インストール†
.zip ファイルに含まれるすべての .MAC ファイルを
C:\Users\<user>\AppData\Roaming\Hidemaruo\Hidemaru\Macro\
に放り込むことで、マクロの機能が使えるようになります。
すなわち、マクロファイル名が [マクロ(M)]-[マクロの実行(X)] の一覧に現れます。
また、[マクロ(M)]-[マクロの登録(E)] に割り当てることができるようになります。
.MAC ファイルのうち、
- VERILOG-JUMP.MAC
- `include 文から参照先ファイルを開く
- モジュール名から定義行に飛ぶ
- 飛んだ先から元の位置に戻る
- VERILOG-INSTANTIATE-MODULE.MAC
- モジュール名からインスタンシエーションのひな形を生成する
の2つを、
のように [マクロの登録(E)] をしておけば、 [マクロ(M)] メニューに [グループ名] で指定した [Verilog] という名前の項目が現れ、 そのサブメニューから上記コマンドを起動できます。
さらに、[その他(O)]-[キー割り当て(K)...] から、 例えば Ctrl+Space に [定義へ移動] を Ctrl+Shift+Space に [モジュールひな形作成] を 割り当てておけば、より簡単にマクロを呼び出せ、 縦横無尽にソースを渡り歩けます。
VERILOG-JUMP.MAC: 定義へ移動†
このマクロは、呼び出された際のキャレット位置によって、
- `include 文から参照先ファイルを開く
`include 文の含まれる行で呼び出された場合 - モジュール名から定義行に飛ぶ
モジュール名っぽい文字列の上で呼び出された場合 - 飛んだ先から元の位置に戻る
それ以外で呼び出された場合
のいずれかの動作をします。
`include されるファイルへ移動†
`include 行で上記マクロを呼び出すと、 そのファイルを開きます。
デフォルトで編集中ファイルと同じフォルダおよびそのサブフォルダを検索します。
ファイルが見つからない場合には、 検索を開始するフォルダを指定する選択肢が現れるので、 そこでフォルダを指定して、もう一度やり直すことができます。
指定したフォルダは秀丸を終了するまで有効です。
モジュール定義へ移動†
モジュール名にキャレットを合わせて上記マクロを呼び出すと、 モジュールの定義位置にキャレットが移動します。
該当モジュールが同じファイル内に無い場合でも、 あらかじめ設定したプロジェクトフォルダ内のすべての *.v ファイルからそのモジュールの定義を検索して、 見つけ出します。
例えば上図のように infrastructure というモジュール名の上で マクロを起動すれば、自動的に infrastructure.v を開いて モジュール定義の上にキャレットが移動します。
ファイル内部を grep して飛び先を探しているので、 モジュールを定義しているファイル名とモジュール名が 一致していなくても大丈夫です。
デフォルトでは編集中ファイルと同じフォルダおよびそのサブフォルダにある、 "*.v" のフィルタにマッチするファイルを検索します。
ファイルが見つからない場合には、 検索を開始するフォルダ、あるいは、検索フィルタを指定する選択肢が現れるので、 そこでフォルダやフィルタを指定して、もう一度やり直すことができます。
指定した内容は秀丸を終了するまで有効です。
飛んだ先から元の位置に戻る†
`include ファイルの中身やモジュール定義を確認したら、 元の位置に戻って作業を続けたいことも多いです。
そこで、`include ファイルやモジュール定義行にジャンプする際に 移動元を覚えておいて、後から元の位置に戻れるようにしてあります。
上記ファイルを `include 行や、モジュール名に見える単語の上以外から呼び出すと、 最後に飛んだ位置に戻ることができます。
したがって、例えばモジュール名の上から2回連続して上記マクロを呼び出すことで、 モジュール利用部分とモジュール定義との間を行ったり来たりすることが可能です。
VERILOG-INSTANTIATE-MODULE.MAC: ひな形を生成する†
モジュール名を書いてマクロを起動すると、 インスタンシエーションのひな形を生成します。
例えば、以下のような定義が 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) );
のようにもできます。
デフォルトではモジュール名が接頭辞になりますが、 モジュール名が長い場合などは、接頭辞を手動で入力すれば どんな接頭辞でも自由に付けられます。
できたらいいと思っている内容†
秀丸マクロに手を染めると、何でもできそうに思えてきます、が、 マクロ記述にかまけていると本業が進まないのもまた事実(−−;
モジュール定義から wire 宣言を生成する†
モジュール入出力線に対応する wire 定義を生成できるとうれしい。
ぜひほしいところなのですが、 モジュール定義が ANSI C 形式でされていればまだしも、 そうでない場合にはビット幅等の情報を抜き出すのが結構面倒な気がして二の足を踏んでいます。
モジュール定義から wire+reg 宣言を生成する(テストベンチ用)†
同上。
`ifdef (`ifndef), `else, `endif 間を飛べると良い?†
入れ子まで考慮して対応位置に飛べるの希望。
マクロの構成について†
秀丸マクロには、
- マクロはそれぞれ別ファイルに保存される。
- マクロからは同じファイルに書かれたサブルーチンしか呼び出せない。
という条件があるので、複数のマクロで同じサブルーチンを使い回すには、 それぞれのマクロファイルにサブルーチンコードのコピーを置かなければなりません。
それはあまりに無様なので、
- マクロから別のマクロを呼び出せる
を利用して、再利用可能な機能は独立したマクロとして記述するのが良さそう。
という考えで、以下のような構成になっています。
- VERILOG-JUMP.MAC
- 状況により適切な飛び先へ移動する
- `include 行であれば VERILOG-OPEN-INCLUDE.MAC を呼ぶ
- モジュール名っぽい物の上であれば VERILOG-FIND-MODULE.MAC を呼ぶ
- それ以外では VERILOG-RESTORE-POSITION.MAC を呼ぶ
- "try" が指定されていれば何もせず状況判断結果を返す
- 状況により適切な飛び先へ移動する
- VERILOG-OPEN-INCLUDE.MAC
- `include ファイルを開く
- ファイルを見つけられなければ VERILOG-FILE-NOT-FOUND.MAC を呼ぶ
- VERILOG-FIND-MODULE.MAC
- モジュール定義へ飛ぶ
- モジュール定義を見つけられなければ VERILOG-FILE-NOT-FOUND.MAC を呼ぶ
- VERILOG-FILE-NOT-FOUND.MAC
- エラーを表示すると共に 検索パス や 検索ワイルドカード を指定し直すメニューを表示する
- VERILOG-SAVE-POSITIONS.MAC
- 現在位置あるいは指定位置を記憶する/記憶した位置へ飛ぶ
- 履歴は5つまで。それ以降は古い物から忘れる。
- "VERILOG_POSITIONS" というスタティック変数に格納される
- VERILOG-SETUP-SEARCH-PATH.MAC
- モジュール定義ファイルの検索開始フォルダを設定する/読み出す
- "VERILOG_PATH" というスタティック変数に格納される
- VERILOG-SETUP-SEARCH-MASK.MAC
- モジュール定義ファイルの検索に使うワイルドカードを設定する/読み出す
- "VERILOG_MASK" というスタティック変数に格納される
- VERILOG-INSTANTIATE-MODULE.MAC
- キャレット位置のモジュール名から実体化のひな形を作成する
- モジュール定義を見つけられなければ VERILOG-FILE-NOT-FOUND.MAC を呼ぶ
ユーザーが直接呼び出す可能性があるのは VERILOG-JUMP.MAC と VERILOG-INSTANTIATE-MODULE.MAC だけ。その他は内部でのみ使われます。
ファイル数が増えたかわりに、コードの重複を避けられました。
多数ファイルを開いてタブで管理†
[ウィンドウ(W)]-[タブモード] にチェックを入れれば、 多数のファイルを開いた場合にもタブで容易に切り替えができますし、 タブをドラッグすれば別ウィンドウとして切り離すなども容易です。
更新されたファイルの自動再読込†
[その他(O)]-[動作環境(E)...] から [上級者向けの設定(A)] にチェックを入れて、 [ファイル]-[排他制御] で
- 排他制御:しない
- 同じファイルを開く場合: 読み直しする
- 書き換えられてないか確認: 時々チェックする & 自動で再読込する
としておきます。
コンパイルエラーメッセージファイルなどを開きっぱなしにしておけば 自動で再読込されるので、ファンクションキー F11 からのタグジャンプで該当のエラー行に飛んだり、便利に使えます。
Xilinx ISE の設定†
ちなみに Xilinx ISE のエディタとして秀丸を登録するには、
[Editor]-[Preference] から、[ISE General]-[Editors] に
C:/Progra~1/Hidemaruo/Hidemaru/hidemaru.exe /j$2 $1
などと入力します。
Windows が 64bit で、秀丸が C:\Program Files (x86) の下にあるときは、
C:/Progra~2/Hidemaruo/Hidemaru/hidemaru.exe /j$2 $1
ですね。
これで、合成時のエラーメッセージからピンポイントでエラー行に飛べます。
コメント†
無題†
[きゅい] (2011-03-09 (水) 18:24:42)
verilogを記述するエディタを探していて、このページにたどり着きました。こちらのマクロが便利そうなので秀丸を使ってみようかと思います。ありがとうございます。以下、一つだけ気付いた点を、
モジュールの定義箇所(module モジュール名...)で、moduleとモジュール名の間がスペース1つの場合は良いのですが、複数のスペースやタブを使用しているとgrep検索に引っかからないようです。
- ご指摘ありがとうございます、確かにそうでした。VERILOG-FIND-MODULE.MAC の 31 行目 grep "module " + $$module, の部分を grep "module\\s+" + $$module, とすれば改善されると思います。お試し下さい。後で直しておきます。 -- [武内(管理人)]
感謝感激!†
[アプロ] (2011-02-24 (木) 08:53:50)
モジュール名からインスタンシエーションのひな形 は感動しました
使わせてください!! いつも、困ってましたし(^^ゞ
- まだうまくいかない場合もあるみたいで、徐々につぶしていこうと思ってます。失敗する例があったら教えて下さい。すでに昨晩1つ見つけたので直してたり(^^; -- [武内(管理人)]