モジュールのインスタンス化
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 に接続されます。
モジュールに信号を渡す必要があります。括弧内を空にすることはできません。信号の数はポートの数と一致している必要があります。
複数のインスタンス
同じモジュールのコピーを複数作成できます:
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)と独自の接続を持ちます。これらは独立して動作します。
インスタンス化の際に起こること
- ハードウェアのコピーが作成されます
- 各インスタンスは独自の信号セットを持ちます
- インスタンスは並列に(同時に)実行されます
- 渡すシグナルによって、インスタンスが設計の他の部分とどのように接続されるかが決まります。
インスタンス化のルール
| ルール | 理由 |
|---|---|
| インスタンス名は一意である必要があります | コピーを区別するため |
| モジュール名が存在している必要があります | 他の場所で定義されている必要があります |
| 接続数はポート数と一致している必要があります | そうでないと、Verilogは何がどこに接続されているか判断できません |
| 接続順序はポートの順序と一致している必要があります | 最初の信号が最初のポートに接続される、といった具合です |
チャレンジ
or_gate モジュールをインスタンス化して、コードを完成させてください。
手順:
or_gateをインスタンス名or1でインスタンス化します。- シグナルを正しい順序で渡します:
input_a,input_b,output_y
チートシート
モジュールのインスタンス化により、あるモジュールのコピーを別のモジュール内に作成します:
module_name instance_name (connections);例:
module and_gate (input a, input b, output c);
assign c = a & b;
endmodule
module top (input x, input y, output z);
and_gate gate1 (x, y, z); // x→a, y→b, z→c
endmoduleルール:
- インスタンス名は一意である必要があります
- 接続の数はポートの数と一致している必要があります
- 接続の順序はポート定義の順序と一致している必要があります
- 複数のインスタンスは並列に動作し、それぞれが独自の信号を持ちます
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。