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.pswp.cn/pingmian/80184.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80184.shtml
英文地址,請注明出處:http://en.pswp.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;它由多個核心組件協同工作。 核心組件 …