热度 11| |
约束文件中除了常见的timing constraint外,通常会加上DRC constraints,如set_max_transition, set_max_fanout, set_max_capacitance。如何设定这些DRC constraints的取值才合理呢?
max_fanout比较直观。有的.lib里会设一个50为上限。50其实有点大。不妨以20-35为起点,跑几次综合,比较一下gate count。通常差别不大。一般设计里high fanout的net并不多,无非就是clock,reset,scan_enable。其中reset,scan_enable的fanout在综合时通常会加上buffer tree,在Innovus的placement阶段可以进一步优化,而clock的fanout则在CTS时解决。
再看max_capacitance。暂且先不加set_max_capacitance。其实约束文件里没有set_max_capacitance,工具还是会计算max_capacitance的。.lib里每个cell的输出pin都有一个max_capacitance值。工具会自动算输出pin的load是否超出其max_capacitance并报出违例。在Innovus里,place_opt_design,optDesign都可以修复优化max_capacitance违例。
最重要的其实是max_transition。这个约束会对PPA (Performance, Power, Area)有影响,需要认真研究。先看对performance/timing的影响。下面是某个.lib里BUF_X2的信息。可以看到,这个cell在characterize的时候index_1 input net transition的上限是2.13333。通常库里所有的cell都是用同一套input_net_transition,total_output_net_capacitance来characterize的。这样,我们就知道整个设计的set_max_transition约束取值也应该<=input_net_transition的上限。这里要澄清一下,不是说max_transition超出这个上限工具就不能算timing了。其实工具还是可以做插值运算,但那样算出来的timing就不准了,风险也就大了。
还要说明一下,有的库不同的PVT corner下input_net_transition的上限也不同。对于设计而言,应该考虑以数字小的为上限。
那么是否set_max_transition约束就应该直接取input_net_transition的上限呢?其实也不是。如果我们仔细看上面这个表,两个index的取值并不是线性的,数值越大,相邻两个数值的差别就越大,也就是说二维表就越稀疏。我们知道工具是通过插值来计算timing的。表里的数据越稀疏,插值的误差可能就越大。如果一个设计对timing的要求很高,那我们就希望插值计算时取的数值越靠近表的左上方区域。也就是说set_max_transition约束取值小一点,设计的timing就可以算得越准。同理,也可以取一个略小于total_output_net_capacitance上限的值作为set_max_capacitance的约束取值。这个set_max_capacitance的约束取值通常远小于X8,X10,X12之类大驱动cell输出pin的max_capacitance。这也解释了为什么大驱动的cell用得很少。除了驱动输出,内部其实很少用到大驱动的cell。
那么是否set_max_transition约束值越小越好呢?不是的。以同一个cell为例,我们可以看一下input_net_transition对power的影响。对于同一个total_output_net_capacitance,大致可以看出input_net_transition越小,功耗越大,虽然只是大一点点。从表里的数字看,貌似在input_net_transition取最大的两个值时,功耗计算还有点非线性。所以从功耗角度出发,还是考虑把set_max_transition约束取值设得偏大一点。就这个表而言,我认为set_max_transition 0.6-0.8 都是合理的,timing可以算得准一些,也给了工具足够的空间优化功耗。
需要说明一下,如果不设set_max_transition,如果工具计算出来的transition time超过input_net_transition上限,工具是会报warning的。很多时候时间紧迫,不一定会有时间/脚本仔细检查log中的每一个warning。所以约束文件里还是要加一个set_max_transition,保险一些。
还要说明一下,set_max_transition 0.6 [current_design]是针对整个设计的。事实上在CTS的时候,clock tree的max_transition要设得小很多。在Innovus里set_ccopt_property target_max_trans,set_ccopt_property target_max_capacitance取值都会比整个设计的set_max_transition, set_max_capacitance要小很多。这样clock tree能实现low skew,close timing比较容易。当然, target_max_trans,target_max_capacitance取值也不能太小,还是要全盘考虑PPA。这是另一个话题了。
总结一下。
1. set_max_fanout 25 为起点,综合迭代几次。
2. set_max_transition, set_max_capacitance参考.lib,取值小于二维表index_1, index_2上限。
工作之余写点心得,希望能有帮助。时间仓促,如有谬误,请留言指正。
happy/ed: 谢谢楼主!我有些别的问题,在timing signoff阶段set_clock_uncertainty 这个值怎么考虑呢?和dc出来的timing constraint的差别在于? ...
jake: setup uncertainty通常取时钟周期5%-1010%
hold uncertainty通常取25-50ps或PDK signoff guide里推荐的数字
set_clock_uncertainty -setup [5% of your clock pe ...
jake: 等于过滤掉了index_1最后两个数字
乌拉啦: 在工厂没有给出signoff gui时是否均可以通过该种方式评估?还是有什么方式?
比如如下input trans,那么该如何评估signoff的trans呢?
index_1(“0.01,0.052, ...