DC的初始化文件.synopsys.dc.setup,该文件是隐藏文件,需要用ls –a显示
1、 综合过程中需要设置和使用的库以及DC的初始化文件
2、 读取行为级描述或网表并进行链接
DC支持多种硬件描述格式, .db .v .vhd等
对于dcsh工作模式来说,读取不同的文件格式需要不同的参数
Read -format verilog[db\vhdl ect] file //dcsh工作模式
对于tcl工作模式来说,读取不同文件格式使用不同的命令。
Read_db file.db //tcl工作模式读取db格式
Read_verilog file.v //tcl工作模式读取verilog格式
Read_vhdl file.v //tcl工作模式读取vhdl格式
读取源程序的另外一种方式是配合使用analyzer命令和elaborate命令;
Analyzer是分析HDL的源程序并将分析产生的中间文件存于work(用户可以自己指定)的目录下
Elaborate则在产生的中间文件中生成verilog的模块或者VHDL的实体
缺省情况下,elaborate读取的是work目录中的文件
当读取完所要综合的模块后,需要使用link命令将读到DC存储区中的模块或实体连接起来
注意:如果在使用link命令后,出现unresolved design reference的警告信息,需要重新读取该模块,或者在.synopsys_dc.setup文件中天剑link_library,告诉DC到库中去找这些模块,同时还要注意search_path中的路径是否指向该模块或单元电路所在的目录
Link命令执行后,DC就将模块按照RTL级或者门级的描述将电路连接起来,之后的各种限制条件就可以对该电路的顶层模块施加
3、 定义电路的工作环境和综合环境
1) DC命令概述
DC限制条件施加的对象
针对以下电路成分:输入输出端口、模块、子模块的实例化、单元电路、连线及电路的引脚。
在使用DC命令的时候,不要使用模糊的对象,例如,如下面的电路:
Set_load 3 Clk
由于在电路中含有名称为CLK的pin、port和net,因此,DC无法知道该处的load是施加在哪个对象上,注意到一般连线会驱动负载,该命令就改为:
Set_load 3 [get_nets Clk] TCL mode
Set_load 3 find(net,”Clk”) dc_shell mode
路径的划分与合法路径
DC综合的时候是基于路径的优化,对于DC来说,合法的路径必须满足以下条件
路径的起点为输入端口或者是触发器的数据端
路径终点为输出端口或者是触发器的时钟端
DC设定的限制条件的值都是无单位的,这些单位都是由工艺库中给定的
可以用report_lib lib_name来查看所有在工艺库中设定的各个参数的单位
2) Set_operating_conditions
不同的工作环境对应的单元电路的延迟不相同
温度升高、电压降低、电路的特征线宽增大都会使得单元电路的延迟增大
电路的工作环境一般在工艺库中都有给定
命令格式:
set_operating_conditions [–min min_condition] [–max max_condition] [-min_library min_lib] [–max_library max_lib]
命令使用说明
指定DC进行优化时使用的工作环境,其中工作环境的指定必须在库中指定,或者在link_library中的其中一个库中指定,如果不指定operating_conditions,DC自动搜索link_library中的第一个库的工作环境作为优化时使用的工作环境
可以用get_attributes语句取得库中缺省的工作环境
-max选项指定电路最大延迟分析(分析电路是否满足触发器建立时间set up的要求)的工作环境
-min选项用于指定电路最小延迟分析(分析电路是否满足触发器保持时间hold time的要求)的工作环境,该选项不能单独使用,必须与-max同时使用
如果不指定用于分析最小延迟的库,则只使用-max中指定的库用于电路的延迟分析
-min_library选项指定用于电路最大延迟分析的工艺库
-max_library选项指定用于电路最小延迟分析的工艺库
3)set_min_library
Vendor可能提供多个不同的工艺库,用于分析电路的时序,不同工艺库定义了不同的工作环境、不同的线负载模型、不同的单元延迟时间,这是可以将这些苦都指定用于分析电路的延迟
命令格式:
set_min_library max_library –min_version min_library | -none
命令的使用说明:
该命令指定max_library用于分析电路的最大延迟,min_library用于分析电路的最小延迟。当DC需要计算路径的最小延迟时,首先在max_library中找到单元电路,如果在min_library中有和该单元电路有相同名称、相同的引脚名、相同的时序弧时,则使用min_library中给出的时序信息用于计算电路中路径的延迟
使用-none选项可以取消设定min_library
不要在target library中设置min_library对应的库
该命令只有当vendor提供两个库时才使用
4)set_wire_load_model
在DC计算路径的延迟时,工具会估计连线的延迟,该命令是设置一个连线延迟估计的模型。
但是在综合完成后,用report_timing –nets一般看到的连线延迟都是0,这是因为在做综合之前,工具使用的线负载模型是比较粗糙的,所以连线延迟比较小。另外,不仅互连线本身有延迟,互连线的寄生电容、寄生电阻会影响到单元电路的延迟
注意:在深亚微米、超级亚微米阶段互连线的延迟在整个路径的延迟中占一半左右。因此,现在一般在综合之前会做一次floorplan,然后提取出线负载模型来供综合工具使用,以便更加准确的估计连线延迟。Synopsys的另外一个工具physical compiler就可以将floorplan跟综合放在一起做
命令的格式为:
set_wire_load_model –name model_name –lib_name library –max –min
设置综合时使用的线负载模型,用于估计电路的连线延迟。由于布线之前没有准确的电路走线。因此,即使设置该模型,也不能准确估计电路的互连线延迟。
如果没有wire_load_model,可以将auto_wire_load_selection参数设置为true,则DC自动根据综合之后的面积来选择一个统计的线负载模型用于估计连线延迟
Set auto_wire_load_selection true
-max –min选项同上,分别指定该模型用于估计最大路径延迟和最小路径延迟。 -lib_name指定包含该线负载模型的工艺库
一个线负载模型的例子:
layout-grid-align:none;text-autospace:none">1: Name : 320KGATES 模块名称,用于引用该模块
2: Location : ssc_core_slow 该模块库的位置
3: Resistance : 0.000271 单位长度的连线电阻
4: Capacitance : 0.00017 单位长度的连线电容
5: Area : 0 连线所占面积
6: Slope : 55.6653 外推计算连线长度的斜率
7: Fanout Length Points Average Cap Std Deviation
8: --------------------------------------------------------------
9: 1 34.79 按照连线的扇出估计连线长度,从而估计连线延迟
10: 2 90.46
11: 3 146.12
12: 4 201.79
13: 5 257.45
5)set_wire_load_mode
如果只是在子模块综合中设置了线负载模型,那么跨模块边界的连线延迟如何估计,该命令就是用于设置模块互连线延迟估计所使用的模块
该模式有三种选择:
Top 指定模块互连线延迟的估计使用顶层模块的线负载模型
Enclosed 指定模块互连线延迟的估计使用包含该连线的最小模块的线负载模型
Segmented 将连线按模型边界分段,各段的延迟分别按照各自模块的线负载模型估计延迟,然后把估计结果相加得到该连线的延迟
命令的格式为:
set_wire_load_mode mode
其中mode 为top、enclosed、segmented
6)set_drive
为了更加准确的估计输入电路的延迟,DC需要知道信号到达输入端口的过渡时间(transition time)。Set_drive使用确定的值来估计输入端的输入电阻,从而得到输入端口的延迟;
而set_driving_cell是假定一个实际的外部驱动单元来估计输入的transition time
该命令用于设置输入端口或者双向端口上的电阻值,该电阻值是用于驱动输入端口的单元的输入电阻,因此,该值越大,就说明输入端口的驱动能力越弱,连线的延迟也就越大。
更常用的是set_driving_cell命令,以库中某个单元电路的引脚驱动能力为基准来模拟输入端口的驱动能力。
命令的格式:
set_drive resistance_value –max –min –rise –fall
命令使用要点
缺省情况下,该值为0,即输入具有无限大的驱动能力
电路的优化阶段,输入端口的驱动能力用于计算输入端口到门电路延迟,一般来说,输入端口的驱动能力可以按照以下公式影响延迟
Time = arrive_time + drive*net_load + connect_delay
7)set_driving_cell
该命令实现的功能和set_drive命令基本相同,set_driving_cell是指定使用库中某一个单元来驱动输入端口。该命令是在输入端口之前假想一个驱动单元,然后按照该单元的输出电阻来计算transition time,从而计算输入端口到门单元电路的延迟,如:
set_driving_cell –lib_cell buf1a3 –pin Y Reset
即设置Reset端口的驱动能力与单元bufla3的Y引脚驱动能力相同
用set_driving_cell命令后,会出现很多警告,因为加上driving_cell约束之后,相当于人为的给很多引脚加上设计规则的限制条件
8)set_load
由于外部电路的负载将会影响到接到端口上单元电路的延迟,因此需要对端口的带负载能力做限制。为了比较精确地计算输出电路的延迟,DC需要知道输出电路驱动的所有负载。
命令的格式:
set_load load_of(ssc_core_slow/buf1a2/A) [all_outputs]
即使用ssc_core_slow库中bufla2单元A引脚的电容负载来计算所有输出端口延迟。
电路负载的大小会影响到它的延迟,而且负载越大,延迟越大
DC在缺省情况下认为端口的负载电容都是0,因此具有无穷大的驱动能力