我们进行了时钟建模,设置了inputoutput_delay,这些都是为了DC对综合逻辑的优化而准备的.
我们知道std_cell各自都由延迟,DC不断替换期间,以满足时序要求。那么这些cell_delay到底是怎么一回事?
整个电路会被拆成 cell +net cell的延迟信息是一个范围值,它随着输入输出连接的信号的不同而呈现非线性变化.
net是纯导线,有着RC寄生效应.需要把这种delay时间也考虑进来.
总的来说: 查表去找寻 cell + net 各自的延迟,然后累加在一起啊,看是否符合时序要求。
对于cell的延迟,DC是根据 输入跳变速率 input transition 和 输出负载电容 out load 进行查表所得的。
对于net的延迟,DC是根据 wire_load模型的fanout-length、resistance、cap、area值进行查表所得的。
Cell 的delay模型
这是一个2输入与门, 我们可以感觉出 输入----输出之间的时间,可能受到 input 跳变速率、output负载电容、PVT(气压、电压、温度)等多方面共同影响。
如果负载电容变大,输出信号B的将呈现一种缓慢拉升的状态,如下左图:
如果输入A变化速率慢, 同样传导到输出端就会慢一些,如下右图:
我们知道, 电路会被综合成N多的cell,我们不可能说明每一个cell的输入跳变输出负载. 工艺厂商替我们想到了这个问题.
假设两个寄存器之间的verilog,被翻译成如图的组合逻辑。黑色粗线条是wire线。其余均是std-cell。
先理解一概概念:fanout,即驱动负载的能力大小。 And1的输出,要驱动一个not1门,以及And2的1个输出pin,Not1的输出只需要驱动nor1的一个pin。
std_cell每个cell的每个pin,肯定要消耗前一级的负载能力。而且消耗程度可能不尽相同。如果出现某个cell的输出端挂载了过多的负载,可能部分负载就不能正常
工作,这个跟宿舍里面一块用高压锅、电吹风、热水壶一个道理。
为了避免这种情况:我们要清楚的知道 一个cell的输出端,所能承受的最大负载值。 以及cell每一个输入pin,所要消耗的资源大小。
在lib文件中,对于cell的描述信息中,就包含了这两个信息: max_fanout ----输出引脚所能带动的最大负载值。
fanout_load ------输入引脚将消耗的资源。
如果不考虑导线的存在,直接把cell的引脚互联起来就行了。但是由于寄生参数,导线又不得不考虑。
我是这样认为的:如果一个cell驱动多个器件,那导线长度必定要增加,因为你需要走线去连接后面若干cell的pin。
所以,fanout值和互连线长度会呈现一定的关系: 下图就是:
Resistance: 是单位长度导线的电阻值, 0.000331kΩ
Capacitance: 是单位长度导线的电容值,0.000086pF
长度对应关系如表格. slop是计算超出部分的斜率值.
比如fanout 22的导线的长度应该是: 952.16+ (22-20)*93.7215 = 1139.6
所以这段导线的总阻值: R= 1139.6 * .000331 = 0.377 k. 总电容 Cnet = 1139.6 * 0.000086 = 0.098 pF.
如果一个net上连接若干个cell,net的模型可以参考下面三种建模方式:
导线delay的计算方法: 其实对于前后级cell互联的net有三种建模方法:每种的net_delay计算公式都不一样。
第一种: 我们认为前后级的cell离得很近,这时候我们认为导线是很短的.电阻接近于0.(电容不为0,这个我也没想清楚)
第二种: 是一种平衡式的走线模型,此时Dc值(即delay值) 计算公式如上.
第三种: 是最坏的走线模型,Dc值计算公式如上.
这是三种不同的建模方法,使用哪一种建模方式,由我们自己决定. 它取决于我们使用哪一种 corne------ BEST WORST NORMAL
我们知道,如果一段导线有Resistance、Cap值,会带来延迟以及影响输出端的transition time,根据导线的建模方式,我们知道了一段导线delay的计算公式,
但是我们还不知道transition的计算公式. 这个该怎么办呢? 我也不知道是不是由于理论上无法计算,还是出于别的原因.
把导线的电容连同Cpin值一起考虑. 这样理想的认为导线只具有delay效果,不具有改变transition time的效果
改变transition time 这个锅,交给cell来背了. 虽然不知道为啥这样做,但是我们看lib中cell的信息:
上面是两个表格,其中 input_trans值 是cell 输入pin的 transition time,Output_load 是 Cpin + Cnet.
根据这两个信息, 我们就能查表,找出该cell的延迟值,以及输出端的 transition time值.
此时导线只考虑 delay效果. 因此 output transition 又会作为下一个cell的input_transition, 依次嵌套下去。
从这个推演来看:
我们只要知道current_design的输入 transition,输出端的负载值。 然后通过建模导线,根据fanout,计算导线长度,Resistance、Cap值,计算导线延迟。
层层计算cell的延迟、transition时间。就能较为准确的描述整个路径的delay信息。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我们理解了这一个建模原理, 有必要了解下lib库文件里面包含哪些信息.
(1) 库名称
(2) 库的基本特征,比如工艺类型,版本号、库中参数的单位描述,电压是1V? 时间精度是1ns?电阻单位是1kΩ? corner类型,是Best、Typical、Worst
等等这些基本的信息。如下图:
(3) 库环境描述。
这个主要是描述,库的参数在不同的温度、电压、压强等条件的偏差情况。它是通过比例因子来描述的。
举个例子:我们一般情况下一个AND的cell_delay是1ns,但是在高温85℃,电压3,3V,cell_delay的计算需要再乘以一个系数K。
(4) wire模型。
这个是对net互连线所有模型的描述,跟上图中一样,包含了 单位长度电阻值、单位长度电容值、长度和fanout的对应表格等信息。
在这里,需要特别说一下: 我们的wire模型不是只有一个.会有许多个.
为什么要有那么多的模型呢? DC文档上是这样解释的: 在同一种工艺库下,可能每家fabless设计公司的芯片大小都不一样,
如果面积比较大, 相应的布线就先稀疏一些,后果就是net的线变长了.所以看上图140000 和800000规模下, wire的模型还是有区别的.
所以我们需要选择合适的模式. (DC好像能自动选择)
(5) cell描述
这个才是最重要的部分, 一个库内的cell信息,是我们最终想要映射的.
cell的信息包括: 面积、
每一个输出口所能承载的最大fanout值,输出口说能连接的最大电容值。
每一个输入口所消耗掉的fanout, 自己的Cpin值. 所支持的最大transition范围.
当然还有,每个cell, input-transition 和out_load ,生成的 cell-delay out_transition表格信息。
等等,我可能也说不太清楚.如下表:
lib库主要就是这5个方面的内容.