【附录A SDC】静态时序分析圣经翻译计划
本文由知乎
赵俊军
授权转载,知乎主页为https://www.zhihu.com/people/zhao-jun-jun-19
本附录将介绍1.7版本的SDC格式,此格式主要用于指定设计的时序约束。它不包含任何特定工具的命令,例如链接(link)和编译(compile)。它是一个文本文件,可以手写或由程序创建,并由程序读取。某些SDC命令仅适用于实现(implementation)或综合(synthesis),但是本附录会列出所有SDC命令。
SDC语法是基于TCL的格式,即所有命令都遵循TCL语法。一个SDC文件会在文件开头包含SDC版本号,其次是设计约束,注释(注释以字符#开始,并在行尾处结束)在SDC文件中可以散布在设计约束中。设计约束中较长的命令行可以使用反斜杠(\)字符分成多行。
A.1 基本命令
以下是SDC中的基本命令:
- current_instance [instance_pathname]
上述命令设置了设计的当前实例,这允许其它命令从该实例中设置或获取属性(attribute)。如果未提供任何参数,则当前实例将成为顶层(top-level)。
例子:
-
current_instance /core/U2/UPLL
-
current_instance .. (向上一层)
-
current_instance (设为顶层)
-
expr arg1 arg2 ... argn
-
list arg1 arg2 ... argn
-
set variable_name value
-
set_hierarchy_separator separator
上述命令指定了SDC文件中使用的默认层次结构分隔符。在允许的情况下,可以通过在各个SDC命令中使用-hsc选项来覆盖此设置。
例子:
-
set_hierarchy_separator /
-
set_hierarchy_separator .
-
set_units [-capacitance cap_unit] [-resistance res_units] [-time time_unit] [-voltage voltage_unit] [-current current_unit] [-power power_unit]
上述命令指定了SDC文件中使用的单位。
例子:
- set_units -capacitance pf -time ps
A.2 对象访问命令
以下命令指定了如何访问设计实例中的对象。
all_clocks命令会返回一个所有时钟的集合:
-
foreach_in_collection clkvar [all_clocks]
-
set_clock_transition 0.150 [all_clocks]
all_inputs [-level_sensitive] [-edge_triggered] [-clock clock_name] 命令会返回一个设计中所有输入端口的集合:
- set_input_delay -clock VCLK 0.6 -min [all_inputs]
all_outputs [-level_sensitive] [-edge_triggered] [-clock clock_name] 命令会返回一个设计中所有输出端口的集合:
- set_load 0.5 [all_outputs]
all_registers [-no_hierarchy] [-clock clock_name] [-rise_clock clock_name] [-fall_clock clock_name] [-cells] [-data_pins] [-clock_pins] [-slave_clock_pins] [-async_pins] [-output_pins] [-level_sensitive] [-edge_triggered] [-master_slave] 命令会返回一个具有指定属性的寄存器的集合:
- all_registers -clock DAC_CLK
上述这个命令返回的集合中为所有由时钟DAC_CLK触发的寄存器。
current_design [design name] 命令会返回当前设计的名称。如果使用参数指定,则将会设置当前设计为指定的名称:
-
current_design FADD
-
current_design
get_cells [-hierarchical] [-hsc separator] [-regexp] [-nocase] [-of_objects objects] patterns 命令会返回一个设计中与指定模型(pattern)匹配的单元的集合,通配符可用于匹配多个单元:
-
get_cells RegEdge*
-
foreach_in_collection cvar [get_cells -hierarchical *]
get_clocks [-regexp] [-nocase] patterns 命令会返回一个设计中与指定模型匹配的时钟的集合。当在-from或-to等上下文中使用时,它将返回一个由指定时钟驱动的所有触发器的集合:
-
set_propagated_clock [get_clocks SYS_CLK]
-
set_multicycle_path -to [get_clocks jtag*]
get_lib_cells [-hsc separator] [-regexp] [-nocase] patterns 命令会创建一个当前正在加载的库中并且与指定模型匹配的库单元的集合:
- get_lib_cells cmos131v/AOI3*
get_lib_pins [-hsc separator] [-regexp] [-nocase] patterns 命令会返回一个与指定模型匹配的库单元引脚的集合。
get_libs [-regexp] [-nocase] patterns 命令会返回一个设计中当前加载的库的集合。
get_nets [-hierarchical] [-hsc separator] [-regexp] [-nocase] [-of_objects objects] patterns 命令会返回一个与指定模型匹配的网络的集合:
-
get_nets -hierarchical *
-
get_nets FIFO_patt*
get_pins [-hierarchical] [-hsc separator] [-regexp] [-nocase] [-of_objects objects] patterns 命令会返回一个与指定模型匹配的引脚名称的集合:
-
get_pins *
-
get_pins U1/U2/U3/UAND/Z
get_ports [-regexp] [-nocase] patterns 命令会返回一个与指定模型匹配的设计(输入和输出)端口名称的集合:
- foreach_in_collection port_name [get_ports clk*]
可以在不“获取”对象的情况下引用诸如端口(port)之类的对象吗?当设计中只有一个具有该名称的对象时,实际上没有任何区别。但是,当多个对象具有相同的名称时,使用get_ * 命令将变得更加重要,它可以避免在引用哪种类型对象方面所带来的任何可能的混淆。假设有一个名为BIST_N1的网络和一个名为BIST_N1的端口,考虑以下SDC命令:
- set_load 0.05 BIST_N1
问题是要引用哪个BIST_N1?网络还是端口?在大多数情况下,最好明确表明对象的类型,例如:
- set_load 0.05 [get_nets BIST_N1]
现在再假设有一个时钟MCLK和另一个也称为MCLK的端口,考虑以下SDC命令:
- set_propagated_clock MCLK
该对象是引用名为MCLK的端口还是引用称为MCLK的时钟?在此特定情况下,它指的是时钟,因为这是set_propagated_clock命令的优先级所选择的。但是,要明确一点,最好明确表明对象类型,如下所示:
-
set_propagated_clock [get_clocks MCLK]
-
set_propagated_clock [get_ports MCLK]
有了这种明确的条件申明,就不必依赖优先级规则了,并且SDC命令会非常清楚。
A.3 时序约束
本节将介绍与时序约束有关的SDC命令。
create_clock -period period_value [-name clock_name] [-waveform edge_list] [-add] [source_objects] 命令可用于定义时钟。如果未指定clock_name,则时钟名称将是第一个源对象的名称。-period选项指定时钟周期,-add选项用于在已经具有时钟定义的引脚上创建时钟。否则,如果不使用此选项,则此时钟定义将覆盖该节点上任何其它现有的时钟定义。-waveform选项指定时钟的上升沿和下降沿(占空比),默认值为(0,period / 2)。如果时钟定义的节点位于另一个时钟之后的路径上,则它将阻塞该点之前一个时钟。
例子:
-
create_clock -period 20 -waveform {0 6} -name SYS_CLK [get_ports SYS_CLK]
-
create_clock -name CPU_CLK -period 2.33 -add [get_ports CPU_CLK]
create_generated_clock [-name clock_name] [-source master_pin] [-edges edge_list] [-divide_by factor] [-multiply_by factor] [-duty_cycle percent] [-invert] [-edge_shift shift_list] [-add] [-master_clock clock] [-combinational] [source_objects] 命令可用于定义内部的衍生时钟。如果未指定-name,则时钟名称为第一个源对象的名称。-source指定衍生时钟的源是设计中的引脚或端口。如果有多个时钟输入源节点,必须使用-master_clock选项指定将这些时钟中的哪一个用作衍生时钟的源。-divide_by选项用于指定时钟的分频系数,与-multiply_by类似。-duty_cycle可以用于指定时钟的占空比。如果时钟的相位已反转,则可以指定-invert选项。除了使用时钟倍频或分频,还可以使用-edges和-edge_shift选项指定衍生时钟。-edges选项指定一个由三个数字组成的列表,该列表指定用于第一个上升沿、下一个下降沿和下一个上升沿的主时钟边沿。例如,可以将时钟分频器指定为-divide_by 2或-edges {1 3 5}。-edge_shift选项可以与-edges选项一起使用,以指定三个边沿中每个边沿的偏移量。
例子:
-
create_generated_clock -divide_by 2 -source [get_ports sys_clk] -name gen_sys_clk [get_pins UFF/Q]
-
create_generated_clock -add -invert -edges {1 2 8} -source [get_ports mclk] -name gen_clk_div
-
create_generated_clock -multiply_by 3 -source [get_ports ref_clk] -master_clock clk10MHz [get_pins UPLL/CLKOUT] -name gen_pll_clk
group_path [-name group_name] [-default] [-weight weight_value] [-from from_list] [-rise_from from_list] [-fall_from from_list] [-to to_list] [-rise_to to_list] [-fall_to to_list] [-through through_list] [-rise_through through_list] [-fall_through through_list] 命令可以为指定的路径组命名。
set_clock_gating_check [-setup setup_value] [-hold hold_value] [-rise] [-fall] [-high] [-low] [object_list] 命令可以提供对任何对象指定时钟门控检查的功能。时钟门控检查仅在具有时钟信号的逻辑门处执行,默认情况下建立时间和保持时间值为0。
例子:
-
set_clock_gating_check -setup 0.15 -hold 0.05 [get_clocks ck20m]
-
set_clock_gating_check -hold 0.3 [get_cells U0/clk_divider/UAND1]
set_clock_groups [-name name] [-logically_exclusive] [-physically_exclusive] [-asynchronous] [-allow_paths] -group clock_list 命令指定了一组具有特定属性的时钟,并为该组分配了一个名称。
set_clock_latency [-rayise] [-fall] [-min] [-max] [-source] [-late] [-early] [-clock clock_list] delay object_list 命令指定给定时钟的时钟延迟。有两种类型的延迟:网络延迟和源延迟。源延迟是时钟定义引脚与其源之间的时钟网络延迟,而网络延迟是时钟定义引脚与触发器时钟引脚之间的时钟网络延迟。
例子:
-
set_clock_latency 1.86 [get_clocks clk250]
-
set_clock_latency -source -late -rise 2.5 [get_clocks MCLK]
-
set_clock_latency -source -late -fall 2.3 [get_clocks MCLK]
set_clock_sense [-positive] [-negative] [-pulse pulse] [-stop_propagation] [-clock clock_list] pin_list 命令在引脚上设置时钟属性。
set_clock_transition [-rise] [-fall] [-min] [-max] transition_clock_list 命令指定时钟定义点处的时钟过渡时间。
例子:
-
set_clock_transition -min 0.5 [get_clocks SERDES_CLK]
-
set_clock_transition -max 1.5 [get_clocks SERDES_CLK]
set_clock_uncertainty [-from from_clock] [-rise_from rise_from_clock] [-fall_from fall_from_clock] [-to to_clock] [-rise_to rise_to_clock] [-fall_to fall_to_clock] [-rise] [-fall] [-setup] [-hold] uncertainty [object_list] 命令指定了时钟或时钟到时钟传输的时钟不确定度。STA将从路径的数据需要到达时间中减去建立时间不确定度,并将保持时间不确定度增加到路径的数据需要到达时间中。
例子:
-
set_clock_uncertainty -setup -rise -fall 0.2 [get_clocks CLK2]
-
set_clock_uncertainty -from [get_clocks HSCLK] -to [get_clocks SYSCLK] -hold 0.35
set_data_check [-from from_object] [-to to_object] [-rise_from from_object] [-fall_from from_object] [-rise_to to_object] [-fall_to to_object] [-setup] [-hold] [-clock clock_object] value 命令在两个数据引脚之间执行指定的检查。
例子:
- set_data_check -from [get_pins UBLK/EN] -to [get_pins UBLK/D] -setup 0.2
set_disable_timing [-from from_pin_name] [-to to_pin_name] cell_pin_list 命令中断了指定单元内的时序弧。
例子:
- set_disable_timing -from A -to ZN [get_cells U1]
set_false_path [-setup] [-hold] [-rise] [-fall] [-from from_list] [-to to_list] [-through through_list] [-rise_from rise_from_list] [-rise rise_to_list] [-rise_through rise_through_list] [-fall_from fall_from_list] [-fall_to fall_to_list] [-fall_through fall_through_list] 命令指定了STA不需要考虑的路径例外。
-
set_false_path -from [get_clocks jtag_clk] -to [get_clocks sys_clk]
-
set_false_path -through U1/A -through U4/ZN
set_ideal_latency [-rise] [-fall] [-min] [-max] delay object_list 命令用于为特定对象设置理想的延迟。
set_ideal_network [-no_propagate] object_list 命令将指定设计中理想网络的源节点。
set_ideal_transition [-rise] [-fall] [-min] [-max] transition_time object_list 命令将指定理想网络的过渡时间。
set_input_delay [-clock clock_name] [-clock_fall] [-rise] [-fall] [-max] [-min] [-add_delay] [-network_latency_included] [-source_latency_included] delay_value port_pin_list 命令将指定相对于指定时钟的输入端口数据到达时间,默认为时钟的上升沿。-add_delay选项允许向该引脚或端口添加多个约束,可以使用此-add_delay选项将时钟设置为不同的时钟。默认情况下,会将发起时钟的时钟源延迟添加到输入延迟值中,但是当指定了-source_latency_included选项时,由于假设已将源网络延迟添加到了输入延迟值中,因此不再添加源网络延迟。-max选项指定的延迟用于建立时间和恢复时间检查,而-min选项指定的延迟用于保持时间和撤销时间检查。如果仅指定-min或-max或两者均未指定,则两者将使用相同的值。
例子:
-
set_input_delay -clock SYSCLK 1.1 [get_ports MDIO*]
-
set_input_delay -clock virtual_mclk 2.5 [all_inputs]
set_max_delay [-rise] [-fall] [-from from_list] [-to to_list] [-through through_list] [-rise_from rise_from_list] [-rise_to rise_to_list] [-rise_through rise_through_list] [-fall_from fall_from_list] [-fall_to fall_to_list] [-fall_through fall_through_list] delay_value 命令用于设置指定路径上的最大延迟。这个命令用于指定两个任意引脚之间的延迟,而不是从一个触发器到另一个触发器的延迟。
例子:
-
set_max_delay -from [get_clocks FIFOCLK] -to [get_clocks MAINCLK] 3.5
-
set_max_delay -from [all_inputs] -to [get_cells UCKDIV/UFF1/D] 2.66
set_max_time_borrow delay_value object_list 命令可用于设置在分析锁存器路径时可以借用的最长时间。
例子:
- set_max_time_borrow 0.6 [get_pins CORE/CNT_LATCH/D]
set_min_delay [-rise] [-fall] [-from from_list] [-to to_list] [-through through_list] [-rise_from rise_from_list] [-rise_to rise_to_list] [-rise_through rise_through_list] [-fall_from fall_from_list] [-fall_to fall_to_list] [-fall_through fall_through_list] delay_value 命令用于设置指定路径上的最小延迟,该延迟可以在任意两个引脚之间。
例子:
-
set_min_delay -from U1/S -to U2/A 0.6
-
set_min_delay -from [get_clocks PCLK] -to [get_pins UFF/*/S]
set_multicycle_path [-setup] [-hold] [-rise] [-fall] [-start] [-end] [-from from_list] [-to to_list] [-through through_list] [-rise_from rise_from_list] [-rise_to rise_to_list] [-rise_through rise_through_list] [-fall_from fall_from_list] [-fall_to fall_to_list] [-fall_through fall_through_list] path_multiplier 命令将路径指定为多周期路径,可以使用多个-through选项。如果多周期路径仅用于建立时间检查,请使用-setup选项,而如果多周期路径用于保持时间检查,请使用-hold选项。如果-setup或-hold均未指定,则默认为-setup且默认的保持时间周期为0。-start选项指定了时钟周期数使用的是发起时钟的 ,而-end选项指定使用的是捕获时钟的,默认值为-start。-hold选项指定的时钟周期数表示需要偏离默认多周期保持时间值0的时钟沿数。
例子:
-
set_multicycle_path -start -setup -from [get_clocks PCLK] -to [get_clocks MCLK] 4
-
set_multicycle_path -hold -from UFF1/Q -to UCNTFF/D 2
-
set_multicycle_path -setup -to [get_pins UEDGEFF*] 4
set_output_delay [-clock clock_name] [-clock_fall] [-level_sensitive] [-rise] [-fall] [-max] [-min] [-add_delay] [-network_delay_included] [-source_latency_included] delay_value port_pin_list 命令可以指定相对于时钟的输出所需时间,默认是上升沿。默认情况下,时钟源延迟会添加到输出延迟值中,但是当指定-source_latency_included选项时,不会添加时钟延迟值,因为会假定它已包含在输出延迟值中。-add_delay选项可用于在一个引脚/端口上指定多个set_output_delay。
set_propagated_clock object_list 命令指定时钟延迟需要计算,即不是理想的。
- set_propagated_clock [all_clocks]
A.4 环境命令
本节介绍了用于设置待分析设计环境的命令。
set_case_analysis value port_or_pin_list 命令用于指定被设置为常数的端口或引脚。
例子:
-
set_case_analysis 0 [get_pins UDFT/MODE_SEL]
-
set_case_analysis 1 [get_ports SCAN_ENABLE]
set_drive [-rise] [-fall] [-min] [-max] resistance port_list 命令用于指定输入端口的驱动强度,它指定端口的外部驱动电阻,值为0表示驱动强度是最高的。
例子:
- set_drive 0
set_driving_cell [-lib_cell lib_cell_name] [-rise] [-fall] [-library lib_name] [-pin pin_name] [-from_pin from_pin_name] [-multiply_by factor] [-dont_scale] [-no_design_rule] [-input_transition_rise rise_time] [-input_transition_fall fall_time] [-min] [-max] [-clock clock_name] [-clock_fall] port_list 命令用于模拟驱动输入端口的单元的驱动电阻。
例子:
- set_driving_cell -lib_cell BUFX4 -pin ZN [all_inputs]
set_fanout_load value port_list 命令在输出端口上设置指定的扇出负载。
例子:
- set_fanout_load 5 [all_outputs]
set_input_transition [-rise] [-fall] [-min] [-max] [-clock clock_name] [-clock_fall] transition port_list 命令指定了输入端口上的过渡时间。
例子:
-
set_input_transition 0.2 [get_ports SD_DIN*]
-
set_input_transition -rise 0.5 [get_ports GPIO*]
set_load [-min] [-max] [-subtract_pin_load] [-pin_load] [-wire_load] value objects 命令用于指定在设计中引脚或网络上的电容性负载的值。-subtract_pin_load选项表示从指定负载中减去引脚电容。
例子:
-
set_load 50 [all_outputs]
-
set_load 0.1 [get_pins UFF0/Q]
-
set_load -subtract_pin_load 0.025 [get_nets UCNT0/NET5]
set_logic_dc port_list 命令、set_logic_one port_list 命令以及set_logic_zero port_list 命令将指定的端口设置为不关心(don't care)、逻辑1或逻辑0。
例子:
-
set_logic_dc SE
-
set_logic_one TEST
-
set_logic_zero [get_pins USB0/USYNC_FF1/Q]
set_max_area area_value 命令指定了当前设计的最大面积限制。
例子:
- set_max_area 20000.0
set_max_capacitance value object_list 命令指定了端口或设计中的最大电容。如果是设计,则指定了设计中所有引脚的最大电容。
-
set_max_capacitance 0.2 [current_design]
-
set_max_capacitance 1 [all_outputs]
set_max_fanout value object_list 命令指定了端口或设计中的最大扇出值。如果是设计,则指定了设计中所有输出引脚的最大扇出值。
-
set_max_fanout 16 [get_pins UDFT0/JTAG/ZN]
-
set_max_fanout 50 [current_design]
set_max_transition [-clock_path] [-data_path] [-rise] [-fall] value object_list 命令指定了端口或设计中的最大过渡时间。如果是设计,则指定了设计中所有引脚上的最大过渡时间。
例子:
- set_max_transition 0.2 UCLKDIV0/QN
set_min_capacitance value object_list 命令指定了设计中端口或引脚上的最小电容值。
例子:
- set_min_capacitance 0.05 UPHY0/UCNTR/B1
set_operating_conditions [-library lib_name] [-analysis_type type] [-max max_condition] [-min min_condition] [-max_library max_lib] [-min_library min_lib] [-object_list objects] [condition] 命令可以设置用于时序分析的工作条件。分析类型可以是single(单个情况),bc_wc(最佳情况/最差情况)或者on_chip_variation(片上变化)。可以使用operating_conditions命令在库中定义工作条件。
例子:
-
set_operating_conditions -analysis_type bc_wc
-
set_operating_conditions WCCOM
-
set_operating_conditions -analysis_type on_chip_variation
set_port_fanout_number value port_list 命令可用于设置端口的最大扇出数。
例子:
- set_port_fanout_number 10 [get_ports GPIO*]
set_resistance [-min] [-max] value list_of_nets 命令可用于设置指定网络上的电阻。
例子:
-
set_resistance 10 -min U0/U1/NETA
-
set_resistance 50 -max U0/U1/NETA
set_timing_derate [-cell_delay] [-cell_check] [-net_delay] [-data] [-clock] [-early] [-late] derate_value [object_list] 命令指定了降额系数。
set_wire_load_min_block_size size 命令指定了将线负载模型设置为“enclosed”时使用的最小的块大小。
例子:
- set_wire_load_min_block_size 5000
set_wire_load_mode mode_name 命令定义了如何对分层设计(hierarchical design)中的网络使用线负载模型的机制。mode_name可以是top,enclosure或segmented。top模式规定在顶层定义的线负载模型将用于所有较低级别上。enclosure模式规定完全封闭在模块中的网络的线负载模型用于该网络。segmented模式规定模块中的网络段使用该模块的线负载模型。
例子:
- set_wire_load_mode enclosed
set_wire_load_model -name model_name [-library lib_name] [-min] [-max] [object_list] 命令定义了用于当前设计或指定网络的线负载模型。
例子:
- set_wire_load_model -name "eSiliconLightWLM"
set_wire_load_selection_group [-library lib_name] [-min] [-max] group_name [object_list] 命令会在根据块的单元面积确定线负载模型时,为设计设置线负载选择组,该选择组通常在技术库中定义。
A.5 多电压命令
当设计中存在多电压岛(multi-voltage islands)时,以下命令适用。
create_voltage_area -name name [-coordinate coordinate_list] [-guard_band_x float] [-guard_band_y float] cell_list
set_level_shifter_strategy [-rule rule_type]
set_level_shifter_threshold [-voltage float] [-percent float]
set_max_dynamic_power power [unit] 命令指定了最大动态功率。
例子:
- set_max_dynamic_power 0 mw
set_max_leakage_power power [unit] 命令指定了最大漏电功率。
例子:
- set_max_leakage_power 12 mw