Altifigence Academy

2 / 20 · 概念

有號乘積與累加器位元寬度

由運算元範圍的最壞情況推導累加器位元寬度。

納入最負的輸入

W 位元二補數輸入的範圍是 −2^(W−1) 到 2^(W−1)−1。兩個輸入都是最負值時,會產生最大的正乘積。W=8 時,(−128)×(−128)=16384,大於 127×127=16129。兩個 W 位元輸入的完整有號乘積,可以安全地用 2W 位元表示。

對包含 K 項的歸約,本課程採用以下保守規則。K 必須為正;此規則假設兩個運算元位元寬度相同,且沒有額外偏置。

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

這個規則提供簡單而安全的上界,並非宣稱它對所有 K 都是最小位元寬度。W=8、K=4 時,選擇十八位元。四個最大乘積的總和為 65536。十七位元有號累加器最大值是 65535,因此恰好在此邊界失敗。十八位元涵蓋 −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};

八位元樣式 0xFE 代表 −2。乘以三得到 −6;擴寬此乘積時,需要符號延伸。零延伸會將負數改為正數。應記錄無號介面上的位元樣式在哪個位置被解讀為有號算術值。

位元寬度取決於累加器保留的完整歸約。將 K 拆成分塊,並不代表可以縮窄部分累加器,因為它在合併前仍可能溢位。加入偏置或合併多次歸約,必須重新分析範圍。

測試最小值×最小值、最小值×最大值、最大值×最大值,以及交錯正負號。同時保留寬位元整數參考與所選位元寬度的結果。指定範圍內的精確累加,與範圍外的回繞或飽和,是不同契約;將所有不符都視為一般溢位,會掩蓋真正的正負號錯誤。

自己試試看

W=4、K=3 時,求保守的 AW 與最大正總和。乘積 −8×7 應以哪個位元延伸?

查看解說

PW=8,且 ceil(log2 3)=2,因此 AW=10。最大正總和為 3×64=192。乘積是 −56,必須以一延伸。十位元有號數涵蓋 −512..511。

此選擇適用於本瀏覽器,隨時可從頁尾變更。