本文转自:自己的微信公众号《集成电路设计及EDA教程》
时钟网络有其特殊性:1、频率最高;2、翻转最频繁;3、扇出最大。时钟单元:Buffer、Inverter、ICG;由于时钟网络的扇出很大,因此时钟树上的Buffer或者Inverter的驱动强度必须足够大。另外,由于时钟频率非常高,翻转非常频繁,因此如果有普通的Cell离时钟单元非常近的话很有可能会产生动态IR-drop问题。 解决方案:在时钟单元(Buffer、Inverter、ICG)周围添加Keepout Margin(在Innovus中称为Padding),防止其他Cell摆的离时钟单元太近,防止产生动态IR-drop,如下图所示。
命令:ICC2:我们可以针对一些Instance添加Keepout margin来解IR-Drop,思路在推文:IR-drop问题的分析与修复(含脚本分享)(一):Partition boundary cells clustering
已经介绍过,相关命令如下:create_keepout_margin -outer {3.6 0.576 3.6 0.576} $cells但是对于CTS的Cell,我们更希望对一些库里面的Cell来设置Keepout Margin,这样在CTS例化这些Cell来创建时钟树的时候就直接加上Keepout Margin了。命令如下:create_keepout_margin -type hard -outer "3.6 0.576 3.6 0.576" [get_lib_cells "*/*CLK* "] "3.6 0.576 3.6 0.576"分别是左、下、右、上四条边的keepout margin值。关于Keepout margin的更多呢内容可以查看推文: 后端概念分享--Keepout margin
Innovus:Innovus有两个加Padding的命令,一个是针对Instance来添加,命令为:specifyInstPad相关用法已经在详细介绍过了,这里就不讲了。这里我们更希望的是对某一类Cell的Reference来设置Padding,命令如下:specifyCellPad CLK* -top 1 -bottom 1 -left 2 -right 2
如何显示Cell Padding:
如果想看设计里面CLK Cell的位置其它们周边的Padding,可以用下面的命令:selectInst [dbGet top.insts.cell.name CLK* -p2]
最后,讲一下ICC2与Innovus两个命令之间的区别:
ICC2:create_keepout_margin -type hard -outer "3.6 0.576 3.6
0.576" [get_lib_cells "*/*CLK* "] Innovus:specifyCellPad
CLK* -top 1 -bottom 1 -left 2 -right 2 ICC2无论是给Instance还是给Cell加Padding,用的都是create_keepout_margin命令,而Innovus有两个命令,分别是specifyInstPad和specifyCellPad。ICC2的Keepout margin单位是um,而Innovus的cell padding单位是Cell site或者Row site的个数。