目录
📌 3.1 Expression Recognition(表达式识别)
📌 3.3 Partial Product Accumulation(部分积压缩)
📌 3.4 Partial Product Sharing(部分积共享)
📌 3.5 Operator Strength Reduction(运算强度降低)
📌 3.6 Constant Multiplication Optimization(常数乘法器特化)
1. 为什么乘法器优化至关重要?
-
在 datapath 中,乘法器 (Multiplier) 是最贵、最慢、最烧资源的运算单元。
-
它决定了综合后的:
-
时序性能 (Frequency)
-
面积占用 (Area)
-
功耗 (Power)
-
如果乘法器实现不好,整个 datapath 优化就是空谈。
所以 DC_SHELL 的 datapath 引擎里有专门的 "Multiplier Optimization" pipeline。
2. 乘法器底层实现技术体系
技术 | 主要优化目的 |
---|---|
Booth Encoding(布斯编码) | 降低部分积数量,加速乘法 |
Wallace Tree(华莱士树) | 减少加法器层级,提高压缩速率 |
Dadda Tree(达达树) | 面积更小,速度略慢于 Wallace |
Partial Product Sharing(部分积共享) | 多乘法器共享中间结果,省面积 |
Operator Strength Reduction(运算强度降低) | 把乘法降级成移位加法 |
Constant Multiplication Optimization(常数乘法优化) | 乘以常数特化成位移+加法 |
3. DC_SHELL 乘法器优化流程
详细底层步骤:
📌 3.1 Expression Recognition(表达式识别)
-
找出 RTL中所有的乘法表达式。
-
判断操作数是否有常数?操作数位宽大小?
-
判断是否可以和周围其他乘法合并?
📌 3.2 Booth Encoding 自动应用
如果是普通乘法(两边都是 variable):
DC 自动使用 Booth Encoding。
比如传统乘法:
X * Y
要生成 n
个部分积 (partial products)。
用 Booth Encoding:
-
每2位一组,产生更少的部分积。
-
减少大约 50% 的加法运算。
DC 自动选择:
-
Radix-4 Booth
-
或更激进的 Radix-8 Booth(更高效但电路更复杂)
📌 3.3 Partial Product Accumulation(部分积压缩)
-
传统方法:串行累加,慢且多。
-
优化方法:
-
Wallace Tree:最早把多位加法并行组织成树形结构,大幅降低加法器延迟。
-
Dadda Tree:比 Wallace 少一点加法器,面积更小,但速度稍慢。
-
DC通常策略是:
-
Timing critical path 上用 Wallace Tree。
-
非critical path 上用 Dadda Tree节省面积。
内部机制:
-
CSA (Carry Save Adder) 技术——在压缩阶段暂时不算进位,加速加法。
📌 3.4 Partial Product Sharing(部分积共享)
如果同一个操作数参与多个乘法:
always @(posedge clk) begin
out1 <= A * B;
out2 <= A * C;
end
DC内部可以识别到:
-
A是公共输入。
-
生成A的partial product只要做一次。
-
共享给两个乘法器。
结果:
-
减少面积
-
加快时序
-
降低功耗
📌 3.5 Operator Strength Reduction(运算强度降低)
如果检测到:
-
某个乘数是2的幂(或接近2的幂)
-
或者小常数
DC会自动把乘法替换成移位+加法,比如:
y = x * 5;
转化成:
y = (x << 2) + x;
比真正乘法器快几倍,面积少很多!
📌 3.6 Constant Multiplication Optimization(常数乘法器特化)
如果乘以的是常数,特别是大规模定点信号处理中:
-
DC 使用adder graph算法
-
最少数量的加法器和移位器
-
无需完整乘法器
应用场景:
-
FIR滤波器
-
图像处理(DCT,卷积)
4. 小冷知识爆料
-
乘法器 mapping阶段,DC优先考虑目标工艺库里是否有专门的 Multiplier Hard Macro。
-
如果 FPGA target,DC会尝试 map到 DSP slice(比如 Xilinx的DSP48 block)。
-
高位宽乘法(>64x64)时,DC默认拆分成多个小乘法+部分积拼接。
-
Booth Encoding在符号位处理上有很多corner case,DC内部用了超复杂逻辑保证符号位对齐。
📢 总结:
乘法器优化是 datapath 最核心的一环,DC用了一套 Booth压缩+Wallace树/达达树+共享重用的体系,动态在面积、时序、功耗三者之间寻找极致平衡。