Verilog-HDL 文法(1):module
2015/09/27
[CategoryTop] [Prev] [Next]
[目次]・はじめに
   ・モジュール
     * モジュールの構造
     * 宣言部
     * 回路記述部

●はじめに

 ・Verilog-HDLについてのまとめを行います。「何となくわかるが詳細は自信が無い」方
  を対象としています。この連載レポートで想定している内容ですが、Verilog-HDLの文
  法
を簡単に見た後、シミュレーション記述の文法説明に移ります。
 
 ・文法編終了後は、論理合成可能な組み合わせ回路/順序回路記述と、効率的検証を目的
  としたテストベンチ記述を習得します。
 
 ・本レポートでは、最初は「さらり」と進めていきますが、「回を重ねる毎に説明が増
  える」傾向にあります。Verilog-HDL記述の面白さ少しずつ出していきたいと思ってい
  ます。それでは頑張っていきましょう。


●モジュール

 ◆モジュールの構造
 
  ・Verilog-HDLで回路を記述する基本単位はモジュール(module)です。モジュールの内
   部にはポート宣言回路記述が含まれています。回路からテストベンチまで全てが
   このmoduleで記述されます。

  
  ・module内の識別子には、英数字とアンダースコア'_'が使用できます。また大文字と
   小文字が区別
されます。
  
  ・moduleは以下に説明するように、宣言部回路記述部で構成されています。
  
  ┌─────────────────────────────────────┐
    +<module構造>-------------------------+
    |                   |
    | module モジュール名 (ポートリスト); |
    |                   |
    |  +<宣言部>---------+        |
    |  | ポート宣言;   |        |
    |  |- - - - - - - - -|        |
    |  | ネット宣言;   |        |
    |  | レジスタ宣言;  |        |
    |  | パラメータ宣言; |        |
    |  +-----------------+        |
    |                   |
    |  +<回路記述部>--------------+   |
    |  | assign文         |   |
    |  | function文        |   |
    |  | always文         |   |
    |  | インスタンス(下位module) |   |
    |  +--------------------------+   |
    |                   |
    | endmodule              |
    +-------------------------------------+
  └─────────────────────────────────────┘
  
 ◆宣言部
 
  ・宣言部では以下の内容が記述されています。
  
   * ポート宣言
     + ポートリストに記述したポートは全て定義しなければなりません。
     ┌──────────────────────────────────┐
      (例) input    clk, reset; // 入力  1bit信号
         input [3:0] wr_en;   // 入力  4bitバス信号
         output    dout;    // 出力  1bit信号
         inout [7:0] dbus;    // 入出力 8bitバス信号
     └──────────────────────────────────┘
     
   * ネット宣言/レジスタ宣言
     + module内部で使用する信号の定義です。
     ┌──────────────────────────────────┐
      (例) wire    ctrl;  // ネット 1bit
         wire [3:0] banken; // ネット 4bitバス
      
         reg    dq;     // レジスタ 1bit
         reg [3:0] seqout;   // レジスタ 4bit
         reg [7:0] s_mem [63:0] // メモリ 64byte
     └──────────────────────────────────┘
   
   * パラメータ宣言
     + module内部で使用する定数の定義です。
     ┌──────────────────────────────────┐
      (例)parameter RATE = 100;   // クロックレート
        parameter ST_INIT = 2'b00; // 状態定義
        parameter ST_ACT = 2'b10;
        parameter BWIDTH = 7;
          ---> 利用例 : wire [BWIDTH:0] dbus;
     └──────────────────────────────────┘

 ◆回路記述部
 
  ・回路記述部は、以下の文を用いて記述します。
   
   * assign文
     + assign文は簡単な(1ステートメントで記述できる)組み合わせ論理の記述に使
      用します。
     ┌──────────────────────────────────┐
      (例)assign q = a + b;      // 加算回路
        assign q = (sel==1)? a : b; // セレクタ
     └──────────────────────────────────┘

   * function
     + 条件分岐を含むような複雑な(1ステートメントで記述できない)組み合わせ回
      路の記述
に使用します。
     ┌──────────────────────────────────┐
      (例)//2bit -> 4bit デコーダ
        module dec_2_4 (cnt, mode);
         input [1:0] cnt;
         output [3:0] mode;
      
         function [3:0] decode;
          input [1:0] cnt;
          begin
            case( cnt )
              0: decode = 4'b0001;
              1: decode = 4'b0010;
              2: decode = 4'b0100;
              3: decode = 4'b1000;
            endcase
          end
         endfunction
      
         assign mode = decode( cnt );
      
        endmodule
     └──────────────────────────────────┘

   * always文
     + クロック等によって動作する順序回路の記述に使用します。(*1)
     ┌──────────────────────────────────┐
      (例)always @( posedge clk ) // D-FF (edge sensitive)
          q <= d;
      
        always @( g or d ) // ラッチ (level sensitive)
          if ( g )
            q <= d;
      
        always @( posedge ck or negedge res ) begin // 4bitカウンタ
          if ( res == 0 )
            q <= 4'h0;
          else
            q <= q + 4'h1;
        end
     └──────────────────────────────────┘

   * module呼び出し
     + 別に記述したmoduleを接続することができます(階層化/構造化)。(*2)
     ┌──────────────────────────────────┐
      (例)module LatchH4 (g, d, q); // 4bit Latch
         input    g;
         input [3:0] d;
         output [3:0] q;
      
         LatchH reg_q0 ( .g(g), .d(d[0]), .q(q[0]) );
         LatchH reg_q1 ( .g(g), .d(d[1]), .q(q[1]) );
         LatchH reg_q2 ( .g(g), .d(d[2]), .q(q[2]) );
         LatchH reg_q3 ( .g(g), .d(d[3]), .q(q[3]) );
      
        endmodule
      
        module LatchH (g, d, q); // Latch element
         input g;
         input d;
         output q;
      
         reg  q;
      
         always @( g or d )
           if ( g )
             q <= d;
      
        endmodule
     └──────────────────────────────────┘

  ・回路記述の具体的な内容については、進行に合わせて少しずつ深度を上げていきた
   いと思います。


(*1)always文は組み合わせ回路記述にも使用できます。ただし、条件式の全状態に記述を
  割り当てなければならないので、注意が必要です。

(*2)module呼び出しは、例のような単純な回路ではなく、大規模な回路の記述やIPの利用
  で意味を持ち始めます。

[Revision Table]
 |Revision |Date    |Comments
 |----------|-----------|-----------------------------------------------------
 |1.00   |2003-10-26 |初版
 |1.01   |2003-10-31 |リンク追加
[end]

Copyright(C) 2015 Altmo