Altifigence Academy

2 / 20 · 概念

符号付きの積とアキュムレータのビット幅

最悪のオペランド範囲からアキュムレータの幅を導きます。

最小の負の入力を含める

Wビットの2の補数入力の範囲は−2^(W−1)から2^(W−1)−1です。最大の正の積は、両入力が最小の負の値のときに生じます。W=8では(−128)×(−128)=16384となり、127×127=16129を超えます。Wビット入力2個の符号付き完全積は2Wビットで安全に表現できます。

K項の縮約には、このコースでは次の保守的な規則を使います。Kは正である必要があり、オペランドの幅が等しく、追加バイアスがないことを仮定します。

Wacc=2W+⌈log⁡2K⌉W_{acc}=2W+\lceil\log_2 K\rceil

これは簡単で安全な上限の規則であり、どのKに対しても最小幅だという主張ではありません。W=8、K=4なら18ビットを選びます。最大積4個の和は65536です。符号付き17ビットの上限は65535なので、ちょうどこの境界で失敗します。18ビットは−131072から131071を表せます。K=1では追加の累積ビットはありません。

符号を明示的に保つ

式の幅を推測するのでなく、中間信号を宣言します。AWはPW以上でなければなりません。

SystemVerilog
localparam int PW = 2*W;
localparam int AW = PW + $clog2(K);
logic signed [W-1:0] a, b;
logic signed [PW-1:0] product;
logic signed [AW-1:0] addend, acc;
assign product = $signed(a) * $signed(b);
assign addend = {{(AW-PW){product[PW-1]}}, product};

8ビットパターン0xFEは−2を表します。3を掛けると−6です。この積の幅を広げるには符号拡張が必要です。ゼロ拡張すると負の数が正の数に変わります。符号なしインターフェースのビットパターンを符号付き算術値として扱い始める位置を記述してください。

幅はアキュムレータに保持する縮約全体に依存します。結合する前にオーバーフローし得るなら、Kをタイルに分割しただけでは部分アキュムレータを狭くする根拠になりません。バイアスの加算や複数の縮約の結合には、改めて範囲を分析する必要があります。

最小×最小、最小×最大、最大×最大、符号が交互に変わる場合をテストします。広い整数の参照値と選んだ幅での結果の両方を保持してください。指定範囲内の正確な累積と、その範囲外での折り返しや飽和は別の契約です。すべての不一致を単なるオーバーフローとして扱うと、本当の符号の誤りが隠れます。

自分で考えてみましょう

W=4、K=3の保守的なAWと最大の正の和を求めてください。積−8×7はどのビットで拡張しますか。

解説を見る

PW=8、ceil(log2 3)=2なのでAW=10です。最大の正の和は3×64=192です。積は−56で、1で拡張する必要があります。符号付き10ビットの範囲は−512..511です。

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