Synopsys 逻辑综合之 MultiBit Flip-Flop 与 ICG
目录
一、普通寄存器(1-bit Flip-Flop)
二、Multi-Bit Flip-Flop 是什么?
所以 Multi-Bit FF 的做法就是:
三、为什么要用 Multi-Bit FF?
1. 降低功耗
2. 减小芯片面积
3. 布局优化更容易(Physical Aware)
四、在 Synopsys Design Compiler 中怎么支持?
1. 启用 Multi-Bit Flip-Flop 功能:
2. 与 ICG 协同优化:
3. 后端 ECO 友好性
五、一个现实案例:ICG + MultiBit
六、总结对比
最后总结一句
一、普通寄存器(1-bit Flip-Flop)
当我们在写 RTL 时,常常写这样的寄存器:
reg q;
always @(posedge clk) beginq <= 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 综合流程如下:
-
识别 en 为 clock gating 控制,插入 ICG cell:
clk_gated = clk & en;
-
16 个 data bit 会生成 16 个 DFF
-
识别 clk_gated → 16 个 FF,满足条件
-
合并为 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 是减少“必须切换”的时钟消耗。
两者协同,是现代低功耗设计中不可或缺的黄金搭档!