Linux Computing
  1. ホーム
  2. LinuxでEDA
  3. Verilog Mode for Emacs

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

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

目次
PR
コンテンツ
最近のトピック
週間アクセスランキング
デル株式会社
Copyright (C) 2017 Linux Computing All rights reserved