EDA12--DC脚本命令(一)


前面讨论了影响DC综合工具逻辑推断的四大因素中前三个,分别为 工艺库、层次划分、编码风格,现在来系统的讲述第四个影响因素: 编译指令,即DC所用到的命令。

一、流程简介

Design Compiler有两种命令行接口,dcsh模式和TCL模式,其中TCL命令行模式使用的范围更广,下图描述了综合基本流程及涉及的主要命令。
在终端上输入TCL命令时,有些机器上可能不支持退格键(Back Space),那么可以尝试 Ctrl+h和Delete 键。
在后续命令执行过程中,命令设置成功则返回“1”,失败则返回“0”。
在这里插入图片描述

二、启动DC

启动dc_shell的dcsh模式。dc_shell;
启动dc_shell的TCL模式。dc_shell-t;

三、读入与链接

DC提供了两种读入设计的方法:read和 analyze+elaborate

3.1 analyze+elaborate

3.1.1 analyze命令

analyze命令:用于分析 HIDL 代码,检查设计错误以便为设计建立基于通用库的逻辑结构,并将中间结果存入指定的库中。语法格式为:

analyze [-library library_name] [-format verilog| vhdl | sverilog] file_list
-library:指定中间结果存放的库,即工Linux 系统下的一个目录,默认为当前目录,也可以用define_design_lib 命令指定。
-format:HDL 源文件的类型,即verilog 、vhdl 、sverilog。
file_list:源代码文件名列表,文件名的指定可以通过TCL的链表命令{ }、” ” 、
[list file_name]等三种方法之一完成。

3.1.2 elaborate命令

elaborate 命令:为设计建立与工艺无关、即 GTECI 库上的结构级描述,为后续的优化和映射做好准备,并支持参数传递。对设计进行描述,需要对各个设计单独进行。语法格式为:

elaborate design_name [-library library_name] [-parameters param_list]
deisgn_name:指需要进行描述的设计。
-library:用于保存设计的结构级描述。
-parameters:指定给设计传递的参数,若省略则参数使用缺省值:参数用” ”括起来。
dc_shell->elaborate xsoc   ----本设计不需传递参数

DC可以综合出各种类型的触发器和锁存器,其中触发器类型有:
DFF: 普通寄存器,没有复位reset、置位 set、使能enable 等;
DFF w/Async: 带有一个异步控制端set或reset的DFF;
DFF w/Dual Async: 带有两个昇步控制端set和reset 的DFF;
DFF w/Sync cntl: 带有同步控制端的DFF。
锁存器类型有:
Latch: 普通锁存器,没有复位 reset、置位set、使能enable 等:
Latch w/Async: 带有一个异步控制端 set 或 reset 的 Latch:
Latch w/Dual Async: 带有两个异步控制端 set 和 feset 的 Iatch;
Latch w/Sync clr: 带有同步clear 端的 Latch。

3.2 read命令

read命令可以一步完成 analyze&elaborate的工作,也可以用来读取 db、EDIF等格式的设计(analyze+elaborate仅读取 VHDL和Verilog 设计文件)。但是,read命令无法支持参数传递以及VHDL 中的构造体选择等功能。语法格式为:

read_file [-format format_name] file_list

-format:指定设计读入的格式,可以ddc、db、verilog、vhdl、sverilog、edif、equation、pla、st等,对应不同格式命令可以替换为read db、read_edif、read_ verilog、read_vhdl、read_sverilog等。
file_list: 源代码文件名列表,文件名的指定可以通过TCL的链表命令{ }、” ”、[list file_name]等三种方法之一完成。

read_verilog VR_FIFO.v

设计读入之后。 工作环境设置之前通常进行链接和实例唯一化,相应命令为:

dc_shell-t> current_design xsoc  	----设置顶层设计为当前设计
dc_shell-t> link					-----链接
dc_shell-t> uniquify				----实例唯一化

示例:

#6_set_main_design
 current_design $top_level
 link  ;              #工艺库链接
 uniquify

采用 uniquify 命令进行实例唯一化前后设计的差别,对于被多次实例化的同一子设计,由于其例化后的工作环境各不相同,因此,需要用uniquify 命令为每个实例在内存中创建一份副本,以便区分开每个实例。DC可以根据不同的应用环境进行合适的优化。
这里需要注意的是:若设计中包含PAD模块,应在uniquify之前对PAD模块设置dont_touch属性。

dc_shell-t>set_dont_touch [get_designs PAD_INS] ——PAD_INS为PAD模块名称。

对于多次例化的子设计,其处理方法还有两种:dont_touch和ungroup,dont_tonoh 方法的工作步骤是:首先对于设计的上层设计施加约束,然后用最坏情况对子没计进行characterize(关于character,在讨论编译策略时介绍),然后优化该设计,并对优化后的子设计设置dont_touch属性,最后优化上层设计。对应命令为:

dc_shell-t>current_design D_design
dc_shell-t>characterize U1 (U1是设计名称还是实例化名称)	
dc_shell-t>current_design Ades (Ades和U1之间的关系)
dc_shell-t>compile
dc_shell-t>current_design D_design
dc_shell-t>set_dont_touch [list U1 U3]
dc_shell-t>compile

ungroup 方法会去掉层次并产生一个设计,其中所有的cell 和reference 都只有唯一的名称。但由于该方法改变了设计的层次关系,通常使用较少。

四、工作环境设置

在读入设计后,需要指定设计的工作环境,包括电路的工作条件线负载模型以及I/O端口属性如输入驱动、输出负载等情况。

4.1 设置工作条件

在设置工作条件之前可以通过list_libs命令查看可用的工艺库。
工艺库的建模通常是关于PVT的建模,单元和互连线的延迟会因工作条件变化而在标值之间波动,延迟于PVT的关系如图:
在这里插入图片描述
由于在逻辑综合阶段以最大化建立时间为目标,所以工作条件通常设为最坏情況。对应命令为:set_operating_conditions

dc_shell-t>set_operating_ conditions WORST

若同时指定最好情况和最坏情况,对修正保持时间违例比较有用,但自前一般不推荐使用。

dc_shell-t>set_operating_ conditions -max WORST -min BEST

4.2 设置连线负载

线负载模型用于估算电路中互连线的长度和扇出对电阻、电容和面积等的影响,DC 采用线负载模型中指定的数字计算互连线延时和电路的工作速度。线负载模型可以显式指定也可以由工具自动选择。显式指定通过命令 set_wire_load_ model 完成,其语法格式为:

set_wire_load_model -name model_name [-library lib]

-name:线负载模型的名称
-library:包含所指定线负载模型的库名称,若当前读入的目标库唯一则该选项可省略。

假定选择的线负载模型的名称为:reference_area_20000,则对应的命令为:

dc_shell-t> set_wire_load_model -name reference_area_20000;

若由工具自动选择线负载模型,则需设置变量 auto_wire_load_selection 为true,其命令为:

dc_shell-t> set auto_wire_load_selection true

4.3 设置线负载工作方式

线负载模型的工作模式有三种:top、enclosed segmented ,目前多使用 segmented。对应的命令为:

dc_shell-t> set_wire_load_mode segmented

实际中线负载模型及其工作模式的选择可能因 foundry而异,建议设计者使用前先行咨询目标厂商。
由于待综合设计的外部环境不确定,即驱动该设计的外部逻辑和按收来自该设计信号的逻辑不确定,所以需要设计者依据规范制定系统接口的相关属性,主要包括输入驱动强度、输出 负载能力、连线或引脚的电容货载以及设计规则约束等。

4.4 设置输入负载

在DC中,驱动强度用电阻值表示,阻值越小表示驱动能力越大,默认情况下DC认为输入端口的驱动电阻阻值为0,即驱动强度无限大。但0值通常用于时钟和复位等扇出很大的端口。对其他端口,为避免这种不切实际的驱动强度,可以采用set_driveset_driving_cell 两条命令来设置输入端口的驱动强度。

4.4.1 set_drive

set_drive命令通过直接指定驱动电阻值对输入端口或双向端口设置fall_drive或rise_drive 属性。语法格式为:

set_drive resistance [-rise] [-fall] port_list
resistance:非负的驱动电阻值,该值越小表示驱动强度越大;
-rise/-fall :指定是rise_drive属性还是fall_drive属性,如果都不指定,则 rise_drive=fall_drive=resistance。
port_list:驱动强度设置为resistance 的输入端口或双向端口列表。
dc_shell-t> set_drive 0 [list clk rst_n]
#时钟和复位端口的驱动强度设为无穷大。

set_drive 命令可以和 drive_of命令结合使用,比如采用 smicl3_ ss 库中单元IVHID1X 的引脚Z的驱动能力表示clk和rst_n的驱动能力,其命令为:

dc_shell-t> set_drive [expr [drive_of smic13_ss/ IVHD1X/Z] [list clk rst]

若用 smic13_ss库中单元 INVHD1X 的引脚Z的驱动强度的 8倍表示 clk 的驱动强度,则命令为:

dc_shell-t> set_drive [expr [drive of smic3_ss/ INVHDIX/Z]*8] [get_ports clk]

4.4.2 set_driving_cell

set_driving_cell 命令对输入端口或双向端口的驱动电阻进行建模,将驱动单元(只有一个输出)或驱动单元特定引脚的驱动强度表示为端口的驱动强度,同时也把驱动单元的设计规则约束应用于待指定驱动强度的端口。语法格式为:

set_driving_cell [-lib_cell lib_cell_name] [-library lib] [-pin pin_name] [-no_design rule] port_list

-lib_cell : 用于驱动设计输入端口的库单元名称。
-library  : lib_cell 所在库的名称,若当前仅读入唯一的目标库且驱动单元就在该库中,则该选项可省略。
-pin     : 用于驱动设计输入端口的单元引脚名称,若单元只有一个输出,该项可略去;若有多个输出,但不指定,则 DC 采用第一个找到的引脚。
-no_design_rule :该选项要求 DC 忽咯驱动单元引脚上的设计规则。
port_list :设置驱动强度的输入端口或双向端口列表。

比如用smic13I0_02_line_ss库中单元 PLBI8N 的驱动强度表示所有输入端口的驱动强度,其命令为:

dc_shell-t> set_driving_cell -library smic13I0_02_line_ss -lib cell PLBI8N [all_inputs]

4.4.3 set_ideal_network

如果设计中包含PAD 模块,那么在指定时钟、复位等高扇出端口的驱动能力时,应使用set_ideal_network命令,且其强度应施加在 PAD 单元的输出线上。比如,时钟端口经PAD单元RAD_INS送入,PAD_INS的输出引脚连接到互连线PAD_CLK_O上,则其命令设置为:

dc_shell-t> set_ideal_network -no_ propagate [get_nets PAD_INS/PAD_CLK_O]

set_drive命令只对线性延附模型是准确的,而对非线性延时模型不适用,set_driving_cell命令对各种延迟模型都适用,故对时钟、复位外的其他端口设置驱动强度时建议使用 set_driving_cell 命令。

4.5 设置输出负载

默认情况下DC 认为所有端口的负载为 0,为了让DC精确计算输出电路的延时,需要指定输出端口所驱动的容性负载大小(单位由工艺库指定,通常为pf)。set_load命令用于为特定端口或互连线设定特定的容性负载值,即为其指定load属性。语法格式为:

set_load value objects
value:设定的容性负载值(非负实数);
objects:当前设计中设定容性负载的对象列表,包括端口、互连线等。
dc_shell-t> set_load 3 [all_outptus] 设置所有输出端口的容性负载为 3pf

set_load命令可以和load_of命令结合使用,比如采用 smic13_ss库中NAND2HD2X 的引脚A上的电容的10 倍表示所有输出端口的负载,其命令为:

dc_shell-t> set LOAD_OF_A [load_of_smic13_ss/NAND2HD2X/A]
dc_shell-t> set_load [expr $LOAD_OF_A*10] [all outputs]

该例中首先把 smic13ss 库中单元 NAND2HD2X 的引脚 A 上的电容赋给一个变量 LOAD OF A,然后再以表达式形式赋给所有输出端口。

4.6 设计规则约束

设计规则约束指为保证最终电路可以正常工作,而由工艺库定义的必须遵守的规则,也称隐含约束。一般用于限制在电容、翻转时间、扇出等因素影响,下一个单元可以和多少个其他单元相连,这些规则是必须遵守的,且比其他规则具有更高的优先级。设计规则约束由 set_max_transition、set_max_fanout和set_max_ capacitance 组成。

4.6.1 翻转时间

翻转时间是指引脚或端口的电平翻转所需要的时间。工艺库中一般都会给出该值,如果要为特定的端口、设计或时钟组指定特定的翻转时间,可以采用 set max transition 命令,其语法格式为:

set_max_transition transition_value object list
transition_value: 设定的最大翻转时间。
object_list    :设定其翻转时间为 transition_value 的对象列表.。
dc_shell-> set_max_transition 1.0 [all_designs]
本例中设定所有设计的最大翻转时间为1.0ns。

4.6.2 扇出负载

扇出负载是指互连线可以驱动的扇出数目,这与容性负载不同。扇出负载没有量纲,在计算时 DC 把一个驱动引脚所连接的所有输入引脚的扇出负载相加,得出该驱动引脚的扇出负载值,并把该值与设定的 max_ fan_out相此较。工艺库中设定了扇出负载的默认值,通过set_max_fanout可以进行修改。如果两者不同,综合时会以数值较小,即更严格的值为准。

set_max_fanout fanout_value object_list
fanout_value:设定的max_fanout的属性值。
object_list:设定的 max_fanout 属性为 fanout_value的端口或设计的对象列表。
dc_shell-t set_max_fanout 8 [get designs mem_ctrl]
本例设定设mem_ctrl 的max_fanout为8,则该设计中所有的互连线都被约束。

关于load(容性负载),fanout_load(扇出负载),fanout(扇出),这三个概念是不同的。
1、load 指互连线上各种容性负载的总和,单位是电容的单位。
2、fanout_load 是指一个互连线所能驱动的输入引脚的容性负载换算成扇出得到的一个相对值,没有量纲;而且1个输入引脚的容性负载换算成扇出得到的 fanout_load不一定为 1。
3、fanout则指一个互连线所能驱动的输入引脚的数目。

命令set_max_fanout 中设定的 fanout_value 指的是 fanoutload。

4.6.3 最大驱动电容

max_capacitance属性由命令set_max_capacitance完成。该命令与set_max_transition是相互独立的。

set_max_capacitance capacitance_value object_list
capacitance_value:设定的 max_capacitance属性值。
object_list :设定的 max_capacitance 属性为 capacitance_value 的端口或设计对象列表。
dc_shell-t> set LOAD_OF_A [load_of_smic13_ss/NAND2HD2X/A]
dc_shell-t> set_max_capacitance [expr $LOAD_OF_A*10] [all designs]

本例设定所有设计的 max_capacitance为 smic13_ss/NAND2HDD2X/A电容的10倍,即0.0838869,则该设计中所有的互连线都被约束。该例中的值可在 DC-Tcl 命令行中直接得到。

五、 设计时序约束

设计约束就是设计的指达,主要包括时序和面积两方面。时序约束通常包含四类:
1、时钟定义,涉及的常用命令有:

create_clook,
create_generated_clock,
set_clock_latency,
set_propagated_clock,
set_clock_uncertainty,
set_dont_touch_network,
set_clock_transition 。

2、I/O端口时序,涉及的常用命令有:

set_input_delay,
set_output_delay 。

3、组合逻辑路径延时,涉及的常用命令有:

set_max_delay,
set_min_delay 。

4、时序例外,涉及的常用命令:

set_false_path, 
set_multicycle_path 。

实际约束组合逻辑路径延时的命令也属于时序例外。

5.1时钟定义

5.1.1 create_clock

create_clock命令,用于在当前设计中创建一个具有指定周期和波形的时钟,语法格式为:

create_clcok [-name clock_name] [source_objects] [-period period_value] [-waveform edge_list]
name:为创建的时间指定一个名称,如果省略该项,时钟名称为source_objects 中第一个对象的名称,
如果后续 source_objects省略,则该项必须指定,这种情况下创建的是虛拟时钟,用于约束组合逻辑的相对延时条件;
source_objects:用于创建时钟的引脚或端口名称;
-period:创建时钟的周期,单位由工艺库决定,一般为 ns;
-waveform:指定时钟上升沿和下降沿的时刻,从而决定时钟信号的占空比;如果略去该项,默认时钟占空比为50%,上升沿的时刻为0。

比如在输入端口 CLK创建一个周期为10ns,名称为clk的时钟,命令为:

dc_shell-t> create_clock -name clk -period 10 [get_ports CLK]

该时钟的占空比为 50%,若要时钟占空比为 40%,命令可改为:

dc_shell-t> create_clock -name clk -period 10 -waveform [0 4] [get_ports CLK]

create_clock命令创建的时钟是理想时钟,没有延时。可以通过指定latench,uncertainty等约束条件来模拟真实时钟,相应的命令为:set_clock_latency,set_ clock_uncertainty

5.1.2 clock_latency

set_clock_latency命令用于定义时钟网络的延迟,包括 source_latency和network_latency
source_latency是从时钟源到时钟定义位置的延迟,network_latency是时钟定义位置到触发器时钟输入端的延迟。

set_clock_latency [-source] delay object_list
-source:指定latency为source_latency,若没有该选项,则为network latency. 
delay:时钟延时的值。
object_list::指定latency所在的时钟、端口、引脚的对象列表。

示例延时的设置命令为:

dc_shell-t> set_clock_latency -source 3 [get clocks CLK]
dc_shell-t> set_clock_latency 3 [get clocks CLK]

5.1.3 clock_uncertainty

Latency指定了时钟的延时,后端版图设计的结果可能会引起时钟网络的时序在一定范围内变化,因此可以使uncertainty来为 DC 的综合与优化提供一定的时间裕度。uncertainty分为 plus uncertainty(保持时间检查时用)和 min uncertainty(建立时问检查时用)。设置uncertainty的命令及其格式为:

set_clock_uncertainty [-setup] uncertainty
-setup:指定仅用于建立时间检查的uncertainty,默认情记下 uncertaing同时用于建立时间和保持时间检查。
uncertainty:时钟不确定性的值。

5.1.4 generated_clock

实际中在一些复杂设计上可能会用到分频或倍频时钟,DC 不能为这些时钟自动创建时钟对象,这就要用到 create_generated_clock 命令。其语法格式为:

create_generated clock [-name clock_name] -source master_pin [-divide_by divide_factor | -multiply_by multiply_factor] source_objects
-name:指定生成时钟的名称。
-source:指定主时钟。
-divide:指定分频系数。
-multiply:指定倍频系数。
source_objects:指定生成时钟所在的端口或引脚列表。

在这里插入图片描述比如,当时钟信号DIVIDE是主时钟SYSCLK的2分频,其命令为:

dc_shell-t>create_generated_clock -name DIVIDE -source SYSCLK divide_by 2 [get_pins U4/Q]

5.1.5 propagated_clock

前面介绍的时钟定义需要手工为其设置各种条件,而对于布图后的时钟信号只需指定其为传播时钟,则DC会将时钟树上的延时属性自动加载到所指定的设计对象上,其命令为 set_propagated_clock

5.1.6 clock dont touch

由于时钟的负载通常很大,DC会使用缓冲器来增加其驱动能力,该工作一般放在后端完成,所以要为时钟指dont_touch属性,其命令为set_dont touch_network,DC在综合的时候不对dont touch的对象进行优化。

5.1.7 clock transtion

同样由于时钟的负载很大,时钟的翻转时间往往也很大,这与实际是不符的,因此需要为时钟信号指定一个固定的翻转时间,命令为 set_clock_transtion
综合前面几条命令,现要设计创建一个时钟,周期 10ns, network_latency为 1ns, source_latency为3ns,时钟翻转时间为 0.3ns,建立时间检查的不确定性为0.5ns,完整的脚本命令为:

create_clock -period 10 [get_ports CLK]
set_clock_latency 1 [get_clocks CLK]
set_clock_latency -source 3 [get_clocks CLK]
set_clock_uncertainty -setup 0.5 [get_clocks CLK]
set_clock_transition 0.3 [get_clocks CLK]
set_dont_touch_network [get_clocks CLK]

注意:当内核逻辑加上 PAD 后,时钟应定义在“时钟PAD”的输出上(假定为D,同时为其设置dont_touch 属性,并将输出线(假定为pad_clk_o。)设为ideal_network。具体脚本命令为:

set T 10
create_clock -period $T -waveform [list 0 $T/2] -name clk [get pins PAD INS/CLK PAD/D]
……
set_dont touch network [get_clocks CLK]
set_ideal_network [get_nets PAD_INS/pad_clk_o]

5.2 I/O端口时序

定义时钟相当于定义寄存器与寄存器之同的时序约束,而输入输出端口与时钟的时序关系还没有约束,这就需要用到 set_input_delay 和set_output_delay

5.2.1 input_delay

set_input_delay命令用来对当前设计设置输入延时。语法格式如下:

set_input_delay delay_value [clock clock_name] [-max] [-min] port_pin_list 。
delay_value:设定的输入延时的大小,单位由工艺决定,一般为ns。
-clock:输入延时所参考关联的时钟;
-max:指定最长路径的输入延时。
-min:指定最短路径的输入延时。
port_pin_list:当前设计中设定输入延时的输入端口或内部引脚的列表。

在这里插入图片描述
如上图中时钟为50MHz,外部逻辑延时最坏情况下为7.4ns,则设定输入端口A 的输入延时的命令为:

set_input_delay -max 7.4 -clock [get clocks Clk] [get ports A]

在上图中,如果U1的建立时间为1ns,则组合逻辑N 的最大延时为:20-1-7.4=11.6ns。
注意:实际中对异步复位信号一般由主时钟将其打两拍,同时由于异步复位信号与时钟之问没有直接的时序关系,故通常不对异步复位信号设置输入延时。

5.2.2 output_delay

set_output_delay命令用来对当前设计设置输出延时。语法格式如下:

set_output_delay delay_value [-clock clock_name] [-max] [-min] port_pin_list
delay_value: 设定的输出延时的大小,单位由工艺库快定,一般为ns。
-clock:输出延时所参考关联的时钟。
-max:指定最长路径的输出延时。
-min:指定最短路径的输出延时。
port_pin_list:当前设计中设定输出延时的输出端口或内部引脚的列表。

假设,时钟为50Mhz,外部逻辑建立时间要求7ns,则设定输出端口B的输出延迟命令为:

set_ouput_delay -max 7.0 [-clock Iest clocks Clk] [get_ports A]

如果上图U3的Tclk-q时间为1ns,则组合逻辑S的最大延迟是:20-1-7.0=12.0ns。

5.3 组合逻辑约束

对于纯组合逻辑,一般使用set_max_delay 和 set_min_dealy进行约束,当然也可以使虚拟时钟,虚拟时钟的创建和前面的理想时钟的讲述相同。

5.3.1 max_delay

set_max_delay 用于在当前设计中指定从任意起点到任意终点的最大延时。
语法格式为:

set_max_delay delay_value [-from from_list] [-through through_list] [-to to_list] [-group_path group_namel
delay_valve:指定最大延时的值,单位由工艺库决定,一般为 ns.
-from:延时约束的起点列表;
through:延时路径经过的节点列表。
to:延时约束的终点列表.
-group_path:建立一个时序关键路径的组,用于重点优化。
该选项对编译时间有较大影响,而且该组优化的优先级高,可能会导致其他的时序违例。
因此该选项(或单独使用 group_ path命令)通常作为综合优化的最后手段使用。

比如设定从UO的 CP端经单元U1 和U2的Z端到达 U3的A端的最大延时为5.0ns,则命令为:

set_max_delay 5.0 -from [get_pins U0/CP] -through [list UI/Z U2/Z]-to [get_pins U3/A]

5.3.2 min_delay

set_min_delay用于在当前设计中指定路径的最小延时,与 set_max_delay 相对,该命令与set_fix_hold 命令配合使用修正电路的保持时间,如果发生min_delay 违规,在不增大 max_delay 的情况下综合工具会自动添加合适的延时单元来修复违规。语法格式为:

set_min_delay delay_value [-from from_list] [-through through_list] [-to to_list]
delay_value:指定最小延时的值,单位由工艺库决定,一般为ns。
-from:延时约束的起点列表。
-through:延时路径经过的节点列表。
-to:延时约束的终点列表。

比如设定从UO的Cp端经单元 U1和U2 的工端到达 U3 的A端的最小延时为 3.0ns,则命令为:

set_min_delay 3.0 -from [get_pins U0/CP] -through [list UI/Z U2/Z] -to [get_pins U3/A]

注意:set_max_delay 和 set_min_delay命令优先于 DC 计算出的时序要求。
比如,有一条寄存器到寄存器的时序路径,起始时刻为 20ns,下一个时钟有效沿为35ns,那么DC计算出的该路径最大延时为:(35 -20)-(终点寄存器的工艺库指定的建立时间);
然而,如果用 set_max_delay 10 约束了该条路径,那DC计算出的该路径最大延时为:
10 –(寄存器的工艺库指定的建立时间)

5.4 时序例外

由于每条路径都有timing_constraints,所以才能进行时序分析,但在某些情况下,有些路径的时序分析没有意义,要想忽略这些路径的分析,就要设定时序例外。
除了前面讲的 set_max_delay 和 set_min_delay 指定的时序例外之外,另有两类时序例外:伪路径和多周期路径,分别有
set_false_path 和 set_multicycle_path命令来指定。其他的时序例外放在静态时序分析一章描述。

5.4.1 伪路径

伪路径也称为虚假路径,指时序分析时不需要关心的路径。DC不能自动识别伪路径,故需要显示指定。set_false_path 命令用于去掉特定路径上时序约束,
异步逻辑和逻辑上的虚假路径非常有用。语法格式为:

set_false_path [-from from_list] [-through through_list] [-to to_list]
-from:伪路径的起点列表。
-through:伪路径经过的节点列表。
-to:伪路径的终点列表。

比如设定ff1的CP端经单元U1 和U2 的Z端到达ff2的D端的路径为伪路径,则命令为:

dc_ shell-t>set_false_path -from [get_pins ffI/CP] -through [list U1/Z U2/Z] -to [get_pins ff2/D]

如果设计中有多个时钟,那么由一个时钟域 到另一个时钟域之间的路径为伪路径,需要一一标示,可以重复调用 set_false_path 命令,也可以采用如下的脚本命令:

foreach_in_collection clk1 [all_clocks] {
foreach_in_collection clk2 [remove_from_collection [all_clocks] [get_clocks $clk1]] {
  set_false_path -from [get_clocks $clk1] -to [get_clocks $clk2] 
   }
}

5.4.2 多周期路径

多周期路径指两级相邻寄存器之间的组合逻辑延时较大,不能在1个时钟周期完成。因此需要设定为多周期路径,由set_multicycle_path 命令完成。语法格式为:

set_multicycle_path path_multiplier [-setup] [-hold] [-from form_list] [-through through_list] [-to to_list|
path_multiplier:指定路径的时钟周期数。
-setup:指定该路径针对建立时间检查;
-hold:指定该路径针对保持时间检查;
-from:多周期路径的起点列表;
-through:多周期路径经过的节点列表;
-to:多周期路径的终点列表。

在这里插入图片描述上图为多周期路径示意图,比如在上图所示的设计中,时钟周期为10ns,而其中一级加法器的延时近60ns,那么约束方法为:

dc_shell-t>create_clock -period 10 [get clocks clk]
de shell-t>set_multicycle_path 6 -setup -to [get_pins c_reg[*]/D]

多周期路径的另一个应用是:对于电平敏感的设计,设计者希望时钟周期为0,可通过该命令实现。

六、 设计面积约束

面积是主要的成本因素,电路面积要尽可能小,速度要尽可能快,但速度越快面积就要大。有这几个主要点:NAND2的数目,晶体管数目,面积约束的命令为 set_max_area。语法格式为:

set_max_area area_value
area_value:指定的面积值,单位与工艺库一致。

对于时序优先的设计,通常设置其最大面积为0,意指在时序收敛的前提下尽可能的优化面积。命令为:

dc_shell-t>set_max_area 0.0

前面介绍的各种约束,实际是对设计对象设置了相应的属性。设计对象的属性按照cell、clock、design、library cell、 net、 pin、 port、 read-only、 reference等进行划分,通常用到较多的attribute 包括:area、 dont _touch、 load 、rise_drive、fall_drive, max_rise_drive、max_fall_drive、 rise_delay 、fall_delay、 plus_uncertinty、minus_uncertainty, propagated_clock, pin_direction. Port_direction。
查看特定设计对象的特定属性时,可以使命令get_attributes,比如,查看时钟端口 CIK 的上升沿驱动能力:

dc_ shell-t> get_attribute [get ports CLK] rise_drive
3.283230

再比如查看工艺库smic18ss 中单元 NAND2BIHIDIX的面积:

dc_shell-t> get_attribute [get_lib_cells smicI8_ss/NAND2B1HD1X] area
7.564000

七、练习实践

基于前面讨论的设计约束命令;这里分析一个相对复杂的时序约束的例子。
如图所示。在该设计中,4个时钟的时钟周期分别为:clk1 =30ns,clk2=20ns,clk3 = 10ns,clk4= 15ns。 clk1和clk2的network latency 分别为 0.5ns 和 0.6ns,翻转时间都是 1.0ns。时钟clk3和clk4 与顶层设计top异步,其他信息表示在图中。对这个设计进行时序约束的命令为:
在这里插入图片描述

#create clock
create_clock -period 30 [get_ports clk1]
create_clock -period 20 [get_ports c1k2]
#Generate virtual clocks for clk3 and clk4
create_clock -period 10 -name clk3
create_clock -period 15 -name c1k4
#Constrain uncertainty,transition, and latency
set_clock_uncertainty 0.35 [get_clocks clk1]
set_clock_uncertainty 0.40 [get clocks clk2]
set_clock_transition  1.0  [get_clocks "clk1 clk2"]
set_clock_latency 0.5 [get_clocks clkl]
set clock_latency 0.6 [get_clocks c1k2]
#Constrain inputs and outputs by input and output delay
set_input_delay  2.5 -clock clk3 [get_ports data_in]
set_output_delay 3.0 -clock clk4 [get_clocks data_out]
#Timing Exceptions
set false path -from "clk3 clk4" -to "clk1 clk2"
set false path -from "clk1 clk2" -to "clk3 clk4"

  • 14
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值