Verilog mode for Emacs
Verilog mode は Emacs の Verilog HDL のプログラミング向けのモードで、Verilog の構文を理解してインデント量を自動的に調整したり、その他の便利な機能を提供してくれます。
このVerilog mode の入手は verilog.com に登録することによって E-mail で送られてきます。2005年12月3日現在のバージョンは 159 です。
ここでは、このVerilog mode のインストール方法や使い方について説明します。
Verilog modeのインストール
インストールは以下の手順で行います。
E-mail で送られてきた verilog-mode.el.gz を適当なディレクトリで解凍します。
$ gunzip verilog-mode.el.gz
ホームディレクトリに elisp ディレクトリを作成し、そこに解凍された verilog-mode.el をおきます。
$ mkdir elisp $ mv verilog-mode.el ~/elisp/.
.emacs ファイルの編集を行い、以下の記述を追加します。
(defun prepend-path ( my-path )
(setq load-path (cons (expand-file-name my-path) load-path)))
(defun append-path ( my-path )
(setq load-path (append load-path (list (expand-file-name my-path)))))
;;Lood first in the directory ~/elisp for elisp files
(prepend-path "~/elisp")
;;Load verilog-mode only when needed
(autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
;; Any files that end in .v should be in verilog mode
(setq auto-mode-alist (cons '("\\.v\\'" . verilog-mode) auto-mode-alist))
;; Any files in verilog mode shuold have their keywords colorized
(add-hook 'verilog-mode-hook '(lambda () (font-look-mode 1)))
また、ソースを共有する場合、TAB の文字数は各人でことなっていることがしばしばありますので、TAB を space に変換しておくと良いでしょう。その為に以下の記述を .emacs に追加します。
(add-hook 'verilog-mode-hook '(lambda ()
(add-hook 'local-write-file-hooks
(lambda() (untabify (point-min) (point-max))))))
Verilog mode の機能
ここで紹介するのはほんの少しの機能でしかありません。もっと多くの便利な機能を使うには help を参照してください。
コメント操作
M-*
以下のようにコメントの括りが挿入されます。
/*
*
*/
C-c C-c
マークした領域(マークセットした行からカーソル位置まで)をコメントアウトする
/* -----\/----- EXCLUDED -----\/----- 使わない部分 -----/\----- EXCLUDED -----/\----- */
C-c C-u
上記コメントの中でタイプすることによって comment-in (元に戻す)します。
C-c C-r
自動的に end の後にラベル を挿入してくれる。例えばこんな感じ。
else begin
state <= IDLE;
oen <= 1;
wen <= 1;
pready <= 0;
end // else: !if(PStrobe && !PRW)
end // case: IDLE
ヘッダー操作
C-c C-h
ファイルの先頭にヘッダーを挿入します。
C-c C-h とタイプすると Emacs のミニバッファに Title: Project: Company: を順次入力するように促されるのでそれぞれ入力するとソースの<title> <project> <company> に補完されます。
//--------------------------------------------------------------------- // Title : <title> // Project : <project> //--------------------------------------------------------------------- // File : test.v // Author : Hoge Foo <hoge@foo> // Created : 03.12.2005 // Last modified : 03.12.2005 //--------------------------------------------------------------------- // Description : // //--------------------------------------------------------------------- // Copyright (c) 2005 by <company> This model is the confidential and // proprietary property of <company> and the possession or use of this // file requires a written license from <company>. //--------------------------------------------------------------------- // Modification history : // 03.12.2005 : created //---------------------------------------------------------------------
AUTO 機能
verilog のソース中にコメントとして AUTO 機能を /*AUTOxxx*/ と記述することによって、自動的にポート名や宣言文を挿入、補完してくれるモードです。コマンドを実行するには M-x verilog-auto とタイプし、元に戻す場合は M-x verilog-delete-auto とタイプします。

例えば、上図 のような state_machine と decoder モジュールから構成される top モジュールの場合、以下のように簡略化して記述することができます。キータイプの数を減らすことができるわけです。
module top (/*AUTOARG*/); /*AUTOINPUT*/ /*AUTOOUTPUT*/ /*AUTOWIRE*/ state_machine STATE_MACHINE(/*AUTOINST*/); decoder DECODER(/*AUTOINST*/); endmodule
以下、それぞれのコマンドについて説明します。
verilog-auto-arg
モジュールのポートリストに /*AUTOARG*/ と記述することにより、モジュール内の入出力の宣言文から自動的にモジュールのポートリストにポート名を挿入してくれます。
module state_machine(/*AUTOARG*/); input clk; input reset; input PStrobe; input PRW; input cen; output pready; output oen; output wen; --- 省略 --- endmodule
M-x verilog-auto とタイプします。
module state_machine(/*AUTOARG*/ // Outputs pready, oen, wen, // Inputs clk, reset, PStrobe, PRW, cen ); input clk; input reset; input PStrobe; input PRW; input cen; output pready; output oen; output wen; --- 省略 --- endmodule
verilog-auto-input
/*AUTOINST*/ と同時に使用され、サブモジュールへの入力信号で、上位モジュール内で宣言されていない入力ポートの宣言を補完します。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress); /*AUTOINPUT*/ input [15:0] PAddress ; output pready; output oen; output wen; state_machine STATE_MACHINE(/*AUTOINST*/); decoder DECODER(/*AUTOINST*/); endmodule
M-x verilog-auto とタイプ。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress); /*AUTOINPUT*/ // Beginning of automatic inputs (from unused autoinst inputs) input [15:0] PAddress; // To DECODER of decoder.v input PRW; // To STATE_MACHINE of state_machine.v input PStrobe; // To STATE_MACHINE of state_machine.v input clk; // To STATE_MACHINE of state_machine.v input reset; // To STATE_MACHINE of state_machine.v // End of automatics output pready; output oen; output wen; --- 省略 --- endmodule
verilog-auto-inst
上位層で使われるインスタンス化されたサブモジュールのポートリストに /*AUTOINST*/ と記述することによって、サブモジュールのポート名を挿入してくれます。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress); input clk; input reset; input PStrobe; input PRW; input [15:0] PAddress ; output pready; output oen; output wen; state_machine STATE_MACHINE(/*AUTOINST*/); decoder DECODER(/*AUTOINST*/); endmodule
M-x verilog-auto とタイプすることによって、以下のようにポートしストにポート名が挿入されます。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress);
input clk;
input reset;
input PStrobe;
input PRW;
input [15:0] PAddress ;
output pready;
output oen;
output wen;
state_machine STATE_MACHINE(/*AUTOINST*/
// Outputs
.pready (pready),
.oen (oen),
.wen (wen),
// Inputs
.clk (clk),
.reset (reset),
.PStrobe (PStrobe),
.PRW (PRW),
.cen (cen));
decoder DECODER(/*AUTOINST*/
// Outputs
.cen (cen),
// Inputs
.PAddress (PAddress[15:0]));
endmodule
verilog-auto-output
/*AUTOINST*/ と同時に使用し、インスタンス化されたサブモジュールから他のサブモジュールへの出力以外の出力信号を補完します。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress);
input clk;
input reset;
input PStrobe;
input PRW;
input [15:0] PAddress ;
/*AUTOOUTPUT*/
state_machine STATE_MACHINE(/*AUTOINST*/);
decoder DECODER(/*AUTOINST*/);
endmodule
M-x verilog-auto とタイプ。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress);
input clk;
input reset;
input PStrobe;
input PRW;
input [15:0] PAddress ;
/*AUTOOUTPUT*/
// Beginning of automatic outputs (from unused autoinst outputs)
output pready; // From STATE_MACHINE of state_machine.v
output oen; // From STATE_MACHINE of state_machine.v
output wen; // From STATE_MACHINE of state_machine.v
// End of automatics
state_machine STATE_MACHINE(/*AUTOINST*/
// Outputs
.pready (pready),
.oen (oen),
.wen (wen),
// Inputs
.clk (clk),
.reset (reset),
.PStrobe (PStrobe),
.PRW (PRW),
.cen (cen));
decoder DECODER(/*AUTOINST*/
// Outputs
.cen (cen),
// Inputs
.PAddress (PAddress[15:0]));
endmodule
verilog-auto-wire
/*AUTOINST*/ と同時に使用され、インスタンス化されたサブモジュール間の接続信号で、宣言されていない wire 宣言文を補完します。
module top (pready, oen, wen,clk, reset, PStrobe, PRW, PAddress); input clk; input reset; input PStrobe; input PRW; input [15:0] PAddress ; output pready; output oen; output wen; /*AUTOWIRE*/ state_machine STATE_MACHINE(/*AUTOINST*/); decoder DECODER(/*AUTOINST*/); endmodule
M-x verilog-auto とタイプします。
module top (pready, oen, wen, clk, reset, PStrobe, PRW, PAddress);
input clk;
input reset;
input PStrobe;
input PRW;
input [15:0] PAddress ;
output pready;
output oen;
output wen;
/*AUTOWIRE*/
// Beginning of automatic wires (for undeclared instantiated-module outputs)
wire cen; // From DECODER of decoder.v
// End of automatics
state_machine STATE_MACHINE(/*AUTOINST*/
// Outputs
.pready (pready),
.oen (oen),
.wen (wen),
// Inputs
.clk (clk),
.reset (reset),
.PStrobe (PStrobe),
.PRW (PRW),
.cen (cen));
decoder DECODER(/*AUTOINST*/
// Outputs
.cen (cen),
// Inputs
.PAddress (PAddress[15:0]));
endmodule
まだ全ての機能が説明できていませんが、これだけでもかなりのキータイプを効率化できますね。
