3 / 20 · 概念
定點輸出策略
區分輸入尺度、負數捨入、飽和與回繞。
單元可免費閱讀,註冊課程即可儲存學習進度。
位元儲存整數;尺度賦予意義
以整數 X 與 F 個小數位元表示 x,因此 x=X/2^F。我們對 A 與 B 使用相同的 F。其乘積與累加器有 2F 個小數位元。將最終原始總和 S 轉回輸入尺度,需要除以 2^F。應在完整歸約之後只轉換一次;先對每一項捨入,可能捨棄原本加在一起會有顯著影響的貢獻。
F=4 時,[1.5,−0.5] 儲存為 [24,−8],[0.25,2.0] 儲存為 [4,32]。原始內積為 24×4−8×32=−160。其實數值為 −160/256=−0.625,而 F=4 的輸出整數為 −10。
明確測試負數捨入
S=−17、F=4 時,精確輸出整數為 −1.0625。算術右移得到 −2;朝零截斷得到 −1。捨入至最近值、同距取偶數也得到 −1。因此,算術位移無法等同於所有「捨棄小數」的解讀。在正好一半的 −24/16=−1.5 與 −40/16=−2.5,同距取偶數皆選擇 −2。
我們的預設轉換先將完整總和捨入至最近值、同距取偶數,再飽和至輸出位元寬度。對絕對值計算商 q 與餘數 r。當 r 超過除數的一半,或等於一半且 q 為奇數時,將 q 加一。之後還原原本的正負號。在 RTL 中,取得最負數的絕對值,需要更寬的暫存值;Node 參考使用 BigInt。
定義輸出溢位
八位元有號輸出涵蓋 −128..127。捨入值 130 可飽和為 127,或回繞為 −126。−130 可飽和為 −128,或回繞為 126。兩種策略都可能是刻意選擇,但必須明確命名並測試。
分別比較原始累加器與轉換後的輸出。原始總和錯誤,通常指向算術或排程;總和正確但輸出錯誤,則指向尺度、捨入或飽和。保留手算邊界案例,避免參考與 RTL 同時掩蓋相同的轉換錯誤。
自己試試看
求 F=4、S=−56 時的同距取偶數結果,以及 F=4、S=−2080 時的飽和八位元輸出。
查看解說
−56/16=−3.5 捨入為偶數 −4。−2080/16=−130,捨入後飽和為 −128。