<DC guide ---9>

我们进行了时钟建模,设置了input\output_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个方面的内容.

   

 

                        

 

posted @ 2017-10-10 23:40  mokang0421  阅读(610)  评论(0编辑  收藏  举报