目录
为什么要CTS
CTS就是时钟树综合。时钟树就是指从某个时钟root点长到sink点的buffer/inverter树,时钟树综合,顾名思义,就是指对时钟树进行综合:生成时钟树,使得同一时钟尽量尽快、同时地到达不同寄存器,对抗时钟源到不同终点寄存器的距离的不一致,保证不同寄存器的相位一致。
CTS是P&R(Placement&Route)阶段的一个重要流程,它进行在placement之后,信号routing之前。在CTS完成后,design就有了真实的时钟(propagated clock,传播时钟。相对于CTS完成之前人为设定的理想时钟),在这之后就可以利用抽RC工具抽取design的真实RC用以后续的STA(Static Timing Analysis),进行精确的timing check。
在CTS中,上面提到的尽量快其实就是latency尽量小,尽量同时就是skew尽量小。这也是CTS的两个重要指标:
smaller latency
smaller skew
除此之外,对于CTS的评价还有其他考虑,比如:
better timing
better power
longer common path
smaller area on chip
分别是指更优秀的时序性能,更合理的功率分配,更长的公共路径(减少OCV,on chip variation),更小的面积。简而言之,就是PPA的全方位提升。
基础概念
这里对CTS中会用到的一些名词作解释。
Latency:从时钟源端(source)到时钟终端(sink)的路径delay。
Skew:不同sink的latency之差。分为global skew及local skew,global skew为同一时钟下的最大latency差,local skew为任意两个有时序关系的路径之间的skew。PR工具在分析timing时,更多关注的local skew。
Useful skew:从进行timing check的路径的前后级借用一定的margin,来满足当前的时序要求。比如我们要对下图最后一级做setup check,而此时的slack为-1ns,存在违例。这时候我们向前一级比较充裕的slack借用1ns的时间,这时候两条路径都满足了时序要求。
NDR:Non-Default rule,非默认规则,比如2倍线宽,2倍线间距,可以减少latency,减少串扰。
Shielding net:屏蔽层,通常是地线,用来减少串扰并保证更好的占空比。
OCV:On Chip Variation,不同位置V&T不同导致的片上误差。
CTS完成哪些工作
如何使同一时钟在最短时间内同时到达不同寄存器呢?工具的优化目标就是:尽量将某个时钟到不同sink的路径做到相同长度。大体包括三个工作:
1.插入buffer/inverter
2.时钟绕线
3.检查timing
我的理解是,插入inverter和buffer会一定程度的增加路径的latency,通过对不同路径插入不同数量的buffer/inverter,并辅以尽量对称的时钟树结构(对称绕线),就可以平衡到达不同sink的时间差(skew)。
下面左图是没有时钟树的虚拟时钟连接,右图是做完CTS后的时钟树,这是一个H-树。可以看到它有着基本对称的结构和长度,并且有尽量长的common path。
CTS时钟树结构
除此之外,时钟树还有其他结构。下面左图就是上面示例中的H-树,优点就是对称结构的skew小,缺点是实际设计中这样对称的布线难度是非常高的,适用范围比较受限。右图是fishbone树(鱼骨树)。fishbone树有着较粗的主干,通常为多倍宽度,多倍线间距的NDR,其他寄存器像鱼的脊骨一样挂载在主干上,形成一个长条分布的时钟区域,不同分支之间的路径通过inverter/buffer做平衡。这样的好处是common path特别长,可以尽量减小OCV的影响,减小skew。坏处就是主干部分会占用非常多的绕线资源。适用于高速运算处理器。
除此之外,还有为了减少反射电流影响的而收缩分支线宽的“裁剪状的H树”(下左c),为了减少走线长度的对称树“X树”(下左b),适用于分层时钟树设计的“平衡树”(下左d)。以及平衡效果更好但是更加复杂的网状时钟树(下右ab)。
选择插入buffer还是inverter
上面一直在讲可以通过插入buffer或者inverter来调节latency达到平衡时钟的目的,那在CTS中到底是插buffer还是inverter呢?答案是inverter。因为在进行CTS时要插入的buffer/inverter非常多,它们对信号带来的影响会累加,而相比于buffer,经过两级inverter驱动的信号具有更好的信号完整性(inverter是反相器,所以要两级)。
下图是信号经过等间距摆放的inverter驱动后的输出,它的上升下降沿都是对称的。而且inverter有自校正作用,就算有畸形也会在下一级inverter自动校正。这在时钟树中至关重要。
下图是等距摆放的buffer。我们当然希望理想的buffer如下图中上面那行一样,信号怎么进去就怎么出来,这要求buffer由两个完全相同的inverter级联而成。而实际上为了节省面积,标准单元库的buffer是由一级小inverter驱动一个大inverter。
我们知道,影响单元延迟的因素包括input_transition和output_load,显然,这一大一小两个inverter的input_transition和output_load很不均衡,这会导致输出波形的上升下降沿的不对称,input_transition大于output_transition,造成占空比畸形。随着深度的增加,脉冲宽度也会被吸收的越来越窄。
同时,inverter的leakage power也小于buffer,因此有更小的静态功耗;inverter的skew也会更小(skew会随latency缩放)。所以推荐使用inverter来生成时钟树。当然,inverter也有缺点,为了保证信号相位一致,inverter只能成对插入,导致skew不太好调。
总结:
时钟绕线步骤
要进行时钟绕线,进行CTS之前,首先要进行global总体绕线(optDesignGlobalRouteStep);接着工程师按照一定的CTS策略进行CTS配置(CTS configuration),包括NDR规则设置,clock cell类型设置,transition设置,线长&扇出数的设置等 ;接着工具进行时钟树综合,这中间又包括聚类,建立时钟树,修时钟树,反复迭代,最后balance;最后完成时钟的绕线。
上述是工具行为的描述,具体到工程师的工作思路及工作内容,可以参见:
数字后端基础技能之:CTS(上篇)_数字后端cts_IC后端小白的博客-CSDN博客
数字后端基础技能之:CTS(中篇)_ic后端cts_IC后端小白的博客-CSDN博客
数字后端基础技能之:CTS(下篇)_cts插入过多delay_IC后端小白的博客-CSDN博客
还没接触软件,对工具语言还很陌生,等深入学习后有新的体会再来补充。