DC综合6--环境、设计规则和面积约束(下)
2、设置设计规则约束
setmaxtransition、setmaxfanout、setmaxcapacitance
主要是设置最大转换时间、最大扇出及最大负载电容要求,可以设置在输入端口、输出端口以及当前设计。举个前面的环境约束的例子说,比如我约束了输入端口的最大转换时间和负载,也约束输出最大扇出,如下图所示:
当综合和优化了,计算发现输入端口实际的转换时间比约束的大,或者负载比约束的大(模块输入端口驱动的负载大于10个“AND2”门的输入引脚的负载),或者检测到输出端口的扇出数比约束的要多(模块输出端口最多允许连接3模块,如果某个输出端需要连接多于3个模块),这时候就违背了设计规则,DC就会报错了。
库单元的设计规则(design rule)一如下所示:
下面我们来详细叙述一下DC进行综合时设计规则约束:
DC在做综合时,把设计规则的优先级设置为最高。优先级的从高到低次序为:最大电容(maxcapacitance)、最大转换时间(maxtransition)、最大扇出(max_fanout).
·最大电容(maxcapacitance)的约束,例如对于下面的电路:
对应的最大的电容约束如下:
【1】set DRIVEPIN TECHLIB/invla27/Y
【2】set MAXCAP [getattribute $DRIVEPIN maxcapacitance]
【3】set CONSERVATIVE_ MAXCAP [expr $MAXCAP / 2.0]
当设置了输入端口的负载之后,也就是:
那么DC可以给输入端口 IN1 施加的最大内部负载是:1.8 - 1.2 = 0.6pf。
·最大转换时间(max_transition)的设计约束,例如前面的电路,可以进行下面的最大转换时间约束:
set DRIVE_ PIN TECH_ LIB/invla27/Y
#在实际驱动的时候,增加一些富余量使DC不会给它加满载,也就是实际上的转换时间不超过CONSERVATIVE_ MAX_TRANS,也就是0.200ns。
set CONSERVATIVE_ MAXTRANS [expr $MAXTRANS / 2.0}]
约束之后,DC考虑驱动单元的类型和它的外部负载, DC限制输入端口IN1的内部负载来满足的设计规则,也就满足你这个转换时间,让它不超过该0.2ns。
·最大扇出(max_fanout)的设计规则的约束,例如对于下面的电路:
要注意setmaxfanout命令使用的是扇出负载(fanout_load),而不是绝对的扇出数目。端口的扇出负载之和必须小于最大扇出的设计规则的约束。进行上面的约束之后,DC在综合时会查看有没有违反规则,我们也可以自己查看有没有违反设计规则,用下面命令可以得到单元invla和invla27的扇出负载:
getattribute TECHLIB/invla1/A fanout_load --->比如说是0.25
因此就有DC可以在端口IN1连接6/0.25=24个invla1单元,或在端口IN1连接6/3. 00=2个invla27单元。但是对于上面的电路,其IN1端口的扇出负载之和为:
因此,电路违反了最大扇出负载的设计规则约束。
与扇出有关的还有线负载模型,线负载模型根据连线的扇出数目来估算连线电阻和电容值。连线的扇出数目定义为单元输出引脚与其他单元的输入引脚之间连接的数目。与连线的扇出数目不同,扇出负载属性是附加在单元的输入端口,不同单元可以有不同的扇出负载属性。
一些工艺库中,某些单元的引脚没有扇出负载属性。这时,DC会检查库中默认的扇出负载属性(defaultfanoutload) 。如果库中没有默认的扇出负载属性,DC假设其值为“0",即这些单元的引脚不受扇出负载的设计规则约束。我们可以强制使端口的扇出数目为1,即只与一个单元连接,如果库中单元的扇出负载最小值为1. 0,用下面的命令加上扇出负载的设计规则约束:
如果库中单元的扇出负载最小值不为1. 0,我们需要先找出扇出负载最小的单元(假设为bufla1),计算出其扇出负载值,然后加上扇出负载的设计规则约束:
set SMALLCELL TECHLIB/bufla1/A
set SMALLFOL [getattribute $SMALLCELL fanoutload]
setmaxfanout $SMALLFOL [allinputs]
扇出负载值是用来表示单元输人引脚相对负载的数目,它并不表示真正的电容负载,而是个无量纲的数字。
如果我们所用的所有库单元扇出负载为“1",那么setmaxfanout 1. 0 [allinputs]约束将强制所有的输人端口扇出数目为1,即它们只能与一个单元连接。否则,为了使输入端口只能与一个单元连接,我们要找出库中哪一个单元的扇出负载最小,在setmax_ fanout命令中使用这个值来保证在这个端口上只连接一个单元。如果单元上没有扇出负载属性并且库中本身也没有(默认)预设的扇出负载属性,那么把它设为1. 0是有意义和效用的。我们也可以在输出端口上指定扇出负载值。例如,假设一个内部单元驱动几个其他的单元并且也同时驱动一个输出端口。我们可以用set_ load命令来指定那个输出端口的实际电容负载。set_ load命令帮助DC在综合时遵从驱动单元的最大电容设计规则,但该命令并没有为驱动单元的扇出提供独立的约束。在输出端口使用set_ fanout_ load命令时,我们可以为输出端口建立额外的预期扇出负载模型,综合时DC同时也会使内部驱动单元的最大扇出遵守设计规则的要求。
3、面积约束
下面就是进行面积的约束,也就是告诉DC综合的电路面积要在多少以内。在介绍约束命令之前,先了解一下面积的单位。面积的单位可以是:
·2输入与非门(2-input-NAND-gate)
·晶体管数目(Transistors)
此外,我们往往看到一个芯片是多少多少门,这多少门的数字就是拿芯片的总面积,除以2输入与非门的面积得到的数值。用report_lib命令不可显示面积的单位,我们要询问半导体厂商面积的单位是什么。
如果不设置面积的约束,Design Compiler将做最小限度的面积优化。设置了面积的约束后,DC将在达到面积约束目标时退出的面积优化。如果设置面积的约束为“0" , DC将为面积做优化直到再继续优化也不能有大的效果。这时,DC将中止优化。注意,对于很大(如百万门电路)的设计,如将面积的约束设置为“0" , DC可能要花很长的时间为设计做面积优化。综合时,运行的时间很长。
在超深亚微米(deep sub-micro)工艺中,一般说来,面积并不是设计的主要目标,对设计的成本影响不大。因此,我们在初次优化时,可以不设置面积的约束。优化后,检查得到的设计面积,然后将其乘上一个百分数(例如8500),将其结果作为设计的面积约束。再为设计做增量编辑,运行“compile -inc”命令,为面积做较快的优化。这样做,既可以优化面积,又可以缩短运行时间。
最后我们用setmaxarea命令为设计作面积的约束。例如:
setmaxarea 10000
当设计不是很大的时候,根据上面的描述,我们就可以使用下面的命令进行面积约束:
setmaxarea 0
4、实战
由于种种原因,这里只有环境属性的约束的实战,其他的约束也可以通过上面的讲解和下面的这个实战进行设计。
首先,我们来看看设计约束规格:
(设计原理图)
(设计规范)
在前面一节的基本时序约束规范上加上下面的规范:
·约束文件的编写
基本的时序路径约束和上一节一样,不进行改动,下面进行工作环境的约束:
-->输入端口的驱动设置:
1.要我们使用库里面的bufbd1来驱动除了clk和Cin*之外的所有输入端口:
这里是直接使用库里面的单元来驱动的,根据前面的讲解,我们很容易得到约束的命令为:
setdrivingcell -libcell bufbd1 -library cb13fs120tsmcmax [removefromcollection [allinputs] [get_ports "clk Cin*"]]
(命令的格式为)setdrivingcell -lib_cell 单元的名字 -library 单元所在库的名字 要设置约束的对象
2.Cin*是芯片级的端口,需要加上120ps的最大转化时间,这是直接设置转换时间,因此可以这样约束:
-->输出负载的约束:
1.除了cout输出,其它输出驱动值都是库单元bufbd7的引脚I负载值的两倍,也就是用单元的端口进行约束,因此有:
2.cout驱动最大值为25pf的负载,因此可以这样设置:
-->操作环境的设置:
由于用到了库里面的单元,我们还在最好设置一下操作环境,虽然DC可以从启动环境里面找到单元所在的位置库,但是我也要设置操作环境,如下所示:
下面的步骤跟前面的一样,这里就不展开描述了:
·启动DC,设计读入前的检查
·读入设计和检查设计
·执行约束和检查约束
·进行综合
...