随笔 - 188  文章 - 2  评论 - 20  阅读 - 53万 

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

一是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就会用新的参数。

posted on   春风一郎  阅读(3945)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示