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
まだ全ての機能が説明できていませんが、これだけでもかなりのキータイプを効率化できますね。