Wallace Tree vs. Dadda Tree:部分积压缩背后的两大阵营对决

目录

🧭 前言

🌱 什么是部分积压缩(Partial Product Reduction)?

🌲 Wallace Tree

🧠 核心思想

🧱 构造过程

🔧 示例(文字图)

✅ 特点

🌳 Dadda Tree

🧠 核心思想

🧮 构造步骤

🔧 示例对比 Wallace

✅ 特点

🧰 在 DC 中的实现与调用

指定压缩器优先级(部分库支持)

报告结构:

📌 Synopsys DP Tree Construction Example

🎯 总结对比表

🧠 设计建议

✅ 延伸阅读推荐(可作为下一篇)


🧭 前言

在 datapath 优化阶段,特别是乘法器构建过程中,部分积(Partial Products)压缩是影响 面积时序 的关键步骤。

无论是 Booth 还是 Non-Booth,最终都生成若干组 部分积位,这些位需要在硬件中以极高效率加总为一个最终的积。

这时候就要用到两个业界广泛使用的压缩策略:

  • Wallace Tree

  • Dadda Tree

在 Synopsys Design Compiler 中,DC 的底层 datapath 构建器会根据目标路径、PPA 策略自动选择其中之一,或者根据 library 支持情况固定使用某一类型。

那么这两种结构本质上是怎么工作的?DC 是如何实现并调度这些压缩器节点的?我们现在来揭开它们的实现机制。


🌱 什么是部分积压缩(Partial Product Reduction)?

假设我们有 8 个部分积位,如下:

Bit position 0: 1 bit
Bit position 1: 2 bits
Bit position 2: 3 bits
Bit position 3: 4 bits
Bit position 4: 3 bits
Bit position 5: 2 bits
Bit position 6: 1 bit

我们需要将每个位列上的多个 bits 加总成一个或两个输出,以便最后用一个 Carry-Propagate Adder(CPA) 做最终加法。

压缩树的任务就是:

以最少的逻辑级数,把这些垂直位列压缩为最多两行(Sum + Carry)


🌲 Wallace Tree


🧠 核心思想

Wallace Tree 使用一种激进并行的策略:

  • 在每一层,能压缩就压缩,尽可能并行地使用 Full Adders (3:2) 和 Half Adders (2:2)

  • 每个 bit 位列的高度 > 3 就触发压缩

  • 没有延迟最小化的形式规约,而是贪婪策略

🧱 构造过程

  1. 对所有相同位宽的部分积列做分组

  2. 每组三个用 3:2 压缩器(Full Adder)

  3. 每两个用 2:2 压缩器(Half Adder)

  4. 将结果重新组织为下一层输入

  5. 重复直到所有列高度 ≤ 2

🔧 示例(文字图)

假设某列是 6 个 bit:

Initial: 6 → (FA+FA) → 4 → (FA+HA) → 2

每轮都在压缩,尽可能减少列的高度。


✅ 特点

维度Wallace Tree
结构类型并行、贪婪
关键路径级数少(最短延迟)
面积稍大
调度复杂度
Routing Congestion高(由于扇出和并行)
适合场景高频 / Critical path 优先设计

🌳 Dadda Tree


🧠 核心思想

Dadda Tree 采用一种延迟感知、渐进优化策略:

  • 不立即压缩所有位

  • 先计算出每一列最终需要的最大高度

  • 只在必要时压缩,压缩更保守但更有层级控制

🧮 构造步骤

  1. 计算目标高度序列(从目标 2 开始,逆推)

    • h₀ = 2

    • h₁ = floor(1.5 * h₀) = 3

    • h₂ = floor(1.5 * h₁) = 4

    • … 直到 ≥ 最大初始列高度

  2. 从最高层级开始,每一层将列高度限制在 hₙ

  3. 到最后一层为止,每列 ≤ 2,进入 CPA


🔧 示例对比 Wallace

同样是某列 6 bit:

  • Dadda 可能先不压缩

  • 等到后续阶段再压缩为 4、3、2

这样做的好处是每层 Fan-in、Fan-out 限制小,routing 更容易


✅ 特点

维度Dadda Tree
结构类型延迟平衡型
关键路径级数稍多
面积更紧凑(FA/HA 数量少)
调度复杂度较低
Routing Congestion更低
适合场景面积优先 / layout-sensitive 设计

🧰 在 DC 中的实现与调用

Design Compiler 中并不会显式告诉你用的是哪种 Tree,但它在 datapath 中是一个内嵌策略。你可以通过观察结构和压缩层级来推测。

你也可以通过这些方式影响选择:

指定压缩器优先级(部分库支持)

set_app_var datapath_prefer_wallace_tree true

或者:

set_app_var datapath_use_custom_adder_tree false

报告结构:

report_datapath -structure -design mul_block

观察其中的 adder 类型和分布。


📌 Synopsys DP Tree Construction Example

假设有一个 8×8 Booth 乘法器,生成 4 个部分积(因为每 2 位一组):

  1. DC 调用 datapath 调度器分配这些部分积到压缩层级

  2. 触发 datapath scheduling

  3. 分析位列高度分布

  4. 根据目标(e.g., timing critical vs. area critical)选择 Wallace or Dadda

  5. Insert FA, HA

  6. 构建 Carry Propagate Adder

  7. 输出完整 datapath cell(可以打入 DesignWare)


🎯 总结对比表

维度Wallace TreeDadda Tree
压缩策略贪婪并行压缩延迟感知分阶段
逻辑级数更少稍多
Routing密集更易布线
面积稍大更紧凑
Timing更好稍弱
适用场景Critical path 优先面积优先

🧠 设计建议

  • 在 timing-critical 乘法路径中(如 MAC、DSP):建议偏向 Wallace

  • 在低功耗、高密度 layout 优先的设计:Dadda 更有优势

  • RTL 中乘法表达式越复杂,DC 越倾向于 Booth+Wallace 组合

### 加法器与普通加法器的区别 #### 基本定义 加法器是一种用于实现两个数相加运算的逻辑电路单元。普通加法器通常指全加器或半加器,它们能够逐位完成两数的加法计算并处理进位信号[^1]。 加法器则由多个普通加法器级联构成,形成一种分层结构。这种设计可以显著减少大规模数据求和所需的延迟时间。通过将输入的数据分成若干组逐步累加的方式,最终得到总和结果。 --- ### 差异分析 #### 结构上的区别 - **普通加法器** 普通加法器仅能一次处理两位数字及其可能产生的进位。对于多比特数值的操作,它会依次从最低有效位到最高有效位逐一计算,因此整体延时较高。 - **加法器** 加法器采用了一种层次化的架构来优化性能。例如,在 Wallace TreeDadda Tree 中,输入向量被分为更小组件并通过多次迭代逐渐缩减至单一输出值。这种方法减少了关键路径长度从而加快了整个系统的响应速度。 --- #### 性能对比 - 对于少量数据项相加之情形下,两者之间并无明显差别;然而当面临大批量连续变量需快速汇总的需求时,则显示出巨大差距——由于后者具备更高的吞吐率以及更低的时间复杂度O(log n),故而成为高性能计算领域不可或缺的一部分。 --- ### 应用场景探讨 #### 普通加法器的应用 适用于简单的算术运算场合或者资源受限环境下的嵌入式设备开发项目之中。因其构造简易明了易于理解维护成本低等特点备受青睐。 #### 加法器的应用 广泛应用于图形处理器(GPU)内部矩阵乘法加速核的设计当中; 同样也常见于专用集成电路(ASICs)/现场可编程门阵列(FPGAs)针对机器学习推理引擎构建过程中涉及矢量累操作的部分。此外,在高速通信协议栈里有关前向纠错编码解码算法实现方面也有着不可替代的作用。 ```python # Python模拟简化版加法器示例 def adder_tree(inputs): while len(inputs) > 1: temp = [] for i in range(0, len(inputs), 2): # 配对相邻元素进行相加 if i + 1 < len(inputs): sum_val = inputs[i] + inputs[i+1] else: sum_val = inputs[i] temp.append(sum_val) inputs = temp[:] # 更新列表继续下一阶段加法 return inputs[0] example_input = [3, 5, 7, 9, 11] result = adder_tree(example_input) print(f"The result of the adder tree is {result}") ``` 上述代码片段展示了如何利用循环递减数组规模直至只剩下一个总数的方法论思路去模仿硬件层面实际运作机制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值