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

目录

🧭 前言

🌱 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.mzph.cn/pingmian/80184.shtml

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

相关文章

GET请求如何传复杂数组参数

背景 有个历史项目&#xff0c;是GET请求&#xff0c;但是很多请求还是复杂参数&#xff0c;比如&#xff1a;参数是数组&#xff0c;且数组中每一个元素都是复杂的对象&#xff0c;这个时候怎么传参数呢&#xff1f; 看之前请求直接是拼接在url后面 类似&items%5B0%5D.…

iOS App 安全性探索:源码保护、混淆方案与逆向防护日常

iOS App 安全性探索&#xff1a;源码保护、混淆方案与逆向防护日常 在 iOS 开发者的日常工作中&#xff0c;我们总是关注功能的完整性、性能的优化和UI的细节&#xff0c;但常常忽视了另一个越来越重要的问题&#xff1a;发布后的应用安全。 尤其是对于中小团队或独立开发者&…

A* (AStar) 寻路

//调用工具类获取路线 let route AStarSearch.getRoute(start_point, end_point, this.mapFloor.map_point); map_point 是所有可走点的集合 import { _decorator, Component, Node, Prefab, instantiate, v3, Vec2 } from cc; import { oops } from "../../../../../e…

深度解析动态IP业务核心场景:从技术演进到行业实践

引言&#xff1a;动态IP的技术演进与行业价值 在数字化转型加速的今天&#xff0c;IP地址已从单纯的网络标识演变为支撑数字经济的核心基础设施。动态IP作为灵活高效的地址分配方案&#xff0c;正突破传统认知边界&#xff0c;在网络安全防护、数据价值挖掘、全球业务拓展等领…

MySQL 性能调优:从执行计划到硬件瓶颈

MySQL 性能调优&#xff1a;从执行计划到硬件瓶颈 一、性能调优的宏观视角与核心挑战 在数字化浪潮下&#xff0c;企业数据量呈指数级增长&#xff0c;MySQL 作为主流关系型数据库&#xff0c;面临着巨大的性能压力。某电商平台日均订单量突破千万&#xff0c;高峰期数据库响…

开源数字人框架 AWESOME - DIGITAL - HUMAN:技术革新与行业标杆价值剖析

一、项目核心价值:解锁数字人技术新境界 1. 技术普及:降低准入门槛,推动行业民主化 AWESOME - DIGITAL - HUMAN 项目犹如一场技术春雨,为数字人领域带来了普惠甘霖。它集成了 ASR、LLM、TTS 等关键能力,并提供模块化扩展接口,将原本复杂高深的数字人开发流程,转化为一…

robotframe启动ride.py

我的双击ride.py会自动用pycharm打开&#xff0c;变成代码文件 解决方法&#xff1a;定位到ride.py所在文件夹&#xff08;在anaconda的scripts里面&#xff09;&#xff0c;文件夹上方输入cmd 再输入该命令即可

怎样简单实现不同数据库的表间的 JOIN 运算

数据分析涉及不同业务系统时就要做跨库计算&#xff0c;而表间 JOIN 是最麻烦的&#xff0c;很多数据库都不具备这样的能力&#xff0c;用 Java 取数再计算又太复杂。用 esProc 完成跨库 JOIN 会简单很多。 数据与用例 车辆管理系统&#xff08;DB_Vehicle&#xff09;保存了…

Nacos源码—4.Nacos集群高可用分析三

大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 6.CAP原则与Raft协议 (1)CAP分别指的是什么 (2)什么是分区以及容错 (3)为…

普通IT的股票交易成长史--20250509晚复盘

声明&#xff1a; 本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…

python实现点餐系统

使用python实现点餐系统的增加菜品及价格&#xff0c;删除菜品&#xff0c;查询菜单&#xff0c;点菜以及会员折扣价等功能。 代码&#xff1a; 下面展示一些 内联代码片。 # coding utf-8menu {拍黄瓜: 6, 小炒肉: 28, 西红柿炒蛋: 18, 烤鱼: 30, 红烧肉: 38, 手撕鸡: 45,…

从ellisys空口分析蓝牙耳机回连手机失败案例

问题背景&#xff1a; 前两天同事发现我们现在做的项目&#xff0c;耳机在跟某些特定类型安卓手机&#xff08;尤其是比较新的手机&#xff09;回连会失败&#xff0c;然后我帮他分析了一些log&#xff0c;记录如下&#xff1a; 回连失败所做步骤如下&#xff1a; 手机和耳机…

教育+AI:个性化学习能否颠覆传统课堂?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;逐渐渗透到各行各业&#xff0c;教育领域也不例外。从智能辅导系统到自适应学习平台&#xff0c;AI正在改变传统的教学模式&#xff0c;使个性化学习成为可能。然而&#xff0c;这种变革能否真正…

【C++设计模式之Strategy策略模式】

C设计模式之Strategy策略模式 模式定义核心思想动机(Motivation)结构(Structure)实现步骤1. 定义策略接口&#xff08;基于继承&#xff09;2.实现具体策略3.上下文类(Context)4. 在main中调用 应用场景&#xff08;基于继承&#xff09;1.定义策略接口2.实现具体策略3.上下文类…

Python企业级MySQL数据库开发实战指南

简介 Python与MySQL的完美结合是现代Web应用和数据分析系统的基石,能够创建高效稳定的企业级数据库解决方案。本文将从零开始,全面介绍如何使用Python连接MySQL数据库,设计健壮的表结构,实现CRUD操作,并掌握连接池管理、事务处理、批量操作和防止SQL注入等企业级开发核心…

matlab转python

1 matlab2python开源程序 https://blog.csdn.net/qq_43426078/article/details/123384265 2 网址 转换网址&#xff1a;https://app.codeconvert.ai/code-converter?inputLangMatlab&outputLangPython 文件比较网址&#xff1a;https://www.diffchecker.com/text-comp…

Vue 3 中编译时和运行时的概念区别

文章目录 前言Vue 3 中的编译时 vs 运行时区别模板在编译时转化为渲染函数编译时的优化处理运行时的工作:创建组件实例与渲染流程前言 详细整理 Vue 3 中编译时和运行时的概念区别,并重点解释为什么组件实例是在运行时创建的。 我会结合官方文档、源码分析和社区解释,确保内…

Spring 框架实战:如何实现高效的依赖注入,优化项目结构?

Spring 框架实战&#xff1a;如何实现高效的依赖注入&#xff0c;优化项目结构&#xff1f; 在当今的 Java 开发领域&#xff0c;Spring 框架占据着举足轻重的地位。而依赖注入作为 Spring 的核心概念之一&#xff0c;对于构建高效、灵活且易于维护的项目结构有着关键作用。本…

创建虚拟服务时实现持久连接。

在调度器中配置虚拟服务&#xff0c;实现持久性连接&#xff0c;解决会话保持问题。 -p 【timeout】 -p 300 这5分钟之内调度器会把来自同一个客户端的请求转发到同一个后端服务器。【不管使用的调度算法是什么。】【称为持久性连接。】 作用&#xff1a;将客户端一段时间…

说下RabbitMQ的整体架构

RabbitMQ 是一个基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 协议的开源消息中间件&#xff0c;RabbitMQ的整体架构围绕消息的生产、路由、存储和消费设计&#xff0c;旨在实现高效、可靠的消息传递&#xff0c;它由多个核心组件协同工作。 核心组件 …