Altifigence Academy

21 / 37 · 概念

function automaticと式の再利用

時間を消費しない関数を書き、戻り値の幅・符号と参照モデルの独立性を確認します。

計算を再利用しても契約を隠しません

SystemVerilog関数はシミュレーション時間を消費せず値を返します。合成可能な組合せRTLでは明示的入力に依存し、全経路で戻り値を代入し、遅延やイベント制御を入れません。automaticは呼出ごとの引数・局所変数の領域を与え、レジスタやサイクルを追加するものではありません。固定回数のループで8ビットのXORを求める次の回路は組合せパリティ縮約です。

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

with_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ビットに変更し参照も更新します。これは整形ではなくインターフェース変更です。

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