目錄
🧭 前言
🌱 1. Non-Booth 乘法器的實現原理(也叫常規乘法器)
🔧 構建方式
?? 例子:4x4 Non-Booth 乘法器示意
🧱 硬件結構
? 特點總結
? 2. Booth Encoding(布斯編碼)乘法器
🧠 核心思想
? 舉例:Radix-4 Booth(每兩位一組)
📐 Booth 操作編碼表(Radix-4)
🔧 硬件結構簡圖
? 特點總結
🏛? 3. 在 Synopsys DC 中的使用策略
默認行為:
控制變量:
🧪 4. 如何驗證 DC 選擇了哪種乘法器?
方法一:Datapath Debug Log
方法二:report datapath structure
🎯 總結
🔚 延伸閱讀
🧭 前言
在 datapath 構建階段,乘法器是最重要的資源單元之一。
-
面積最大
-
時序瓶頸集中
-
能力決定系統吞吐
而 Synopsys Design Compiler (DC) 在構建乘法器結構時,核心決策之一就是:
?是否采用 Booth Encoding?
?如果不采用,怎么構建標準 non-Booth 乘法器?
這并不是一個簡單選擇,而是涉及多個維度的性能平衡。我們現在就從最底層原理開始:
🌱 1. Non-Booth 乘法器的實現原理(也叫常規乘法器)
🔧 構建方式
假設我們要計算兩個無符號 4-bit 數相乘:
A = a3 a2 a1 a0
B = b3 b2 b1 b0
我們需要構建如下的部分積(partial products):
P0 = A * b0 --> A AND b0 (bitwise)
P1 = A * b1 << 1 --> A AND b1, shift left 1
P2 = A * b2 << 2 --> A AND b2, shift left 2
P3 = A * b3 << 3 --> A AND b3, shift left 3
最終的乘法結果是:
Result = P0 + P1 + P2 + P3
也就是說,n-bit × n-bit 的 non-Booth 乘法器需要生成 n 個部分積,然后加起來。
?? 例子:4x4 Non-Booth 乘法器示意
假設:
A = 4'b1101 (13)
B = 4'b1010 (10)
部分積:
P0 = 1101 & 0 = 0000
P1 = 1101 & 1 = 1101 << 1 = 11010
P2 = 1101 & 0 = 00000
P3 = 1101 & 1 = 1101 << 3 = 1101000
最終加起來:
Result = 0 + 11010 + 0 + 1101000 = 10000010 = 130
🧱 硬件結構
-
每一項
A * bi
是 AND gates -
每個結果之間的加法使用 Carry-Save Adders(CSA)
-
最后一級使用 Carry-Propagate Adder(CPA)
非 Booth 的乘法器結構如下圖邏輯(文字圖):
A * b0 A * b1 A * b2 A * b3| | | |↓↓↓ ↓↓↓ ↓↓↓ ↓↓↓+----------+ +----------+ +----------+ +----------+| Shifter |-->| Shifter |-->| Shifter |-->| Shifter |+----------+ +----------+ +----------+ +----------+| | | |+--------------+--------------+---------------+|Multi-Adder Tree
? 特點總結
維度 | Non-Booth |
---|---|
部分積數量 | n 個 |
面積 | 較大 |
延遲 | 多級加法器 |
符號位支持 | 需要擴展和修復 |
構建復雜度 | 中等 |
優點 | 實現簡單,易調試 |
缺點 | 延遲長,乘法器大 |
? 2. Booth Encoding(布斯編碼)乘法器
Booth 是一種對乘法輸入進行重編碼的方式,可以減少部分積數量,進而降低延遲與面積。
🧠 核心思想
原始每個位做部分積太浪費。
Booth 把乘數 B 分組,比如兩個一組,做符號差分編碼,從而一組表示 3 種操作:
00 → 0
01 → +A
10 → -A
11 → 0(或特殊處理)
這樣就可以跳過很多 "0" 操作,生成更少部分積。
? 舉例:Radix-4 Booth(每兩位一組)
假設:
B = b3 b2 b1 b0 = 1001 (9)
擴展為 b4=0
組合: (b4,b3,b2), (b2,b1,b0)
組1: 010 → +A
組2: 100 → -2A
所以只生成兩組:
-
+A shift by 2
-
-2A shift by 0
相比非 Booth 的 4 個部分積,這里只用 2 個!
📐 Booth 操作編碼表(Radix-4)
組值 (x2, x1, x0) | 操作 |
---|---|
000 | 0 |
001 | +A |
010 | +A |
011 | +2A |
100 | -2A |
101 | -A |
110 | -A |
111 | 0 |
🔧 硬件結構簡圖
Booth Encoder → Booth Selector (0, +A, -A, +2A, -2A)↓Partial Products↓Adder Tree (Wallace or Dadda)
? 特點總結
維度 | Booth Encoding |
---|---|
部分積數量 | 減半:n/2 |
延遲 | 更短 |
面積 | 較小(加法器更深但數量少) |
符號位支持 | 天然支持有符號數! |
實現復雜度 | 高(需要編碼器+符號處理) |
優點 | 高性能,面積節省,支持負數 |
缺點 | 實現復雜,調試難,corner case 多 |
🏛? 3. 在 Synopsys DC 中的使用策略
Design Compiler 會在 datapath 構建階段自動選擇:
默認行為:
-
有符號乘法 → Booth 優先
-
目標路徑在 critical timing path → Booth 強制使用
-
常數乘法 → 不用 Booth,而是移位+加法特化
控制變量:
set_app_var datapath_enable_booth true
更精細控制:
set_app_var datapath_prefer_booth_multiplier true
set_app_var datapath_force_non_booth_multiplier false
你也可以用 constraint 引導:
set_multicycle_path -from A -to B -prefer_booth
🧪 4. 如何驗證 DC 選擇了哪種乘法器?
方法一:Datapath Debug Log
set_app_var datapath_debug_level 5
compile_design
會看到 log 中出現:
Info: Booth encoding applied to multiplier A * B
或
Warning: Fallback to non-Booth multiplier due to bit width mismatch
方法二:report datapath structure
report_datapath -design my_block
會顯示 multiplier 類型和數量。
🎯 總結
比較維度 | Non-Booth | Booth |
---|---|---|
部分積數量 | n | n/2 |
結構復雜度 | 中等 | 高(需要編碼器) |
支持負數 | 手動符號擴展 | ?天然支持 |
面積 | 較大 | 較小 |
延遲 | 多級累加 | 更少級數 |
調試 | 簡單 | 較復雜(corner case 多) |
🧠 在時序收斂關鍵路徑或 DSP 優化目標中,Booth 是你最好的朋友。
🛠 在低位寬、功耗優先或 RTL級測試場景中,Non-Booth 更易用、可控、可驗證。
🔚 延伸閱讀
📙《終結乘法瓶頸!帶你徹底掌握 Booth Encoding 的秘密與架構》
📘《Non-Booth 乘法器的全解析:從 RTL 表達式到部分積壓縮的完整路徑》