DC综合6--环境、设计规则和面积约束(下)

2、设置设计规则约束

setmaxtransition、setmaxfanout、setmaxcapacitance

主要是设置最大转换时间、最大扇出及最大负载电容要求,可以设置在输入端口、输出端口以及当前设计。举个前面的环境约束的例子说,比如我约束了输入端口的最大转换时间和负载,也约束输出最大扇出,如下图所示:

当综合和优化了,计算发现输入端口实际的转换时间约束的大,或者负载比约束的大(模块输入端口驱动的负载大于10个“AND2”门的输入引脚的负载),或者检测到输出端口的扇出数比约束的要多(模块输出端口最多允许连接3模块,如果某个输出端需要连接多于3个模块),这时候就违背了设计规则,DC就会报错了。

半导体厂商在工艺库强加了设计规则。这些规则根据电容、转换时间和扇出(capacitance,transition和fanout)来约束有多少个单元可以相互联结。设计规则一般由半导体厂商提供,在使用工艺库中的逻辑单元时对其联结所强加的限制。例如,如果设计中一个逻辑单元的负载(其驱动的负载)大于库中给定的其最大负载电容(max_capacitance)值,半导体厂商将不能保证该电路能正常工作。我们只可以按照设计规则的约束或按照更严格的设计规则约束来设计电路,而不可以放松约束。Design Compiler在综合时使用加入缓冲器(buffering)和改变门单元的驱动能力(cell sizing)技术来满足设计规则的目标。

库单元的设计规则(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]

【4】set_ max_ capacitance $CONSERVATIVE_ MAXCAP [getports IN1]

约束的意思是:首先【1】处,我们选择使用综合库里面库单元的一个输出引脚作为设计中预期驱动器的最大允许电容负载,其值通过【2】得到,假设为3.6pf,也就是MAXCAP = 3.6pf。然后通过【3】设置约束时使用的最大电容变量,除以2是在驱动器增加一些富余量使DC不会给它加满载。最后【4】就是设置输入引脚IN1的最大电容量为CONSERVATIVE MAX_CAP,也就是1.8pf。

当设置了输入端口的负载之后,也就是:

setload 1.2 [ get ports IN1]

那么DC可以给输入端口 IN1 施加的最大内部负载是:1.8 - 1.2 = 0.6pf。

我们可以用“setmaxcapacitance 3. 0 $ current_design”命令为整个设计中加入最大电容的设计规则。此处,用了3. 0为最大的电容值,设计时我们可以根据工艺库和电路的具体情况,选用合适的数值。要注意不要施加过度保守的约束,以免严重地限制DC对设计的优化。当然,如果库内定的值不够恰当或者过于乐观,我们可以手动设置,以控制设计的裕量。

·最大转换时间(max_transition)的设计约束,例如前面的电路,可以进行下面的最大转换时间约束:

#从工艺库找出设计中预期驱动器的最大允许转换时间,也就是最大转换时间可以像这个引脚这么大,假设其值为0.400ns。

set DRIVE_ PIN TECH_ LIB/invla27/Y

set MAXTRANS [getattribute $DRIVEPIN maxtransition]

#在实际驱动的时候,增加一些富余量使DC不会给它加满载,也就是实际上的转换时间不超过CONSERVATIVE_ MAX_TRANS,也就是0.200ns。

set CONSERVATIVE_ MAXTRANS [expr $MAXTRANS / 2.0}]

set_ maxtransition $CONSERVATIVE MAX_ TRANS [get_ports IN1]

约束之后,DC考虑驱动单元的类型和它的外部负载, DC限制输入端口IN1的内部负载来满足的设计规则,也就满足你这个转换时间,让它不超过该0.2ns。

有时候我们可以在整个设计上施加最大转换时间的设计约束,以帮助防止可能在长连线上出现的慢(长)的转换时间,从而导致设计中出现特别长的延迟。施加最大转换时间的设计约束也可以约束单元输出端的转换时间以减少其功耗。我们可以用’setmaxtransition 0. 4 $ current_design,命令在整个设计中加入最大转换时间的设计规则。此处,用了0. 4为最大转换时间值,设计时我们可以根据工艺库和电路的具体情况,选用合适的数值。要注意不要人为地加紧对整个设计的约束,以免限制DC对设计中真正关键器件的适当优化。

·最大扇出(max_fanout)的设计规则的约束,例如对于下面的电路:


setmaxfanout命令为设计设置最大扇出的设计规则的约束,例如:
setmaxfanout 6 [get_ports IN1]

要注意setmaxfanout命令使用的是扇出负载(fanout_load),而不是绝对的扇出数目。端口的扇出负载之和必须小于最大扇出的设计规则的约束。进行上面的约束之后,DC在综合时会查看有没有违反规则,我们也可以自己查看有没有违反设计规则,用下面命令可以得到单元invla和invla27的扇出负载:

getattribute TECHLIB/invla1/A fanout_load --->比如说是0.25

getattribute TECHLIB/invla27/A fanout_load --->比如说是3.0

因此就有DC可以在端口IN1连接6/0.25=24个invla1单元,或在端口IN1连接6/3. 00=2个invla27单元。但是对于上面的电路,其IN1端口的扇出负载之和为:

3*fanoutload(invla1/A)+ 2*fanoutload(invla27/A)=(3 x 0.25)+(2x3.0)=6.75

因此,电路违反了最大扇出负载的设计规则约束。

与扇出有关的还有线负载模型,线负载模型根据连线的扇出数目来估算连线电阻和电容值。连线的扇出数目定义为单元输出引脚与其他单元的输入引脚之间连接的数目。与连线的扇出数目不同,扇出负载属性是附加在单元的输入端口,不同单元可以有不同的扇出负载属性。

我们可以用如下的命令限制整个设计的扇出负载:setmaxfanout 6 $current_design ,在对FPGA做综合,常常使用此命令。它也适用于ASIC的综合,特别是线负载模型和单元的输入负载不大精确时使用。

一些工艺库中,某些单元的引脚没有扇出负载属性。这时,DC会检查库中默认的扇出负载属性(defaultfanoutload) 。如果库中没有默认的扇出负载属性,DC假设其值为“0",即这些单元的引脚不受扇出负载的设计规则约束。我们可以强制使端口的扇出数目为1,即只与一个单元连接,如果库中单元的扇出负载最小值为1. 0,用下面的命令加上扇出负载的设计规则约束:

setmaxfanout 1.0 [all_inputs]

如果库中单元的扇出负载最小值不为1. 0,我们需要先找出扇出负载最小的单元(假设为bufla1),计算出其扇出负载值,然后加上扇出负载的设计规则约束:

set SMALLCELL TECHLIB/bufla1/A

set SMALLFOL [getattribute $SMALLCELL fanoutload]


#库中单元的扇出负载最小值为0. 5000

setmaxfanout $SMALLFOL [allinputs]

扇出负载值是用来表示单元输人引脚相对负载的数目,它并不表示真正的电容负载,而是个无量纲的数字。

如果我们所用的所有库单元扇出负载为“1",那么setmaxfanout 1. 0 [allinputs]约束将强制所有的输人端口扇出数目为1,即它们只能与一个单元连接。否则,为了使输入端口只能与一个单元连接,我们要找出库中哪一个单元的扇出负载最小,在setmax_ fanout命令中使用这个值来保证在这个端口上只连接一个单元。如果单元上没有扇出负载属性并且库中本身也没有(默认)预设的扇出负载属性,那么把它设为1. 0是有意义和效用的。我们也可以在输出端口上指定扇出负载值。例如,假设一个内部单元驱动几个其他的单元并且也同时驱动一个输出端口。我们可以用set_ load命令来指定那个输出端口的实际电容负载。set_ load命令帮助DC在综合时遵从驱动单元的最大电容设计规则,但该命令并没有为驱动单元的扇出提供独立的约束。在输出端口使用set_ fanout_ load命令时,我们可以为输出端口建立额外的预期扇出负载模型,综合时DC同时也会使内部驱动单元的最大扇出遵守设计规则的要求。

可以使用下面命令reportconstraint -allviolators查看是否违反设计规则。

3、面积约束

下面就是进行面积的约束,也就是告诉DC综合的电路面积要在多少以内。在介绍约束命令之前,先了解一下面积的单位。面积的单位可以是:

·2输入与非门(2-input-NAND-gate)

·晶体管数目(Transistors)

·平方微米(Square microns)

此外,我们往往看到一个芯片是多少多少门,这多少门的数字就是拿芯片的总面积,除以2输入与非门的面积得到的数值。用report_lib命令不可显示面积的单位,我们要询问半导体厂商面积的单位是什么。

如果不设置面积的约束,Design Compiler将做最小限度的面积优化。设置了面积的约束后,DC将在达到面积约束目标时退出的面积优化。如果设置面积的约束为“0" , DC将为面积做优化直到再继续优化也不能有大的效果。这时,DC将中止优化。注意,对于很大(如百万门电路)的设计,如将面积的约束设置为“0" , DC可能要花很长的时间为设计做面积优化。综合时,运行的时间很长。

在超深亚微米(deep sub-micro)工艺中,一般说来,面积并不是设计的主要目标,对设计的成本影响不大。因此,我们在初次优化时,可以不设置面积的约束。优化后,检查得到的设计面积,然后将其乘上一个百分数(例如8500),将其结果作为设计的面积约束。再为设计做增量编辑,运行“compile -inc”命令,为面积做较快的优化。这样做,既可以优化面积,又可以缩短运行时间。

最后我们用setmaxarea命令为设计作面积的约束。例如:

setmaxarea 10000

当设计不是很大的时候,根据上面的描述,我们就可以使用下面的命令进行面积约束:

setmaxarea 0

让DC做最大的面积优化约束。

4、实战

由于种种原因,这里只有环境属性的约束的实战,其他的约束也可以通过上面的讲解和下面的这个实战进行设计。

首先,我们来看看设计约束规格:

(设计原理图)

(设计规范)

在前面一节的基本时序约束规范上加上下面的规范:


·DC启动环境的设置我们根据设计原理图和设计规范开始进行实践:
(跟上一节一样,这里不再重复)

·约束文件的编写

基本的时序路径约束和上一节一样,不进行改动,下面进行工作环境的约束:

-->输入端口的驱动设置:

1.要我们使用库里面的bufbd1来驱动除了clk和Cin*之外的所有输入端口:

这里是直接使用库里面的单元来驱动的,根据前面的讲解,我们很容易得到约束的命令为:

setdrivingcell -libcell bufbd1 -library cb13fs120tsmcmax [removefromcollection [allinputs] [get_ports "clk Cin*"]]

(命令的格式为)setdrivingcell -lib_cell 单元的名字 -library 单元所在库的名字 要设置约束的对象

注意:当一条命令太长,要进行分割时,使用反斜杠\作为分隔符,且反斜杠后面不能加空格。

2.Cin*是芯片级的端口,需要加上120ps的最大转化时间,这是直接设置转换时间,因此可以这样约束:

setinputtransition 0.12 [get_ports Cin*]

-->输出负载的约束:

1.除了cout输出,其它输出驱动值都是库单元bufbd7的引脚I负载值的两倍,也就是用单元的端口进行约束,因此有:

setload [expr 2 * {[loadof cb13fs120tsmcmax/bufbd7/I]}] [get_ports out*]

2.cout驱动最大值为25pf的负载,因此可以这样设置:

setload 0.025 [getports Cout*]

-->操作环境的设置:

由于用到了库里面的单元,我们还在最好设置一下操作环境,虽然DC可以从启动环境里面找到单元所在的位置库,但是我也要设置操作环境,如下所示:

setoperatingconditions -max cb13fs120tsmcmax

下面的步骤跟前面的一样,这里就不展开描述了:

·启动DC,设计读入前的检查

·读入设计和检查设计

·执行约束和检查约束

·进行综合

...

本系列均为转载。出处为 http://www.cnblogs.com/IClearner/ ,作者:IC_learner

全部评论
感觉这挺难的啊
点赞 回复 分享
发布于 2022-07-12 08:21

相关推荐

点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客企业服务