Menu
Coddy logo textTech

モジュールのインスタンス化

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

各インスタンスは独自の名前(gate1gate2)と独自の接続を持ちます。これらは独立して動作します。

インスタンス化の際に起こること

  • ハードウェアのコピーが作成されます
  • 各インスタンスは独自の信号セットを持ちます
  • インスタンスは並列に(同時に)実行されます
  • 渡すシグナルによって、インスタンスが設計の他の部分とどのように接続されるかが決まります。

インスタンス化のルール

ルール理由
インスタンス名は一意である必要がありますコピーを区別するため
モジュール名が存在している必要があります他の場所で定義されている必要があります
接続数はポート数と一致している必要がありますそうでないと、Verilogは何がどこに接続されているか判断できません
接続順序はポートの順序と一致している必要があります最初の信号が最初のポートに接続される、といった具合です
challenge icon

チャレンジ

or_gate モジュールをインスタンス化して、コードを完成させてください。

手順:

  1. or_gate をインスタンス名 or1 でインスタンス化します。
  2. シグナルを正しい順序で渡します: 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン