热度 2| |
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/20563101.html
注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!
Dc 综合是基于路径,每个路径上都有 Cell 和 net ,所以基于路径的综合就是计算路径上的 delay 和 rc ( dc 是使用互连线模型进行估算)。
在了解 delay 和 rc 的计算时,我们要先了解一下一个 cell 对于 drive (前级)和 driven (后级)所用到的模型是什么。如下图,一个 buffer ,从前级看过来是一个 load ( capacitance ,想获得这个 load ,可以通过 load_of buffer/a 获得) , 从后级看来是一个 drive ( resistance )。电路的的驱动能力是上一级的 1/R, 即电阻的倒数,驱动能力大,说明看过去的电阻小,也说明这个器件比较大(大器件有较大的驱动能力)。电路的负载能力是下一级的 load (即电容)总和,负载能力大,说明能驱动下级的期间就很多。
大器件是大电容,小电阻,而小器件是小电容,大电阻。理解这些,对于 dc 综合以及后端 apr 版图都有很好的操作。
对于 cell 的延迟, dc 是根据 input_transition 和 out_load 对应的查找表来计算的。
对于 net 的延迟, dc 是根据 wire_load_model 中的 fanout_length 得到互联线的 resistance , capacitance,结合上一级的out transition 的计算得到,而上以及的output transition是根据input transition和output load查表得到的。。
例如:
Wire_load(small){
Resistance : 0.2;
Capacitance : 1.0;
Area :0;
Slop :1.0;
Fanout_length(1,0.022);
Fanout_length(2,0.046);
Fanout_length(3,0.070);
Fanout_length(4,0.095); # 根据fanout定义一个等效一个互连线的长度
}
比如现在扇出是 2 ,
根据 fanout_length ( 2 , 0.046 )可以知道这个互连线的长度是 0.046 ,然后再根据 capacitance , resistence 可以得出这个互连线的电容为: 0.046x1.0, 互连线电阻为: 0.046x0.02 。
如果扇出是 5 ,在查找表中没有找到 fanout_length 为 5 的項,互连线长度将会是 =fanout_length(4,0.095)+(5-4)*slop=0.095+1*1.0=1.095
得出了rc就可以计算出信号线的延迟
实际的互联线如下:
无论如何,要记住的就是 dc 是基于路径分析的(怎么划分路径请参考另一篇:http://bb2hh.blogbus.com/logs/20463915.html),每个路径上有 cell 延迟和 net 延迟,而 cell 延迟是根据 input_transition 和 out_lod 得出的, net 延迟是根据 fanout_length , resistance , capacitanc 得出的。驱动和电阻成反比,负载和电容成正比。
由上面可以知道 fanout 影响到 load ( capacitance ), transition , delay 。了解了上面,我们来理解下 dc 中对 design 建模,所用到的一些跟 fanout 有关的参数。
Dc 中的约束,其实就是给 chip 设计一个环境,比如驱动这个 chip 输入端口的 cell ,或者这个 chip 输出端口驱动了那些单元或者端口接入了哪些负载,以及这个芯片的工艺,电压,温度,等等。。。
对于一个 cell 来说,输出端口具有 max_fanout 属性,输入端口有 fanout_load 属性。
fanout_load是说连接这一个pin等价于多少个fanout。可以直接理解成n fanout per load,更简单的理解为n net per pin:这个pin相当于n个net。一般库中输入pin的fanout_load为1,输出pin的fanout_load为0.
便于理解:max_fanout=max_net,fanout_load=nets per pin
例如将一个 AND2 作为 design 的驱动 cell(set_driving_cell) ,这样就把 AND2 的 max_fanout 属性加在了输入端口上(即用max_fanout约束了输入端口)。如果一个 AND2 的输出端口 max_fanout 是 5 ,输入端口 fanout_load 是 2 。一个 buffer 输入端口的 fanout_load 是 3 。那么这个 AND2 的输出端可以接 2 个 AND2 ,或者可以接一个 buffer ,或者可以接一个 buffer 和一个 AND2 。如上图所示,则会引起 DC 产生 DRC 错误。因为输入端口的 fanout_load=2XAND2+buffer=7 ,超过了 AND2 的 max_fanout2. 如果使用了系统提供的 set_max_fanout 5 [all_inputs], 将会忽略 set_driving_cell 中 cell 的 max_fanout 属性,而使用 set_max_fanout 属性
如果将一个 AND2 作为 design 的负载,那么这个输出端口上的 fanout_load 属性将会为 2,即如果连接这个输出端口,则相当于使用了2个net.dc 中一般的做法是 set_fanout_load [expr [get_attribute slow/and2/a fanout_load] *xxx] [all_outputs] ,来设置输出端口的 fanout_load 属性,即设置了输出端口等效几根net。
这样 dc 就可以根据这些设置,选择优化端口处的器件,以及时序。
下面讲下 fanout 与 delay ,看如下一个例子:
到 buffer 的 net 延迟是 2 , buffer 延迟是 1 , fanout 为 1 时 net 延迟为 3 ,每增加一个扇出, net 延迟增加 2. 如果一个信号经过这个扇出网络后,那么 延迟 为: 2+1+ ( 3+ ( 8-1 )× 2 ) =20 ;
如果把扇出结构优化成如下形式:
那么信号经过这个网络后, 延迟为: 2+1+2+1+ ( 3+ ( 4-1 )× 2 ) =15.
那么延迟减少了 5 。
接下来讲一下 skew ,既然知道了 fanout 对于 delay 的影响,下面看一个例子:
由于时钟到每个触发器的互连线长短不一样,造成信号到达 clock pin 的时间也不一样,触发器也不会同时翻转。 Skew 的定义就是最长路径减去最短路径的值。
根据时钟域以及路径关系, skew 可以分为 global skew , local skew , interclock skew 。
Global skew 是指,同一时钟域,任意路径的最大 skew 。
Local skew 是指,同一时钟域,任意 2 个有逻辑关联关系的路径最大 skew 。
interClock skew 是指,不同时钟域之间路径的最大 skew
另外还有一个 useful skew 。本来打算在 setup time 和 hold time 中讲解。这里先大概说下
如下图:时钟周期为 10ns ,各时钟路径延迟如下:可以看到有一条路径的 slack 为 -1 ,说明这条路径违规。可以看到与这条路径相关的 skew 是 T3-T2=-1ns 。
下面我们利用 useful skew 向前面一个 slack 比较充裕的路径( slack=2ns )借点 time ,来修正现在这条路径。如下图:
经过 useful skew ,修正了原来的 violator 。
这就是 useful skew 的作用,可以向前,或者向后接 time 来修正 violato