Menu
Coddy logo textTech

順序によるポートマッピング

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 35/90。

前のレッスンでは、.port(signal) を使用して各接続を明示的にラベル付けする名前によるポートマッピングについて学びました。今回は、別の方法である順序によるポートマッピングについて説明します。

モジュール定義に現れる順序に基づいて、信号をモジュールのポートに接続します。括弧内に信号をリストするだけで、Verilogがそれらを1つずつ照合します。

構文:

module_name instance_name (signal1, signal2, signal3);

最初の信号は最初のポートに、2番目の信号は2番目のポートに、といった具合に順番に接続されます。

モジュール定義:

module or_gate (
  input in1,      // 第1ポート
  input in2,      // 第2ポート
  output result   // 第3ポート
);
  assign result = in1 | in2;
endmodule

順序によるポートマッピングを用いたインスタンス化:

or_gate or1 (input_a, input_b, output_y);

これは次のように接続します:

  • 最初の信号 input_a → 最初のポート in1
  • 2番目の信号 input_b → 2番目のポート in2
  • 3番目の信号 output_y → 3番目のポート result

順序が重要

順序によるポートマッピングでは、その順序が極めて重要です:

// 正しい順序
or_gate or1 (input_a, input_b, output_y);

// 誤った順序 - 信号が間違ったポートに接続されています!
or_gate or1 (input_b, input_a, output_y);
or_gate or1 (output_y, input_a, input_b);

順番を間違えると、接続が誤ったポートに送られてしまいます。一見するとコードが正しく見えるため、デバッグが難しくなることがあります。

名前によるポートマッピング vs 順序によるポートマッピング

機能名前による順序による
構文.port(signal)signal1, signal2
順序は重要か?いいえはい
自己文書化されているか?はいいいえ
ミスのリスク低い高い
推奨される用途ほとんどの設計単純なケースのみ

順序によるポート・マッピングを使用する場合

順序によるポート・マッピングは、以下の場合に許容されます:

  • モジュールのポート数が非常に少ない場合(2〜3個)
  • ポートの順序が明白で、変更される可能性が低い場合
  • 簡易的なテストベンチを作成している場合

ほとんどの設計において、名前によるポートマッピングが推奨されます。その方が明確でエラーが発生しにくいためです。

challenge icon

チャレンジ

ポートマッピング(順序による指定)を使用して、信号を正しい順序でリストし、インスタンス化を完了させてください。

行うべきこと:

モジュールポート (この順序):

  1. input en (enable)
  2. input [7:0] d (data input)
  3. output [7:0] q (data output)

接続する信号:

  • enable_signalen に接続
  • data_inputd に接続
  • data_outputq に接続

チートシート

順序によるポートマッピングは、モジュールのポート定義順序に一致する位置に基づいて信号を接続します。

module_name instance_name (signal1, signal2, signal3);

or_gate モジュール(ポート:in1in2result)を使用した例:

or_gate or1 (input_a, input_b, output_y);

順序は非常に重要です。信号を入れ替えると誤った接続が発生し、デバッグが困難になります。

特徴名前による指定順序による指定
構文.port(signal)signal1, signal2
順序の重要性なしあり
ミスのリスク低い高い
推奨される用途ほとんどの設計シンプルまたはポートが少ない場合のみ

自分で試してみよう

module register (
  input en,
  input [7:0] d,
  output [7:0] q
);
  assign q = en ? d : q;
endmodule

module top (
  input enable_signal,
  input [7:0] data_input,
  output [7:0] data_output
);
  
  // TODO: 順序マッピングを使用して、名前を reg1 として register をインスタンス化してください
  // 信号を正しい順序でリストしてください: enable_signal, data_input, data_output
  // .port(signal) 構文を使用しないでください

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン