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

本文的主要内容是讲解(约束针对的是逻辑综合下的约束,而实战部分则是在DC的拓扑模式下进行):

·环境属性的约束

·设计规则的约束

·面积的约束

·实战(部分)环境属性的约束

1、工作环境属性约束

输入/输出端口及其驱动属性是设计规格的一部分,工作环境的约束,是对这个规格约束的一部分。

工作环境约束一方面是设置DC的工作环境,也就是DC要从在什么样的环境下对你的设计进行约束,举个例子,比如你的芯片要在恶劣的环境中进行工作,DC如果在优质的环境中对你的设计进行约束,你的芯片生产出来,就很有可能工作不了。因此一般就要告诉DC,使用恶劣的模型对设计进行约束。另一方面是为了保证电路的每一条时序路径延时计算的精确性,特别是输入/输出路径的精确性,单单靠外部的输入延时和输出延时的约束是不够,还要提供设计的环境属性。

这个约束可以看成是宏观的、整体的、外在的约束,约束的内容可以从下图看出:

·设置环境条件(setoperatingconditions)

用于描述制造工艺、工作电压与温度(PVT,process,voltage,temperature)这些周围环境对延时的影响。工艺库单元通常用“nominal”电压和温度来描述其默认的特性,例如:

器件与线网上的延时在条件不同的时候呈线性变换。库文件中,包含对各种不同条件的具体描述,如slow,fast,typical等,对于芯片工作的最差、最好及典型的具体描述(具体见标准单元库那一节)。通过设置不同的操作条件,可以覆盖到各种不同的情况。

如果电路在不同于“nominal”电压和或温度的条件下工作,我们需要为设计设置工作条件(Operating Conditions),我们可以用setoperatingconditions命令把工作条件加入到设计上。综合时,原来按"nominal”环境计算出的单元延迟和连线延迟,将按工作条件作适当的比例调整,如下图为为延迟与工作条件的关系:


讲解完工作环境条件是什么之后,下面就介绍与它有关的常见的命令以及约束。工艺库中通常指定一个默认的工作条件.我们可以用:report_lib libname命令把厂商提供的所有工作条件列出来。

设置工作条件可用下面命令举例如下:

setoperatingconditions -max $OPERACONDITION -maxlibrary $LIB_NAME

·设置线负载模型(setwireload_model):

在计算时序路径延迟时,除了需要知道门单元延迟外,还需要知道连线的延迟,如下图所示:

门单元的延迟一般用非线性延迟模型(non-linear delay model)算出。半导体厂商提供的工艺库中,有两个二维表格,根据门单元的输入转换时间输出负载在表中找出门单元的延迟以及其输出转换时间。输出转换时间又作为下一级电路的输人转换时间。门单元的延迟在综合库那一节详细介绍。

连线的延迟目前一般用(连)线负载模型( Wire Load Model,简称WLM)估算。WLM是厂商根据多种已经生产出来芯片的统计结果,在同样的工艺下,计算出在某个设计规模范围内(例如门数为0~43478.00、门数为43478.00~86956.00,等等)负载扇出为1连线的平均长度,负载扇出为2的连线的平均长度,负载扇出为3的连线的平均长度等等。WLM是根据连线的扇出进行估算连线的RC寄生参数,一般情况下,由半导体厂商建立。厂商根据已生产出来的其他设计统计出该工艺的连线寄生参数。半导体厂商提供的工艺库中包括了线负载模型。通常在一个综合库里面有多种线负载模型,不同的模型模拟不同规模的的模块内的线上负载情况(具体见综合库描述那一节)。用户也可以自己创建自己的线负载模型去更精确地模拟设计内的线上负载。连线负载模型的格式如下图所示(上),具体格式由工艺库决定(下):

关于线负载模型的更多内容,可以参考综合库/工艺库那一节。


线负载模型为DC提供统计性估算的线网负载信息,随后DC使用这些线网负载信息,以负载的大小为函数来模拟线上的延时(也就是设置这个约束是用来模拟线延时)。因此设置线负载模型。

如DC遇到连线的扇出大于模型中列出的最大扇出值,它将使用外推斜率(Extrapolation slope)来计算连线的长度。上例格式中,如果连线的扇出为7,而连线负载模型中最大扇出是5,连线的其长度计算如下:


讲完线负载模型是什么东西,为什么设置线负载模型约束之后,下面介绍与其相关的命令。

如果要查看工艺库中的WLM,可以使用命令:reportlib $libname,进行综合时,综合工具会默认根据设计面积和节点处的负载自动选择合适的连线负载模型,如果要关掉自动选择WLM,那么可以使用命令:

set autowireload_selection false

然后手动选择线负载模型的命令是:

setwireloadmodel -name $WIRELOADMODEL -library $LIBNAME

如果连线穿越层次边界,连接两个不同的模块,那么有三种方式对这种跨模块线连接的类型进行建模,setwireload_mode命令用于设置连线负载模型的模式。有三种模式供选择:top、segment和enclosed。三种模式的示意图如下所示:

由图可见, 该设计的顶层设计(top)包括一个子模块, 该子模块又包括两个更小的模块。顶层设计对应的连线负载模型为50×50;子模块对应的连线负载模型为40×40;更小的两个模块对应的负载模型为20×20和30×30。

假设有一个连线贯穿两个小模块, 但没有超出子模块的范围。对于这种连线, 在三种模式下, 所用的连线负载模型是不同的,下面是介绍:

比较悲观的形式这时,top为顶层设计,电路的规模比SUB模块大,连线负载模型最悲观。在top模式下, 采用top层的连线负载模型, 即50×50;因此,连线的延迟最大。我们一般选用这种方式,命令如下:

setwireload_mode top

比较不悲观方式用enclosed的方式选择WLM,该WLM对应的设计完全地包住这条连线,这时DC将选择SUB模块对应的连线负载模型。在enclosed模式下, 采用子模块的连线负载模型, 即40×40;因SUB模块比较TOP设计小,所以连线的延迟比较短(不悲观,就是连线延时小)。对应的命令为:

setwireload_mode enclosed

segmented模式下, 位于两个小模块中的部分采用这两个小模块对应的连线负载模型, 中间部分采用子模块的连线负载模型。

驱动强度、电容负载这些约束是要经验的,一方面是对I/O口进行约束,属于I/O口的约束,为时序约束与时序分析提供了路径,更是为输入/输出路径延时约束的精确性提供保证;一方面是对I/O口对外的环境进行约束,可以算是属于环境约束,因此放在这里进行讲解。

·设置驱动强度(setdrive与setdriving_cell)

为input或者inout的端口设定驱动。Setdrive以电阻值为计量,0表示最大驱动强度,通常为时钟端口;而setdriving_cell则以模拟端口驱动的器件形式计量,说明输入端口是由一个真实的外部单元驱动。

为什么要需要为input或者inout的端口设定驱动?这是因为,对于输入端,为了精确计算输入电路的延时时间,DC需要知道到达输入端口转换时间


在默认情况下,DC假设输入端口上的外部信号转换时间是0 ,也就是从上升沿跳变到下降沿或者下降沿跳变到上升沿的时间是0,这是不符合实际情况的。通过设置驱动强度,就告诉DC这个设输入端口实际上是由一个真实的外部单元驱动的,不是理想的;DC就会计算输入信号的实际转换时间,仿佛指定某一个库单元正在驱动输入端,下面是输入端IN1 由FD1的输出引脚驱动的例子:

对应的约束可以这样写:

setdrivingcell -libcell FD1 -pin Q [getpotrs IN1]

如果不用开关选项“-pin",DC将使用所找到的第一只引脚(库中这个单元的第一个引脚,这个驱动引脚貌似是要选择输出的引脚)。

此外,除了通过这两种方式,还可以直接设置输入端口的转换时间,如下所示:

setinputtransition 时间 [get_ports 设计对象]

·设置电容负载(setload与setload load of)

明确说明端口(输入或输出)上的外部电容负载。对于输出端,为了精确地计算输出电路的延时时间,DC需要知道输出单元所驱动的总负载:

默认情况下,DC假设端口上的外部电容负载为0。我们可以指定电容负载为某些常数值,也可以通过用loacl_ of选项明确说明电容负载的值为工艺库中某一单元引脚的负载(一般是选择输入引脚


跟设计输入输出延时一样,设计者往往并不知道每个模块输入端口的外部驱动单元和/或输出端口的外部输出负载。因此我们要通过负载预算(Load Budget),为输入/输出端口设置环境的约束。产生负载的原则如下:

1.保守起见,假设输入端口为驱动能力弱的单元驱动(即转换时间长);

2.限制每一个输入端口的输入电容(负载);

3.估算输出端口的驱动模块数目。

例如:(只是举例)对于下面的电路图:

其规格为:模块输入端口驱动的负载不大于10个“AND2”门的输入引脚的负载,模块输出端口最多允许连接3模块,如果某个输出端需要连接多于3个模块,我们要在代码中复制该输端口

对应的约束为:

环境约束举例如下所示:

语法中,设置(定义变量时),如上面的:

Set ALLINEXCEPTCLK [removefromcollection [allinputs] [getports $CLKNAME”]]中,后面的removefromcollection是移除设计物集对象的意思,我们知道,DC可以将设计识别成多个对象,比如输入端口、输出端口等等,然后这个就是从allinputs这个对象集合中,移除掉CLKNAME这些代表的端口;如果命令之中有命令时,需要用[]来括起来。

然后是expr是表达式求值的意思,因为loadof取出了一个端口的负载值(因为有loadof这个命令,即命令中有命令,因此需要加[]),这个值*10 是个表达式,因此用expr来指出求值,求值是一个命令,因此用[]括了起来。

上面中,LIBNAMEWIRELOADMODEL、DRIVECELL 、DRIVEPIN、OPERACONDITION这些变量的内容都不是随便定义的,需要根据综合库书写,下面进行解释,库的具体内容参考综合库那一节。

LIB_NAME库的名字,这里使用的恶劣的情况:


WIRELOADMODEL线负载模型,打开slow.lib这文件,可以找到各种线负载模型:

约束中选的是w150的。

DRIVE_CELL驱动单元,也就是用来模拟驱动输入端的驱动单元,这要选择库中有的单元,比如反相器:

DRIVE_PIN驱动管脚,为单元的输出管脚,也就是“Y”了。

OPERA_CONDITION这个操作环境也是要填写库里面有的:


设置完这些变量之后,还设置ALLINEXCEPTCLKMAXLOAD变量,其中ALLINEXCEPTCLK变量代表了除了时钟之外的输入管脚。MAXLOAD变量就表示了最大的负载,代表的是库中某个单元的输入负载值。

最后面的就是设置工作环境了。

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

全部评论
没想到这东西这么复杂啊
点赞 回复 分享
发布于 2022-07-16 13:14

相关推荐

昨天 20:43
西北大学 Java
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务