3 / 37 · 概念
モジュール・ポート・インスタンス:接続を契約として読む
名前付き接続、単一駆動元と階層境界を確認し、組合せモジュールを接続します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
モジュール境界とクロック境界は異なります
モジュールはポートと内部論理をまとめます。インスタンスの追加でレジスタや1サイクル遅延が自動的に生じるわけではありません。直列の組合せモジュールは組合せ経路であり、物理遅延は加算されます。記憶境界には明示的なクロック付きレジスタが必要です。
ポート契約に方向・幅・符号・駆動元・有効時点を記します。次の名前は位置順を暗記しなくても選択する入力を示します。
module select_word #(parameter integer W = 8) (
input logic [W-1:0] a, b,
input logic select_b,
output logic [W-1:0] y
);
assign y = select_b ? b : a;
endmodule
module choose_and_increment (
input logic [7:0] a, b,
input logic select_b,
output logic [8:0] result
);
logic [7:0] chosen;
select_word #(.W(8)) select_u (
.a(a), .b(b), .select_b(select_b), .y(chosen)
);
assign result = {1'b0, chosen} + 9'd1;
endmoduleselect_wordはモジュール型、select_uはインスタンス名です。.a(a)は子のaポートを親のa信号へ接続します。.W(8)はelaboration時の設定であり、動作中にポートへ送る値ではありません。
接続の両側を確認します
chosenの駆動元は子のy出力一つで、親は読み取ります。親の別手続きでも代入してはいけません。logic宣言は競合する駆動元を許可しません。255+1=256を表すためresultは9ビットです。chosenを連結で拡張して加算します。a=255,b=9でselect_b=0なら256、1なら10です。8ビットに縮めると最初の結果のキャリーを失います。
階層・ファイル・top選択
定義を同じファイルまたは別ファイルに置けますが、両方をコンパイラへ渡します。topはchoose_and_incrementです。select_wordを選ぶと検査対象の境界が異なります。子の定義ファイルの欠落はソース一覧の誤りであり、ポート論理の誤りを証明しません。
教材と再利用設計では名前付き接続を使います。位置接続はポート一覧の編集で意味が変わる可能性があります。未接続入力は意図した0ではありません。定数を明示して接続し、未使用出力は文書化して診断を確認します。記憶素子なしで出力が自身の入力へ戻る組合せループも避けます。階層の境界だけではループを切れません。
実習・接続を独立に検証する
(a,b,select_b)=(0,255,0),(0,255,1),(255,0,0),(255,0,1)の期待値は1,256,256,1です。両select値で選択入力の256値を全検査し、非選択入力は異なる値にして選択反転が隠れないようにします。
参照モデルはaかbの整数値を選んで1を加え、組合せ経路が安定してから9ビット結果と比較します。DUT内部chosenを参照すると子の誤選択を共有して見逃します。最後に出力レジスタを追加し、reset方式、有効時点、どの入力エッジに対応するかを規定してください。算術が同じでも時間契約は変わります。