順序によるポートマッピング
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個)
- ポートの順序が明白で、変更される可能性が低い場合
- 簡易的なテストベンチを作成している場合
ほとんどの設計において、名前によるポートマッピングが推奨されます。その方が明確でエラーが発生しにくいためです。
チャレンジ
ポートマッピング(順序による指定)を使用して、信号を正しい順序でリストし、インスタンス化を完了させてください。
行うべきこと:
モジュールポート (この順序):
input en(enable)input [7:0] d(data input)output [7:0] q(data output)
接続する信号:
enable_signal→enに接続data_input→dに接続data_output→qに接続
チートシート
順序によるポートマッピングは、モジュールのポート定義順序に一致する位置に基づいて信号を接続します。
module_name instance_name (signal1, signal2, signal3);or_gate モジュール(ポート:in1、in2、result)を使用した例:
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。