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