Altifigence Academy

3 / 37 · 概念

モジュール・ポート・インスタンス:接続を契約として読む

名前付き接続、単一駆動元と階層境界を確認し、組合せモジュールを接続します。

モジュール境界とクロック境界は異なります

モジュールはポートと内部論理をまとめます。インスタンスの追加でレジスタや1サイクル遅延が自動的に生じるわけではありません。直列の組合せモジュールは組合せ経路であり、物理遅延は加算されます。記憶境界には明示的なクロック付きレジスタが必要です。

ポート契約に方向・幅・符号・駆動元・有効時点を記します。次の名前は位置順を暗記しなくても選択する入力を示します。

SystemVerilog
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;
endmodule

select_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方式、有効時点、どの入力エッジに対応するかを規定してください。算術が同じでも時間契約は変わります。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。