如何控制std cell的密度?

其实,关于密度有两个说法。

一是utilization,也就是设计的利用率。一般来说,为了成本考虑,利用率能做的越高越好,也就是std cell密度越高越好。

二是在利用率确定的情况下,std cell的局部密度,也是今天要讨论的话题。

在设计的面积已经确定的情况下,std cell局部密度是越低越好?还是越高越好?答案当然是不一定。

局部密度高,对时序好。因为线短,net delay小,transition小,cell delay也小。但是,局部密度过高,可能对绕线不好,另一个风险是没有足够的空间给eco来修timing和修hold等。

局部密度低,恰恰相反,对绕线好,但是对timing差,对power也不好。

所以,一般的设计里,局部密度要综合考虑:即congestion严重的地方,cell密度要低点;timing要求高的地方,cell密度可以高点。所以整个设计里的密度通常看起来是不均匀的。

那么在ICC2里,到底是在控制密度?

答案是placer(或者叫coarse placer)。placer在ICC2里至少有三处被调用:

第一处:place_opt -from initial_place -to initial_place

第二处:place_opt -from final_place -to final_place

第三处:clock_opt -from final_opto

如果脚本里还有使用create_placement,那也是在调用placer。

placer会在timing要求高的地方,把std cell摆的紧凑,局部密度高。在有congestion的地方,把std cell往四周推开,让这个区域密度低,有利于解决congestion。

下一个问题来了,密度需要高的地方,可以高到什么程度?解congestion往四周推散cell,推的力度又可以到达什么程度?

ICC2里有两个对应的参数来控制。前者用max_density,后者用max_util。

max_density用来控制放std cell时的最高密度,最高不可以超过它。

max_util来控制解congestion时,往四周推散cell的力度,最高不可以超过它。比如max_util=0.9,那么往周围推散cell时,周围的std cell密度(利用率)达到了0.9就停止推了,即使还没有完全解决congestion也会停下来。因为再往四周退散,四周密度超过90%,就有很大的风险了。

max_util=0.9,那么往周围推散cell时,周围的std cell密度(利用率)达到了0.9就停止推了,即使还没有完全解决congestion也会停下来。因为再往四周退散,四周密度超过90%,就有很大的风险了。

两个参数都是用来控制最高密度,但是作用不一样。前者是开始放std cell的时候,能达到的最高密度;后者是placer解cogestion时,能推到什么程度。虽然两者都是placer一起同时控制的,但为了理解方便,我们可以认为有先后顺序。即先按max_density做placement,再按照max_utli来推散cell解congestion。

局部密度一定要合理,根据你的设计来定,没有固定的值。

好了,理解了这两个概念,控制起来就非常简单了。

均匀密度

 

要让std cell在设计里均匀摆放,很简单,就是设置如下变量

place.coarse.auto_density_control=false

place.coarse.max_density=0

自动密度控制选项关掉且max_density=0,则placer就会均匀的摆放std cell。

聪明的读者可能会问,你不是说placer还会看max_util这个参数吗?如果这个参数设置了,那密度还会均匀吗?

答案是看你有没有用congestion driven的placement。

比如create_placement, 不加任何参数时,不是congestion driven,这时不看max_utli。create_placement -congestion,则是congestion driven,是会看max_utli的。

place_opt -from initial_place -to initial_place,不是congestion driven

place_opt -from final_place -to final_place,是congestion driven

对于绝大多数flow来说,都会跑final_place这步骤,所以设计不会完全均匀;会在局部有congestion的地方,密度会低些(它周围会高点)。所以均匀密度也是指大体均匀,还是需要去解决congestion的。

来个均匀密度的例子。

而对于非均匀密度的控制,工具提供两种方式:自动挡手动挡。大多数设计用自动挡就足够了。但不排除有些设计对密度要求特别严,这时候就需要手动挡了。

自动挡

 

place.coarse.auto_density_control = true

place.coarse.max_density=0 (default value)

place.coarse.congestion_driven_max_util=0.93(default value)

自动密度控制开关打开后,另外两个app option用默认值,工具自动决定各个阶段的max_density和max_util,具体的值如下:

Stage

Max_density

Max_util

initial_place

0.2

0.87

2nd pass incr place

0.6

0.87

final_place

0.7

0.90

clock_opt place

0.8

0.93

细心的读者会发现,自动挡并不是一个固定的值,而是在不同的阶段有不同的值。并且随着步骤的进行,density也越来越高。

手动挡

 

如果想自己控制密度,那也很简单,设置如下变量即可:

place.coarse.auto_density_control=false

place.coarse.max_density = xxx

place.coarse.congestion_driven_max_util = xxx

手动挡设定后,每个步骤的placer都会遵从这个设置。如果你想不同步骤的placer的密度不一样,你也可以做完上一个placement后,及时修改这两个参数,那么后面的placer就会用新的参数。

原文地址:https://www.cnblogs.com/lelin/p/12588022.html