Design Compiler时一个约束驱动(constraint-driven)的综合工具,它的结果与设计者施加的约束条件密切相关。
一、面积约束
进行面积的约束,也就是告诉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”命令,为面积做较快的优化。这样做,既可以优化面积,又可以缩短运行时间。
最后我们用set_max_area命令为设计作面积的约束。例如:
set_max_area 10000
当设计不是很大的时候,根据上面的描述,我们就可以使用下面的命令进行面积约束:
set_max_area 0
让DC做最大的面积优化约束。
二、时序约束
关于时序约束,我们要做的是约束电路中的所有时序路径。这些时序路径可以分为四类(具体可见静态时序分析系列):输入到寄存器的路径、寄存器到寄存器之间的路径、寄存器到输出的路径、输入直接到输出的路径。
我们以常见的同步电路为例:
在电路综合过程中,所有时序电路以及组合电路的优化都是以时钟为基准来计算路径延迟的,因此,要在综合时候指定时钟,作为估计路径延迟的基准。
1、定义时钟
- 用户必须定义的值:colck source(pin or port)
- 用户可能需要定义的值:duty cycle、offset/skew、clock name
create_clock -period 10 [get_ports Clk]
set_dont_touch_network [get_clocks Clk]
对所有定义的时钟网络设置为dont_touch,即综合时候不对Clk信号进行优化。这是为什么呢?
实际的电路设计中,时钟树的综合(CTS)有自己的方法,它需要考虑到实际布线后的物理信息,所以DC不需要在这里对时钟树进行处理。
我们使用create_clock后,情况如下:
这里我们需要定义IO相对于时钟的一些时序。
2、定义输入延迟
我们要定义的输入延迟是指被综合模块外的寄存器触发的信号在到达被综合模块之前的延时。即下图中的Tclk-q和M电路的延时之和。
当Tclk-q和TM(Path M的延时)确定之后,由于时钟也是确定的,则TN(Path N的延时)也将会确定。
我们用set_input_delay命令定义输入延迟。
set_input_delay -max 4 -clock Clk [get_ports A]
由于输入延迟是相对于时钟的,所以需要注明时钟域。
3、定义输出延迟
信号在被综合模块的触发器里被触发,被外围的一个触发器接收,对外围电路而言,它有一个T电路延时和外围触发器的建立时间要求。
由于时钟是确定的,当T电路延时和外围触发器的建立时间要求确定之后,被综合模块内部的输出路径延时范围也确定了下来。
我们用set_output_delay命令定义输出延迟。
set_output_delay -max 4 -clock Clk [get_ports B]
三、DRC约束
常见的DRC约束有三种
- set_max_transition 约束设计中的信号、端口、net的transition time。net的transition time取决于net的负载(fan-out),负载越大,transition time越大。
- set_max_fanout 对design、net、output port进行操作,设定的不是具体的电容值。扇出负载值用来表示与单元输入引脚相对的负载的数目,并不表示真正的电容负载,而是个无量纲的数字。
- set_max_capacitance 基于工艺库的信息设定
四、环境约束
之前的约束对待综合电路进行了许多条件限制,但还有许多方面未提及,如环境温度、供电电压、外围负载等,我们在这一节进行说明。
1、设置负载
为了更加准确地估计模块输出的时序,除了知道输出延时外,还需要知道输出负载情况,负载越大,output port的transition time越大,影响时序。
由于DC默认输出负载为0,即相当于不接负载,则这样综合的电路时序过于乐观,不能反映真实工作情况。
常用指令如下
set_load 5 [get_ports OUT] //直接设置
set_load [load_of my_lib/and2a0/A] [get_ports OUT] //使用工艺库中现有的单元的load值来进行代替
set_load expr[[load_of my_lib/and2a0/A*3]] [get_ports OUT]
2、设置驱动
除了知道输出延时、输出负载情况外,DC还需要知道input port 的transition time。同样地,默认情况下,DC默认外部信号transition time为0。
set_driving_cell允许用户自行定义一个实际的外部驱动cell,同样地,可以用工艺库现有的单元的值来代替。
set_driving_cell -lib_cell and2a0 \[get_ports IN]
set_driving_cell -lib_cell FD1 -pin Q [get_potrs IN]
set_drive以电阻值为计量,0表示最大驱动强度,通常为时钟端口.
3、设置工作条件
Foundry提供的工艺库里,各个单元的延时实在一个标准的条件下得到的。在考虑延时时,还需要考虑工艺制程、电压、温度(PVT)的影响。
上图可以看到PVT对延时的影响。因此,工艺库中提供了几种工作条件的模型(operating condition model)供设计者选择,我们可以用:report_lib libname命令把厂商提供的所有工作条件列出来。一般综合只考虑最好和最差两种情况:最差情况用于建立时间的时序分析,最好情况用于保持时间的时序分析。
set_operating_conditions -max $OPERA_CONDITION -max_library $LIB_NAME
4、设置连线延时
在计算时序路径延迟时,除了需要知道门单元延迟外,还需要知道连线的延迟。
连线的延迟目前一般用(连)线负载模型( Wire Load Model,简称WLM)估算。WLM是厂商根据多种已经生产出来芯片的统计结果,在同样的工艺下,计算出在某个设计规模范围内(例如门数为0~43478.00、门数为43478.00~86956.00,等等)负载扇出为1的连线的平均长度,负载扇出为2的连线的平均长度,负载扇出为3的连线的平均长度等等。
WLM是根据连线的扇出进行估算连线的RC寄生参数,一般情况下,由半导体厂商建立。厂商根据已生产出来的其他设计统计出该工艺的连线寄生参数。半导体厂商提供的工艺库中包括了线负载模型。通常在一个综合库里面有多种线负载模型,不同的模型模拟不同规模的的模块内的线上负载情况。用户也可以自己创建自己的线负载模型去更精确地模拟设计内的线上负载。
连线延时模型如下图:
如果要查看工艺库中的WLM,可以使用命令:report_lib $lib_name,进行综合时,综合工具会默认根据设计面积和节点处的负载自动选择合适的连线负载模型,如果要关掉自动选择WLM,那么可以使用命令:
set auto_wire_load_selection false
然后手动选择线负载模型的命令是:
set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME
如果连线穿越层次边界,连接两个不同的模块,那么有三种方式对这种跨模块线连接的类型进行建模,set_wire_load_mode命令用于设置连线负载模型的模式。有三种模式供选择:top、segmented和enclosed。
- enclosed:连接B1和B2的连线负载模型用围绕它们的模块的负载模型代替,即用SUB的负载模型代替。
- top:连接B1和B2的连线负载模型用顶层模块的负载模型代替,即用TOP的负载模型代替。
- segmented:分别用穿过的三段的模型相加得到。
set_wire_load_mode top
5、检查
在设置完环境约束之后,可以用以下指令来检查约束是否添加成功。
- check_timing:检查设计是否有路径未加入约束
- check_design:检查设计中是否有悬空管脚或者输出短接的情况
- write_script:将施加的约束和属性写到一个文件中,检查该文件看看是否正确。
五、实例
下面是一个实际的tcl脚本。