Synopsys 逻辑综合之 MultiBit Flip-Flop 与 ICG

目录

[一、普通寄存器(1-bit Flip-Flop)](#一、普通寄存器(1-bit Flip-Flop))

[二、Multi-Bit Flip-Flop 是什么?](#二、Multi-Bit Flip-Flop 是什么?)

[所以 Multi-Bit FF 的做法就是:](#所以 Multi-Bit FF 的做法就是:)

[三、为什么要用 Multi-Bit FF?](#三、为什么要用 Multi-Bit FF?)

[1. 降低功耗](#1. 降低功耗)

[2. 减小芯片面积](#2. 减小芯片面积)

[3. 布局优化更容易(Physical Aware)](#3. 布局优化更容易(Physical Aware))

[四、在 Synopsys Design Compiler 中怎么支持?](#四、在 Synopsys Design Compiler 中怎么支持?)

[1. 启用 Multi-Bit Flip-Flop 功能:](#1. 启用 Multi-Bit Flip-Flop 功能:)

[2. 与 ICG 协同优化:](#2. 与 ICG 协同优化:)

[3. 后端 ECO 友好性](#3. 后端 ECO 友好性)

[五、一个现实案例:ICG + MultiBit](#五、一个现实案例:ICG + MultiBit)

六、总结对比

最后总结一句



一、普通寄存器(1-bit Flip-Flop)

当我们在写 RTL 时,常常写这样的寄存器:

复制代码
reg q;
always @(posedge clk) begin
  q <= d;
end

这就是一个1位寄存器(1-bit register) ,每次时钟上升沿,寄存器就把输入 d 存进来。


二、Multi-Bit Flip-Flop 是什么?

Multi-Bit FF 是指:把多个逻辑上独立、时钟/复位控制相同的 Flip-Flop,合并成一个物理宏单元(macro cell),例如:

原始结构 Multi-Bit 合并后
8 个 1-bit DFF 1 个 8-bit DFF

示例:

在实际的 IC 设计中,我们很多时候会写多个寄存器,比如:

复制代码
reg [7:0] data;

这个就是 8 位寄存器 ,DC 会默认用 8 个 1-bit 寄存器来实现它(每个位用一个 1-bit FF)。

但如果我们不优化,这就有 8 个寄存器分别接时钟,如下:

复制代码
clk ──▶ FF0
clk ──▶ FF1
clk ──▶ FF2
... (共 8 个)

这样就会产生一些问题:

  • 每个 FF 都吃掉时钟的一部分电能

  • 功耗高

  • 时钟线连接多,布线难

所以 Multi-Bit FF 的做法就是:

把这 8 个 1-bit FF 合成 1 个 8-bit FF, 只要一个时钟输入,结构就变成这样:

复制代码
clk ──▶ [8-bit FF]

你理解成:"本来是 8 把锁,8 把钥匙,现在换成 1 把总锁,1 把钥匙。"


三、为什么要用 Multi-Bit FF?

1. 降低功耗

  • 共享时钟引脚:原本 8 个 FF 各自切换 clk,现在只需一个时钟输入。

  • 减少 Clock Capacitance:减少时钟树 fanout,降低动态功耗。

  • 时钟功耗降低约 20%~40%(尤其在 Data Path 宽位宽场景)

2. 减小芯片面积

  • 标准单比特 DFF 每个都带 D、Q、CLK、RST、SET、Scan 等引脚,面积浪费。

  • Multi-bit FF 共用控制信号,减少 wire congestion 和 Cell Area

3. 布局优化更容易(Physical Aware)

  • 多比特 FF 是一个独立宏单元,在布局布线时减少拥塞和时钟 skew。

  • 更好地满足时序和 CTS 要求。


四、在 Synopsys Design Compiler 中怎么支持?

1. 启用 Multi-Bit Flip-Flop 功能:

复制代码
set_app_var enable_multibit_flop_combining true

可配合以下变量控制:

复制代码
set_app_var multibit_flop_max_bit 8    ;# 控制最大合并位宽
set_app_var multibit_flop_cell_mapping {2:DFFQ2_X1 4:DFFQ4_X1 8:DFFQ8_X1}

你必须在 compile 前启用,DC 会尝试将满足条件的 FF 合并。

2. 与 ICG 协同优化:

复制代码
set_clock_gating_style -sequential latch -control_point before
set_clock_gating_check -clock_gating_hold_check enable

DC 会先识别 clock enable,再自动插入 gating cell,然后做 Multi-Bit 合并。

如果你手动写 ICG cell (例如用 AND(clk, en)),那么 Multi-Bit 工具也会自动识别 gated clk 的 sink 并进行多比特合并。

3. 后端 ECO 友好性

Multi-Bit Flip-Flop 会改变 netlist 结构,所以在 ECO 场景下你可能需要:

  • 开启 scan chain 支持

  • 限制最大合并数目,方便后续替换


五、一个现实案例:ICG + MultiBit

假设现在有如下 RTL:

复制代码
reg [15:0] data;
always @(posedge clk)
  if (en)
    data <= din;

设计目标:低功耗。

DC 综合流程如下:

  1. 识别 en 为 clock gating 控制,插入 ICG cell:

    复制代码
    clk_gated = clk & en;
  2. 16 个 data bit 会生成 16 个 DFF

  3. 识别 clk_gated → 16 个 FF,满足条件

  4. 合并为 1 个 16-bit DFF ,由 1 个 gated clk 驱动

结果:

  • 原本 16 个 FF、16 个 clk sink → 1 个 ICG + 1 个 multi-bit FF

  • 时钟功耗下降、面积减小、后端布局更清爽


六、总结对比

项目 Multi-Bit FF ICG Cell
优化对象 寄存器数量和结构 时钟开关控制
是否改变 FF 数量 是(多个合成一个)
功耗优化点 减少时钟输入切换和 wire congestion 阻止不必要的 clock toggling
在 DC 的处理点 compile_ultra 后自动识别 compile 中 clock gating 优化
是否可以同时使用
是否影响 STA 会改变时钟 fanout,需重新分析 需要处理 gating 时序 arc

在实际低功耗设计中,经常先插入 ICG,再将受控的多个单比特 FF 合并为 Multi-Bit。


最后总结一句

ICG 是关闭"不该切换"的时钟,Multi-Bit FF 是减少"必须切换"的时钟消耗。

两者协同,是现代低功耗设计中不可或缺的黄金搭档!

相关推荐
風清掦15 小时前
【STM32学习笔记-14】WDG看门狗 - 14.2 WWDG窗口看门狗
笔记·stm32·单片机·嵌入式硬件·学习·fpga开发
尤老师FPGA18 小时前
HDMI数据的接收发送实验(十二)
fpga开发
坏孩子的诺亚方舟1 天前
FPGA神经网络数学基础0
人工智能·神经网络·线性代数·fpga开发
熠速1 天前
PolarBox高性能实时仿真系统
arm开发·fpga开发·嵌入式实时数据库·硬件在环半实物仿真
南檐巷上学1 天前
基于Zynq-7020的带有正弦波发生器的8051软核设计
单片机·嵌入式硬件·fpga开发·fpga
思尔芯S2C1 天前
FPGA原型验证中的内存模型应用:基于DDR5的Linux系统启动与测试
fpga开发·内存模型·ddr4·ddr5·memory model·hbm3·prototyping
hai3152475431 天前
RISC-V CVA6 AXI适配器+DMA桥蜂鸟E203处理器的总线接口单元(BIU)仲裁器
驱动开发·fpga开发·硬件架构·硬件工程·精益工程
高速上的乌龟2 天前
Lattice LFCPNX-100 HSB+Fpga开发详解:2.3 Hololink 顶层模块深度全解析
linux·fpga开发
ALINX技术博客2 天前
【FPGA 开发教程】基于 ALINX FPGA 开发板实现 USB3.2 高速通信(Z7-P+FL2010)
fpga开发·fpga·fmc子卡·usb3.2通信
Ricky05532 天前
搭载实时 FPGA 处理系统的航天器上用于海上监视的超分辨率YOLO目标检测技术(意大利2026年研究)
yolo·目标检测·fpga开发