1. syntax 检查: dcprocheck TOP.con
2. Timing budget
2.1 综合时,如果不知道外部的timing的情况,一般
Input delay: 内部保留40%
Output delay: 内部保留40%
create_clock -period 10 [get_ports clk]
set_input_delay -max 6 -clock clk [all_inputs]
remove_input_delay [get_ports clk]
set_output_delay -max 6 -clock clk [all_outputs]
2.2 推荐使用Register Output
set CLK2Q_MAX 1.5; #Assume slowest register driving input port
set CLK2Q_MIN 0.9; #Assume fastest register driving output port
set ALL_INPUTS_EXCLUDE_CLK [remove_from_collection [all_inputs] [get_ports Clk]]
set_input_delay -max $CLK2Q_MAX -clock CLK $ALL_INPUTS_EXCLUDE_CLK
set_output_delay -max [expr {$period - $CLK2Q_MIN}] -clock CLK [all_outputs]
3. Timing constraint:
3.0 综合时,只对setup time进行约束
3.1 Reg2Reg: create_clock
需要定义clock,还要考虑uncertainty和latency
3.1.1
pre-layout uncertainty = skew + jitter + margin: #
set_clock_uncertainty -setup 0.2 [get_clocks clk]
jitter: 一般可以从PLL datasheet得到
skew
3.1.2 clock domain uncertain
set_clock_uncertainty -setup Tu -from clk1 -to clk2
3.1.3 latency: 分为source latency和network latency
a.
source_latency: set_clock_latency -source -max 0.3 [get_clocks clk]
network_latency: set_clock_latency -max 0.3 [get_clocks clk] ;#没有-source就表示是network latency
#latency可以设置为rise, fall, min, max,
#-max用于对setup time计算时进行约束
#-min用于对hold time计算时进行约束
#-min,-max不可以同时在一个命令中使用,必须在分开的命令中使用,例如
set_intput_delay -clock_fall -max -clock Clk 0.30 [get_ports A]
set_intput_delay -clock_fall -min -clock Clk 0.04 [get_ports A]
b. 一般计算时,外部的register默认使用与current_design一样的latency
但是,当外部的register和current_design的latency不同,该怎么办?例如:
input_launch_register current_design output_sample_register
source_latency 0.18 0.30 0.30
network_latency 0.12 0.12 0.07
b.1 traditional method
create_clock -period 2 [get_ports Clk]
create_clock -period 2 -name Clk_input_launch_register ;#launch register's virtual clock
create_clock -period 2 -name Clk_output_capture_register ;#Capture register's virtual clock
set_source_latency -source 0.3 [get_clock Clk]
set_source_latency -source 0.18 [get_clocks Clk_input_launch_register]
set_source_latency -source 0.3 [get_clocks Clk_output_capture_register]
set_source_latency 0.12 [get_clocks Clk] set_source_latency 0.12 [get_clocks Clk_input_launch_register]
set_source_latency 0.07 [get_clocks Clk_output_capture_register]
set_input_delay -max 0.6 -clock Clk_input_launch_register [all_inputs]
set_output_delay -max 0.8 -clock Clk_input_launch_register [all_outputs]
b.2 "included" method
create_clock -period 2 [get_ports Clk]
set_source_latency -source 0.3 [get_clock Clk]
set_source_latency 0.12 [get_clocks Clk]
set_input_delay -max [expr {0.6+0.18}] -clock Clk -source_latency_included [all_inputs];
#launch_register的network_latency和current_design的network_latency是一样的,只有source_latency不一样,
#所以用-source_latency_included把current_design的source_latency在launch_register中去除,并把0.18加到input_delay上去
set_output_delay -max [expr {0.8-0.07}] -clock Clk -network_latency_included [all_outputs]
#capture_register的source_latency和current_design的source_latency是一样的,只有network_latency不一样,
#所以用-network_latency_included把current-design的network_latency在capture_register中去除,并把0.07从output_delay中减去
3.1.4 transition time: 对clock的rise和fall time建模
set_clock_transition -max Tt [get_clocks clk]
3.1.5 pre-layout clock
create_clock -period 5 [get_ports clk]
set_clock_latency -source -max 4 [get_clocks clk]
set_clock_latency -max 2 [get_clocks clk]
set_clock_uncertainty -setup 0.5 [get_clocks clk]
set_clock_transition -max 0.08 [get_clocks clk]
3.1.6 post-layout clock #network clock latency已经在post-layout netlist中已经包含了
create_clock -period 5 [get_ports clk] set_clock_latency -source -max 4 [get_clocks clk]
set_propagated_clock [get_clocks clk] ;# 这个命令会强制analyzer计算实际时钟树的skew, latency和transition time,只要考虑jitter
set_clock_uncertainty -setup 0.2 [get_clocks clk]
3.1.7 clock object name和clock port name不一样
create_clock -period 2 -name MY_CLK [get_ports Clk]
set_input_delay -max 0.6 -clock MY_CLK [get_ports A]
clock object name: 由-name设定
clock port name: design上面的input port或get_nets等命令的返回值
set_input_delay的"-name"使用的是clock object name
3.1.8 duty-cycle默认是50%,如果不是,需要用-waveform设定
create_clock -period 2 -waveform {0 0.6} -name MY_CLK [get_ports Clk]
#上升沿:0ns 下降沿: 0.6ns 时钟周期: 2ns => duty_cycle = 0.6/2 = 30%
3.1.9 时钟的偏置(offset)
a. create_clock -period 2 -waveform {0.4 1.4} -name My_CLK [get_ports Clk]
#上升沿:0.4ns 下降沿: 1.4ns 时钟周期: 2ns 第二个上升沿: 2.4ns
时钟偏置了0.4ns, 但是不推荐使用这种方法
在多时钟设计中,用-waveform设置的偏置值会使DC使用错误的launch或capture edge,从而造成under-或over-constrain
-waveform建议只是用在duty-cycle或clock invert的设置上
b. 要设置clock offset,建议使用set_clock_latency
create_clock -period 2 -name MY_CLK [get_ports Clk]
set_clock_latency -rise 0.4 [get_clocks MY_CLK]
set_clock_latency -fall 0.4 [get_clocks MY_CLK]
3.1.10 复杂时钟(不太会使用)
create_clock -period 1.6 -waveform {0 0.4 0.6 1.4} -name My_CLK [get_ports CLK]
#时钟周期:1.6ns 1st上升沿: 0ns 1st下降沿:0.4ns 2nd上升沿: 0.6ns 2nd下降沿:1.4ns
3.1.11multiple clock
a. DC中的multiple_clock的定义
几个clock是从一个时钟源获取的,有的clock在current上并没有clock_port, 单一的port有几种约束
b. multiple clock相关的input_delay
create_clock -period -2.0 [get_ports CLKC]
create_clock -period 3.0 -name CLKB
set_input_delay 0.55 -clock CLKB -max [get_ports IN1]
c. 相关的input_delay的计算, 可以用report_interclock_relation获取相关的信息
report_interclock_relation:提供不同clock驱动的register之间的timing path的common clock period的信息
说明:从这个报告中,CLKB和CLKC有两个方向需要计算时序
可以看到CLKB的周期是3,CLKC的周期是2,两个clock的共同最小周期是6
所以CLKB需要计算2个周期(count1), CLKC需要计算3个周期(count2)
这种path可以用set_false_path -from CLKB -to CLKC来去除
d. multi_clock相关的output_delay
set_output_delay -max 0.15 -clock CLKD [get_ports OUT1]
set_output_delay -max 0.52 -clock CLKE -add_delay [get_ports OUT1]
e. output_delay相对于multiple_clock的计算
CLK: 3GHz CLKD:CLK/4=3/4GHz CLKC: CLK/6=0.5GHz CLKE:CLK/3=1GHz
CLKD:4/3ns CLKC: 2ns CLKE: 1ns
common period: 4ns
DC根据计算: CLKC->CLKD: 0.67-0.15=0.52, CLKC->CLKE: 1-0.52=0.48
因此,DC会算出最大output_path_delay只允许0.48ns
f. multi_clock之间的uncertainty的计算
如果lauch_clk和capture_clk都定义了uncertainty time,DC只会使用capture_clk的uncertainty time
如果知道时钟之间的uncertainty,那么可以使用set_clock_uncertainty -setup 0.15 -from [get_clocks launch_clk] -to [get_clocks capture_clk]
3.1.11generated clock
create_generated_clock -source master_pin source_objects
[-name clk_name] [-add] [-divide_by div_factor] [-multiply_by multi_factor]
[-duty_cycle percent] [invert] [-preinvert] [-edges edge_list] [-edge_shift edge_shift_list]
[-combinational]
但在RTL中,不存在FF1,可以用gtech cell/pin,
例如,RTL有个div_clk,那么对应的gtech中就成为div_clk_reg/Q(其余的div_clk_reg/<p>in为:preset, clear, QN, next_state, clocked_on
create_generated_clk -divide_by 2 -name CLK_DIV2 -source [get_ports CLK] [get_pins div_clk_reg/Q]
3.2 Input2Reg: set_input_delay
a. 默认是外部用clock object的上升沿,但如果用下降沿驱动
set_input_delay -max 3 -clock Clk -clock_fall [get_ports A]
b. 如果input port由两个register通过组合电路驱动的话, 假设一个register使用Clk的上升沿,另一个register使用Clk的下降沿
set_input_delay -max 0.3 -clock Clk -clock_fall [get_ports A]
set_input_delay -max 1.2 -clock Clk -add_delay [get_ports A]
#DC在综合时需要同时满足两种input_delay造成的时序要求
c. 在input port上的额外的load也会增加transition time, 可以用set_load命令加上
set_load 0.012 [get_ports INPUT_A]
但是,如果你是用set_input_transition设置transition时间的,那么即使使用set_load,DC也不会在计算中采用这个值
set_load只和set_driving_cell配合使用才有用
3.3 Reg2Output: set_output_delay
会使用set_clock_latency/uncertainty命令产生的latency和uncertainty
3.4 pure combinational_path: virtual clock:
create_clock -period 2 -name vclk
set_clock_uncertainty -setup 0.3 [get_clocks vclk]
set_input_delay -max 0.4 -clock vclk [get_ports A]
set_output_delay -max 0.4 -clock vclk [get_ports B]
4. input transition和output load
DC和PT判断timing pass还是fail的依据是: data_required_time - data_arrival_time = slack,如果slack>0,就是pass,否则就fail
data_arrival_time和data_required_time的计算(假设clock uncertainty和latency都是0)
input_delay: 由set_input_delay设定; input_gate_delay: 和input_port相连的那个gate
output_delay: 由set_output_delay设定; output_gate_delay: 驱动output_port的那个gate
reg2reg path: Tarrival = Tck2Q (Launch DFF) + combinational_gates_path_delay
Trequired = Period - Tsetup (Capture DFF)
input2reg path: Tarrival = input_delay+ input_gate_delay + combinational_gates path_delay
Trequired = Period - Tsetup(Capture DFF)
output2reg path: Tarrival = TCK2Q(launch DFF) + combinational_gate_path_delay + output_gate_delay
Trequired = Period - output_delay
DC计算input/output_gate delay依赖input transition time和output capacitive load, DC会默认output port上的load是0,input port上的transition time是0,这会导致IO path的delay变得最优的结果,从而
data arrival time和实际电路相比也会相应变小。
所以,必须设定output port上的load和input port上的transition time
4.1 output load的设定
set_load [expr {30.0/1000}] [get_ports B] ;# 设定output_port B所需要驱动的output_load为30fF
# 假设工艺库所使用的单位是pF(.lib文件中可以查到)
# chip level常用,load的大小一般在datasheet的AC参数部分可以找到
set_load [load_of my_lib/AN2/A] [get_ports B] ;# block level综合时,一般没法确定负载,假设要驱动的load是1个AN2
set_load [expr {[load_of my_lib/inv1a0/A] * 3}] [get_ports B] ;# 假设要驱动的load是3个inv1a0
4.1.1 复杂情况
output port B需要驱动两个register,一个上升沿采样,一个下降沿采样
set_output_delay -max 2.5 -clock Clk [get_ports B]
set_output_delay -max 0.7 -clock Clk -clock_fall -add_delay [get_ports B]
DC计算S的最大延时时,会分别计算,然后取两者中较小的一个。
4.2 input transition time的设定
a. chip level: datasheet的AC参数列表中一般找得到
set_input_transition 0.12 [get_ports A]
b. block level综合不知道时,假设一个驱动的cell
set_driving_cell -lib_cell OR3B [get_ports A]
或set_driving_cell -lib_cell FD1 -pin Qn [get_ports A] ;#如果没有使用"-pin",DC会使用cell的第一个output pin
#在使用set_driving_cell命令时,这个cell的DRC属性也会被加入,如果不想引入DRC,就使用set_driving_cell -no_design_rule
c. DC计算data_arrival_time的方法(set_input_delay和set_driving_cell)
data_arrival_time = input_max_delay + ring_time/falling transition time on input port
d. 当datasheet指定了多组input_delay和load时
0.6ns with 50fF load, 0.48ns with 0.0fF load
写约束时,set_input_delay应该使用zero load的那个value(上面的例子中应该使用0.48ns)
5. area
compile_ultra:(DCT):自动将area的目标设为0
report_area
6. constraint file
DC运行constraint file: source top.con
将旧的DC script转成Tcl格式:dc-transcript old_script.scr new_script.tcl
DC batch mode: dc_shell -topo -f run.tcl | tee -i dc.log
-i: ignore the interrupt like <Ctrl-C>
6. constraint file推荐形式:扩展名使用.con或.tcl
reset_design ;#去除旧的constraint
create_clock -period 2 [get_ports clk]
report_port -verbose; # 检查port上的约束
report_clock; #检查clock 属性的约束
report_clock -skew; #检查clock skew的约束
report_clock -skew -attr; #检查clock skew和属性的约束
check_timing; #检查constraint的缺陷:
1. 例如endpoint没有constraint 2. clock没有constraint
3. clock的constraint互相overlapping...
4. clock-gating和clock互相影响 。。。
把报告结果存入文件
redirect -tee -file precompile.rpt {link}; #等价于 link > precompile.rpt, 但是-tee同时可以在screen上显示
redirect -append -tee -file precompile.rpt {check_design}; #等价于 check_deign >> precompile.rpt