名前によるポートマッピング
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_b を in1 に、input_a を in2 に接続しています。これは見落としやすい微妙なバグです。
解決策:名前によるポートマッピング
名前によるポートマッピングでは、ポート名を使用して接続を行います。各接続が明示的にラベル付けされているため、順序は関係ありません。
構文:
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)
);各接続にラベルが付けられているため、すべてがまったく同じ動作をします。
チャレンジ
名前によるポートマッピングを使用して、不足しているポート接続を追加し、インスタンス化を完了させてください。
作業内容:
- ポート
clkを信号clock_signalに接続する - ポート
data_inを信号input_dataに接続する - ポート
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。