Menu
Coddy logo textTech

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

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

前のレッスンでは、モジュールの定義にポートが現れるのと同じ順序で信号を渡すことによって、モジュールをインスタンス化する方法を学びました。これは機能しますが、問題があります。それは、順序が重要であるということです。

誤って順序を入れ替えてしまうと、信号が間違ったポートに接続されてしまいます。これはデバッグが困難になる可能性があります。

順序によるマッピングの問題

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// 順序によるマッピング - 順序が一致している必要があります
or_gate or1 (input_a, input_b, output_y);  // 正解
or_gate or1 (input_b, input_a, output_y);  // 間違い!入力が入れ替わっています

2行目は input_bin1 に、input_ain2 に接続しています。これは見落としやすい微妙なバグです。

解決策:名前によるポートマッピング

名前によるポートマッピングでは、ポート名を使用して接続を行います。各接続が明示的にラベル付けされているため、順序は関係ありません。

構文:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

ポート名の前にあるドット . は、モジュール内部のポートを参照していることを示します。括弧内の信号が、そこに接続するものです。

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

これは以下を明示的に示しています:

  • ポート in1 に信号 input_a が接続されます
  • ポート in2 に信号 input_b が接続されます
  • ポート result に信号 output_y が接続されます

順序は関係ありません

名前によるポートマッピングを使用すると、接続を任意の順序で記述できます。

// これら3つはすべて同一です

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

or_gate or1 (
  .result(output_y),
  .in1(input_a),
  .in2(input_b)
);

or_gate or1 (
  .in2(input_b),
  .result(output_y),
  .in1(input_a)
);

各接続にラベルが付けられているため、すべてがまったく同じ動作をします。

challenge icon

チャレンジ

名前によるポートマッピングを使用して、不足しているポート接続を追加し、インスタンス化を完了させてください。

作業内容:

  1. ポート clk を信号 clock_signal に接続する
  2. ポート data_in を信号 input_data に接続する
  3. ポート data_out を信号 output_data に接続する

チートシート

名前によるポート・マッピングは、.port_name(signal) 構文を使用するため、記述する順序は関係ありません。

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

例:

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

ポート名の前にある . はモジュール内部のポートを指し、括弧内の信号はそこに接続される信号です。順序によるマッピングとは異なり、接続をどのような順序で記述してもバグの原因にはなりません。

自分で試してみよう

module register (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out
);
  always @(posedge clk) begin
    data_out <= data_in;
  end
endmodule

module top (
  input clock_signal,
  input [7:0] input_data,
  output [7:0] output_data
);
  
  register reg1 (
    // TODO: .port(signal) 構文を使用してポートマッピングを追加してください
  );
  
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン