Booth Encoding vs. Non-Booth Multipliers —— 穿透 DC 架构看乘法器的底层博弈

news2025/5/10 21:31:24

目录

🧭 前言

🌱 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 * biAND 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)操作
0000
001+A
010+A
011+2A
100-2A
101-A
110-A
1110

🔧 硬件结构简图

  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-BoothBooth
部分积数量nn/2
结构复杂度中等高(需要编码器)
支持负数手动符号扩展✅天然支持
面积较大较小
延迟多级累加更少级数
调试简单较复杂(corner case 多)

🧠 在时序收敛关键路径或 DSP 优化目标中,Booth 是你最好的朋友。
🛠 在低位宽、功耗优先或 RTL级测试场景中,Non-Booth 更易用、可控、可验证。


🔚 延伸阅读

📙《终结乘法瓶颈!带你彻底掌握 Booth Encoding 的秘密与架构》
📘《Non-Booth 乘法器的全解析:从 RTL 表达式到部分积压缩的完整路径》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney-V7:支持参考图片头像或背景生成新保真图

Midjourney-V7重磅升级Omni Reference&#xff1a;全能图像参考神器&#xff01;再也不用担心生成图片货不对版了&#xff01; 就在上周&#xff0c;Midjourney发版它最新的V7版本&#xff1a;Omini Reference&#xff0c;提供了全方位图像参考功能&#xff0c;它可以参考你提…

耀圣-气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器”

气动带刮刀硬密封法兰球阀&#xff1a;攻克颗粒高粘度介质的自清洁 “利器” 在化工、矿业、食品加工等行业中&#xff0c;带颗粒高粘度介质、料浆及高腐蚀性介质的输送与控制一直是行业难题。普通阀门极易因介质附着、颗粒堆积导致卡阻失效&#xff0c;密封面磨损加剧&#x…

Google云计算原理和应用之分布式锁服务Chubby

Chubby是Google设计的提供粗粒度锁服务的一个文件系统,它基于松耦合分布式系统,解决了分布的一致性问题。通过使用Chubby的锁服务,用户可以确保数据操作过程中的一致性。不过值得注意的是,这种锁只是一种建议性的锁(Advisory Lock)而不是强制性的锁,这种选择系统具有更大…

SM2Utils NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement$Fp.<init

1&#xff0c;报错图示 2&#xff0c;报错原因&#xff1a; NoSuchMethodError 表示运行时找不到某个方法&#xff0c;通常是编译时依赖的库版本与运行时使用的库版本不一致。 错误中的 ECFieldElement$Fp. 构造函数参数为 (BigInteger, BigInteger)&#xff0c;说明代码期望使…

《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》

目录 一、认识异常1.1 为什么要使用异常处理机制?1.2 语法错误1.3 异常错误1.4 如何解读错误信息 二、异常处理2.1 异常的捕获2.2 Python内置异常2.3 捕获多个异常2.4 raise语句与as子句2.5 使用traceback查看异常2.6 try…except…else语句2.7 try…except…finally语句--捕获…

动态创建链表(头插法、尾插法)

今天我们来学习动态创建链表&#xff01;&#xff01;&#xff01; 动态创建链表&#xff1a;分为头插法和尾插法 头插法&#xff08;动态创建&#xff09;&#xff1a; 头插法就是让新节点变成头 代码如下 吐血了&#xff1a;这边有个非常重要的知识点&#xff0c;这边第三…

利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组|文献速递-深度学习医疗AI最新文献

Title 题目 Imaging the structural connectome with hybrid MRI-microscopy tractography 利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组 01 文献速递介绍 通过多种模态绘制大脑结构能够增进我们对大脑功能、发育、衰老以及疾病的理解&#xff08;汉森等人&am…

安全监控之Linux核心资产SSH连接监测邮件

文章目录 一、引言二、邮箱设置三、脚本配置四、登录测试 一、引言 在某些特殊时期&#xff08;如HVV&#xff09;需要重点监控Linux核心资产SSH连接登录活动情况&#xff0c;实现ssh登录报警监控。其实实现方式并不难。 二、邮箱设置 在邮箱中需要启用“SMTP”协议&#xf…

文旅田园康养小镇规划设计方案PPT(85页)

1. 项目背景与定位 背景&#xff1a;位于长三角经济圈&#xff0c;依托安吉丰富的自然与文化资源&#xff0c;旨在打造集康养、度假、文化体验于一体的综合小镇。 定位&#xff1a;成为浙北地区知名的康养旅游目的地&#xff0c;融合“一溪两岸”规划理念&#xff0c;实现全面…

【Linux操作系统】第一弹——Linux基础篇

文章目录 &#x1f4a1; 一. Linux的基本常识&#x1fa94; 1.1 linux网络连接三种方式&#x1fa94;1.2 虚拟机的克隆&#x1fa94;1.3 虚拟机的快照&#x1fa94;1.4 虚拟机的迁移和删除&#x1fa94;1.5 vmtools工具 &#x1f4a1;二. Linux的目录结构&#x1fa94;2.1 Linu…

vue3: pdf.js 2.16.105 using typescript

npm create vite vuepdfpreview //创建项目npm install vue-pdf-embed npm install vue3-pdfjs npm install pdfjs-dist2.16.105 <!--* |~~~~~~~|* | |* | |…

从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能

从 MDM 到 Data Fabric&#xff1a;下一代数据架构如何释放 AI 潜能 —— 传统治理与新兴架构的范式变革与协同进化 引言&#xff1a;AI 规模化落地的数据困境 在人工智能技术快速发展的今天&#xff0c;企业对 AI 的期望已从 “单点实验” 转向 “规模化落地”。然而&#…

【软件测试】测试用例的设计方法

目录 一、基于需求进行测试用例的设计 1.1 功能需求测试分析 二、黑盒测试用例设计方法 2.1 等价类划分法(解决穷举) 2.1.1 等价类设计步骤 2.1.2 等价类划分法案例 2.1.2.1 验证 QQ 账号的合法性 2.1.2.2 验证某城市电话号码的正确性 2.1.3 适用场景 2.2 边界值分析…

GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

科技成果鉴定测试有哪些内容?又有什么作用?

科技成果鉴定测试是评价科技成果质量和水平的方法之一&#xff0c;通过测试&#xff0c;可以对科技成果的技术优劣进行评估&#xff0c;从而为科技创新提供参考和指导。 一、科技成果鉴定测试的内容   1.技术评审&#xff1a;通过技术专家对项目进行详细的技术分析&#xff…

基于Spring Boot + Vue 项目中引入deepseek方法

准备工作 在开始调用 DeepSeek API 之前&#xff0c;你需要完成以下准备工作&#xff1a; 1.访问 DeepSeek 官网&#xff0c;注册一个账号。 2.获取 API 密钥&#xff1a;登录 DeepSeek 平台&#xff0c;进入 API 管理 页面。创建一个新的 API 密钥&#xff08;API Key&#x…

A2A与MCP定义下,User,Agent,api(tool)间的交互流程图

官方图&#xff1a; 流程图&#xff1a; #mermaid-svg-2smjE8VYydjtLH0p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2smjE8VYydjtLH0p .error-icon{fill:#552222;}#mermaid-svg-2smjE8VYydjtLH0p .error-tex…

蓝桥杯2025年第十六届省赛真题-水质检测

C语言代码&#xff1a; #include <stdio.h> #include <string.h>#define MAX_LEN 1000000int main() {char a[MAX_LEN 1], b[MAX_LEN 1];// 使用 scanf 读取字符数组scanf("%s", a);scanf("%s", b);int ans 0;int pre -1;int state -1;i…

[Windows] 东芝存储诊断工具1.30.8920(20170601)

[Windows] 东芝存储诊断工具 链接&#xff1a;https://pan.xunlei.com/s/VOPpMjGdWZOLceIjxLNiIsIEA1?pwduute# 适用型号 东芝消费类存储产品&#xff1a; 外置硬盘&#xff1a;Canvio 系列 内置硬盘&#xff1a;HDW****&#xff08;E300 / N300 / P300 / S300 / V300 / X30…

Linux网络编程day7 线程池and UDP

线程池 typedef struct{void*(*function)(void*); //函数指针&#xff0c;回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …