马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 刺客无痕 于 2021-12-14 14:21 编辑
03 Place
Floorplan完成之后,我们差不多完成PR工作的中的大部分手动工作,进入纯粹的run job时间。而影响place的行为主要由parameter决定。这里引入AG的Parameter系统,在Parameter的体系里,所有影响工具表现的设定都可以找到,一般APR常用到的类型有以下几种
各种parameter的调教基本也是一个PR工程师的修养,好比雷神之锤在索尔手里是附魔武器,在美队手里是物理武器,跑到斯塔克手里是不可举起的武器一样,parameter的不同最终影响物理芯片的性能、面积、功耗(PPA),而这部分通常的工具厂商会提供整套的不同工艺节点下的通用设定来应付常规设计。AG也有对应的设定在AGflow中,此处给自己挖个坑,AGflow的玩法在稍后开新篇介绍。
搞定guide/parameter的设置后,基本上直接一个超级命令就可以跑完,现在的PR工具都喜欢用组合命令来更贴合流程,AG叫place_optimize,基本就是先place_cell ,然后调用opt engine 针对当前stage做优化。单独从流程方面来讲,placement跟吃一碗拉面没有任何区别,要不要葱花(设定是否允许filler1)、要不要加面(power effort要high还是low)、牛肉要不要另加(特定时序路径的path group是否设定slack adj)、加不加辣子(有没有cell group,要不要加padding)。最后report_ta去产生当前place阶段需要的所有timing report做时序分析。
在检查place结果时经常会发出标准三联问:为啥工具加了这么多buffer?这buffer的作用是啥?那个步骤给加进去的?一个简单清晰的命名规则会比较容易定位到出错的位置。AG的opt engine内的命名大致是这样的:
除了命名规则,report_placement–check可以帮助检查当前place的数据是否存在DRC问题;place 菜单下的Display Density/Congestion Map可以快速看出是否有拥塞超标的区域,用来判断是否需要在place开始前设立density的guide;Floorplan菜单下的Browse module功能可以自动给各个模块标识不同的颜色,在place迭代中会比较容易根据时序报告总结出需要group在一起的模块或逻辑。
Module browser
Density Map
完成了Place后,有了可接受的时序结果后,就可以进入下一步,CTS了
04 CTS
CTS是clocktree synthesis的简称,时钟树综合的工作就是规划下图CK1-4的点一直到两个DFF的CP端的buffer tree的部分,这部分clock tree有fanout、transation、cap以及不同clock之间的skew要求。
这活看起来很简单,不就是解决DRV分配Fanout,能做平的都做平么?为啥要单独分出一步来做?理想很骨感,现实很丰满。请看真实的clock tree结构
看出最大的区别了么?没错!就是sink的规模,解释原理的时候总是用寥寥数个sink的结构讲这讲那,但实际case中的sink数量,经常会成上万,甚至上到十万级别。此时人工分析或构建clock tree已经不可能,希望工具去Carry全场。现今工具处理clock tree的方式一般都是基于skew group的方式去建立时钟树,优点是综合的规模是以skew group为单位,skew group可以同时作为一个单一时钟的tree、一个多个clock的联合tree、或者只是某个clock下的sub-tree的形式同时存在,这些灵活多变的组合可以有效优化了balance的group的规模,获得更好的QoR.
而传统时钟树以clock为单位,会考虑所有sink的balance问题,必然会拉长时钟树,而且在处理多个时钟穿过的路径时,会因为频率不同而做出妥协,让快的时钟树故意拉长来跟慢的时钟作平衡。
时钟树的建立过程直接画脑图展示:
对于一个PR工程师来说总希望做出的时钟树latency-短、skew-小 级数-少,所以在完成后还要借助工具做一些CTS质量的检查
再次附上debug之宝,CTS阶段的naming rule
Tree做完之后,基本又是调用opt engine去做各类需要的优化,AG里的post_cts_opt默认会带上setup和hold一起去修正,如有特别需求的,例如不在postcts修hold,请在opt的parameter里关掉hold opt 相关的参数。查询parameter有个比较方便的方式,利用list_app_var opt *hold*可以打印出所有带有hold关键字的opt相关的parameter。下一回就要进入最后的绕线阶段了。
|