时钟门控ICG单元的timing问题
除in2reg、reg2reg、reg2out、in2out类型路径外,我们会经常看到reg2cgate的setu/hold检查,即clock gate上enable信号要比clock信号提前到达一段时间setup和保持一段时间hold。
在 STA sign off分析时,经常会碰到clock gating cell(默认全是ICG)的setup timing violation,而且很难修。那么如何保证ICG中Latch的时序呢?本文总结一下下吧。
低功耗之门控时钟设计
数字IC中后端ICG(Integrated Clock Gating)的Enable信号路径容易发生Setup违例,如下图,由于reg1®2在同一skew group下,工具默认会做平这两个sink点,所以T1就约等于T2+T3。但是中间插着ICG cell所以到达ICG CK端的capture lantency T2是一定会<T1。这样一来在检查ICG时序(这里讨论setup)的时候就会出现Setup违例。
Tskew = T2-T1 为负,减小了setup slack,不易满足setup需求。
ICG enable timing violation这个问题是很常见的,通常是pre-CTS还好好的,post-CTS就冒出来了,因为ICG不是clock tree中的sink却是timing path的endpoint, 默认流程中其latency会比sink端的latency小(比ICG enable timing path的startpoint小)。
如下图所示,pre-CTS的时候默认latency1=latency2=latency3=0,但是做完CTS后latency1=latency2+latency3
既然通常clock gate上的setup较难收敛,那么解决办法呢?
- 尽量让ICG 在reg2附近,这样一来T3就~=0 即 T1约等于T2。
- 采用set_clock_gating_check,加大对clock gating时序约束。
对于clock gating cell,synthesis时就会插入,和CTS没太大关系,一般只要确保clock timing check打开的就行。
详解set_clock_gating_style命令
- 把clk lantency1 做短lantency3
在place阶段,在ICG的CK pin设置一个负的latency,这个负的latency的值可以大概等于CTS之后lantency3的delay大小;这样就可以让tool在给reg1生成时钟树时,会尽力将lantency1 (即reg1的launch path)做短至少lantency3(ICG→reg2的时钟树长度)的大小。Place阶段工具也会考虑时钟树skew引入的时序问题,ICG cell尽可能的靠近reg2并且不要在path上过多插入delay。
高性能CPU的ICG Latency设置
report_timing -path_type full_clock
请问这里SDC为何约束到了ICG的CP端外,还约束了ICG的Q端?假设注释掉Q端的约束,如下图,会有什么问题?
去掉后,timing报告如下,明显setup timing变差了很多。
report_timing -path_type full_clock
因此,约束ICG的latency为-400ps,目的是把ICG从reg拉开400ps,如果不约束ICG的Q,那么工具为了minimize skew,会默认ICG后面所有的reg的CLK的latency和ICG是一样的-400ps。此时,时钟还是是理想的。因此需要给ICG的Q端也约束上latency,此处约束为-50ps。不经过这个ICG的CLK pin默认latency为0。
注意,ICG本身容易setup violation,默认icg 和reg 越近越好。
- place 阶段Innovus命令:
set clock latency -0.500 [get pins ICG/CK]在CTS阶段,在reg1的CK pin上设置一个insertion delay,这就是所谓的floating pin,这个insertion delay的值大概也等于CTS后T3(ICG→reg2的时钟树长度)的大小。Innovus命令:set ccopt property insertion delay 0.500 -pin reg1/CK
注意,查看DC user guide你会发现:
有的同学会认为“set_clock_gating_check只是单纯用于组合逻辑实现的gating,例如直接把时钟和EN 拉到一个与门上,才需要用这个命令,而ICG不是set_clock_gating_check这个命令的范围”。这观点是错误的!
实战一下:set_clock_gating_check约束在ICG cell上
report_clock_gating_check:
set_clock_gating_check U_FIFOMEM/clk_gate_mem_reg[15]/latch/EN -setup 10
可见,set_clock_gating_check约束在ICG cell上是成功的!
dc_shell> get_cells U_FIFOMEM/clk_gate_mem_reg[15]/latch
总之,gating cell一般出现在clock path的中间,而且往往比较靠近clock source,其latency 较小,在CTS(clock tree synthesis)综合时钟树的时候,ICG不会被看作sink因此并不会作为balance对象。
也就是说:
- 当check gating cell 的timing 时,其sink point 是在gating cell的CK端;
- 当CTS时,sink point是在gating cell后面的register;
而set_clock_gating_check是一种过约,是除了uncertaintly之外额外加在REG2CGATE路径上的约束。以使得ICG尽量摆在离后面寄存器更近一点。
另外,set_clock_gating_check约束通常只会在place阶段设置,在CTS及其以后取消掉。
在Place之前:
set_clock_gating_check
在CTS之后:remove_clock_gating_check
另外,CTS工具会对其做clone、declone操作。
- ICG cell Clone: 同一个ICG单元控制的寄存器较多或者分布不均匀时,就会导致ICG时钟连线过长,可通过clone ICG cell进行优化;
- ICG cell De-Clone: 同一个ICG单元控制的寄存器较少,导致ICG cell数量过多,可通过De-clone ICG cell进行优化;