順序によるポートマッピング
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 35/90。
前回のレッスンでは、.port(signal) を使用して各接続を明示的に指定する名前によるポートマッピングについて学びました。今回は、もう1つの方法である順序によるポートマッピングについて解説します。
モジュール定義に現れるorder(順序)に基づいて、モジュールのport(ポート)にsignal(信号)を接続します。括弧内にsignalsを並べるだけで、Verilogがそれらを1つずつ一致させます。
構文:
module_name instance_name (signal1, signal2, signal3);最初の signal は最初の port に接続され、2 番目の signal は 2 番目の port に接続され、以降も同様に続きます。
例
モジュール定義:
module or_gate (
input in1, // 最初のポート
input in2, // 2番目のポート
output result // 3番目のポート
);
assign result = in1 | in2;
endmodule順序(`order`)によるポートマッピングでのインスタンス化:
or_gate or1 (input_a, input_b, output_y);これは以下を接続します:
- 最初の `signal`
input_a→ 最初の `port`in1 - 2番目の `signal`
input_b→ 2番目の `port`in2 - 3番目の `signal`
output_y→ 3番目の `port`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 順序指定のポートマッピング
| 機能 | 名前指定(By Name) | 順序指定(By Order) |
|---|---|---|
| 構文(Syntax) | .port(signal) | signal1, signal2 |
| 順序が重要か? | いいえ | はい |
| 自己ドキュメント化? | はい | いいえ |
| ミスのリスク | 低い | 高い |
| 推奨用途 | ほとんどの設計 | シンプルなケースのみ |
順番によるポートマッピングをいつ使用するか
順番によるポートマッピングは、次のような場合に許容されます:
- `module` の `ports` が非常に少ない場合 (2〜3個)
- `port` の順序が明確であり、変更される可能性が低い場合
- 素早くテストベンチを記述している場合
ほとんどの設計では、より明確でエラーが発生しにくいため、名前によるポートマッピング(port mapping by name)が推奨されます。
チャレンジ
順番によるポートマッピング(port mapping by order)を使用して、signalsを正しい順序で指定し、インスタンス化を完成させてください。
手順:
モジュールのports(この順序):
input en(イネーブル)input [7:0] d(データ入力)output [7:0] q(データ出力)
接続するsignals:
enable_signal→enに接続data_input→dに接続data_output→qに接続
自分で試してみよう
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: ORDERマッピングを使用して名前reg1でregisterをインスタンス化
// 信号を正しい順序でリストする: enable_signal, data_input, data_output
// .port(signal)構文を使用しない
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。