21 / 37 · 概念
function automaticと式の再利用
時間を消費しない関数を書き、戻り値の幅・符号と参照モデルの独立性を確認します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
計算を再利用しても契約を隠しません
SystemVerilog関数はシミュレーション時間を消費せず値を返します。合成可能な組合せRTLでは明示的入力に依存し、全経路で戻り値を代入し、遅延やイベント制御を入れません。automaticは呼出ごとの引数・局所変数の領域を与え、レジスタやサイクルを追加するものではありません。固定回数のループで8ビットのXORを求める次の回路は組合せパリティ縮約です。
module parity_function (
input logic [7:0] data,
output logic parity,
output logic [7:0] with_parity
);
function automatic logic parity8(input logic [7:0] value);
logic p;
integer bit_index;
begin
p = 1'b0;
for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
p = p ^ value[bit_index];
parity8 = p;
end
endfunction
assign parity = parity8(data);
assign with_parity = {data[6:0], parity8(data)};
endmodulewith_parityはdata[7]を意図的に捨ててパリティを追加する8ビット値で、入力全体を保存する9ビット符号ではありません。関数が正しくても呼出側が情報を捨てる可能性があります。
戻り幅と符号を確認します
戻り型は1ビットlogicです。8ビット符号なし加算のキャリーを含めるなら関数は9ビットを返す必要があります。関数呼出はキャリーや呼出側の幅を自動的に保存しません。幅規則と定数をインターフェースの近くに置き、明示的引数だけで計算を理解できるようにします。変化するモジュール全体の変数への隠れた依存は再利用と検証を難しくします。
関数呼出は直列共有回路ではありません
同じ補助関数を二回使っても、時間共有する演算器一つになるとは限りません。ツールは組合せ回路を最適化できますが、直列共有には受理規則・状態・結果時点が必要です。呼出回数だけで面積やスループットを判断しません。イベントを待つ刺激と検査にはテストベンチのtaskを使い、時間を消費しない関数と役割を分けます。
実習・別アルゴリズムで参照する
data=0,1,3,8'h80,8'hFFの期待パリティは0,1,0,1,0です。8'h80のwith_parityは、上位ビットを捨ててパリティ1を付けるため8'h01です。256値を全検査し、DUTのparity8ではなく整数の1の個数を数えて2の剰余で参照します。
ループ上限を7にして8'h80検査が失敗することを確認します。低位ビットだけの検査では欠落を見逃します。次に{data,parity8(data)}で9ビットに変更し参照も更新します。これは整形ではなくインターフェース変更です。