モジュールのインスタンス化
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 33/90。
モジュールのインスタンス化とは、別のモジュール内にモジュールのコピーを作成するプロセスです。小さなコンポーネント同士を接続して、より大きな設計を構築する方法です。
モジュールを定義したら、別のモジュール内で使用できます。これはインスタンス化と呼ばれます。インスタンス化するたびに、そのモジュールの独立したインスタンスが作成されます。同じ部品の複製を複数作るために設計図を使うようなものだと考えてください。
基本構文
module_name instance_name (connections);| 部分 | 意味 |
|---|---|
module_name | インスタンス化するモジュールの名前 |
instance_name | このコピーに付ける一意の名前 |
connections | モジュールのポートに接続される信号 |
簡単な例
ステップ 1: モジュールを定義する
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmoduleステップ 2: 別のモジュール内でインスタンス化する
module top (
input x,
input y,
output z
);
and_gate gate1 (x, y, z);
endmoduleこのコードでは、次のことが行われます。
and_gate: 使用するモジュールの名前(どこかに存在している必要があります)gate1: この特定のインスタンスに付ける一意の名前(x, y, z): モジュールのポートに接続する信号(モジュール定義に記載されている順)
最初の信号 x は最初のポート a に接続します。2番目の信号 y は2番目のポート b に接続します。3番目の信号 z は3番目のポート c に接続します。
各ポートに1つの信号を渡します。 Verilogでは信号の数が少なくても、括弧の中が空でも受け付けますが、信号が渡されないポートは未接続のままとなり、設計内の何にも接続されません。モジュールのポート数を超える信号を渡すとエラーになります。
複数のインスタンス
同じモジュールのコピーを複数作成できます。
module top;
wire out1, out2;
wire sig1, sig2, sig3, sig4;
and_gate gate1 (sig1, sig2, out1);
and_gate gate2 (sig3, sig4, out2);
endmodule各インスタンスには、それぞれ独自の名前(gate1、gate2)と独自の接続があります。それぞれ独立して動作します。
インスタンス化中に起こること
- ハードウェアのコピーが作成される
- 各インスタンスは独自の信号セットを持つ
- インスタンスは並列に(同時に)実行される
- 渡す信号によって、インスタンスが設計の他の部分とどのように接続されるかが決まります
インスタンス化のルール
| ルール | 理由 |
|---|---|
| インスタンス名は一意でなければならない | 複製を区別するため |
| モジュール名が存在しなければならない | 別の場所で定義されている必要がある |
| ポートごとに1つの信号を渡す | 信号のないポートは未接続のままとなり、ポート数より信号数が多いとエラーになる |
| 接続の順序はポートの順序と一致しなければならない | 最初の信号は最初のポートに接続される、など |
チャレンジ
or_gate モジュールをインスタンス化して、コードを完成させましょう。
やること:
or1というインスタンス名でor_gateをインスタンス化する- 信号を正しい順序で渡す:
input_a、input_b、output_y
自分で試してみよう
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
module top (
input input_a,
input input_b,
output output_y
);
// TODO: or_gate を or1 という名前でインスタンス化する
// 信号を input_a, input_b, output_y の順に渡す
// .port(signal) 構文は使用しない
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ