1 概述
静态时序检查作为时序sign-off的最后一道关卡,重在检查并将不符合时序要求的路径报告出来,避免芯片由于时序不好导致工作不稳定,因此检查项的全面与正确是十分重要的。
时序检查首先需要清楚时序是什么,时序的参数和要点是什么,才知道怎么检查时序。关于时序的要点网上有很多的介绍,在做综合时也需要很清楚时序,这两部分是相通的,建议在学习综合时一并学习时序分析。
静态时序检查是检查芯片中每一条真实路径的时序信息是否符合要求,使用的工具多为Prime Time(PT),其userguide可以参看如下网站(2019版)。
primetime user guide 2019.03 - 后端资料区 - EETOP 创芯网论坛 (原名:电子顶级开发网) -
PT是一个工具,如果要用好该工具,还需多读其使用手册。用好工具是基础要求,重要的是对报出的时序违例进行分析并解决才是进阶。
在Linux中可以用如下命令执行sta脚本:
pt_shell -f /xx/xx/scripts/pt.tcl | tee /xx/xx/log/sta_pt.log
2 sta脚本部分
2.1 设置变量
设置变量包括了设置检查变量和环境变量。
PT不仅可以检查layout后的电路时序,也可以检查综合后的电路时序,但在布局布线后必须做静态时序分析,综合后可以做也可以不做。
set STEP "post_layout" #这里就是用于设置对哪个阶段的电路做静态时序分析,如果只对layout后的电路做分析,可以不用设置这个参数,这个参数是用做选择判断的条件
set MODE "func" #这个也是选择判断用的,如果电路存在正常的功能模式(func)也存在DFT等模式,则可以用这个选择分析电路处在某种状态下的时序
set PVT_CORNER "ss_v1p87_125" #STA是要对电路每个corner下都要进行的,用于确保电路在每个corner下都能正确运行,这个参数是用于选择具体在哪个corner下进行分析。
#=========设置参数========
#source -echo -verbose /xx/xx/scripts/pt_setup.tcl
set TOP digital_top
set timing_save_pin_arrival_and_slack true
set timing_save_pin_arrival_and_required true
set timing_enable_max_capcitance_set_case_analysis true
set auto_wire_load_selection false
set svr_keep_unconnected_nets true
set timing_remove_clock_reconvergence_pessimism true
set timing_early_launth_at_borrowing_latches false
set si_enable_analysis true
这里设置的参数可能在某些条件下需要修改增删,可根据具体情况调整。
2.2 读取db文件
set link_path [concat * /xx/xx/xx/$PVT_CORNER.db \
/xx/xx/xx/$PVT_CORNER\_ram.db]
set op_cond "ss_v1p87_125" #STA是要对电路每个corner下都要进行的,用于确保电路在每个corner下都能正确运行,这个参数是用于选择具体在哪个corner下进行分析。这个参数在去lib里有。
2.3 读取网表文件
read_verilog /xx/xx/netlist/digital_top.v
current_design digital_top
link
2.4 读取spef文件
if {$FORMAT == "spef"} {
read_parasitics -format spef -keep_capative_coupling /xx/xx/spf/$PVT_CORNER.spef.gz
write_sdf -version 3.0 -context Verilog -no_edge -include {SETUPHOLD RECREM} /xx/xx/sdf/$PVT_CORNER.sdf
} elseif { $FORMAT == "sdf"} {
read_sdf -analysis_type on_chip_variation /xx/xx/sdf/$PVT_CORNER.sdf
}
set_operating_conditions -analysis_type on_chip_variation
在布局布线后,每个corner下都有一个对应的spef文件,在什么corner下就用对应的spef文件。
2.5 读取sdc文件
if {$READ_SDC == "TRUE"} {
read_sdc -version 2.1 -echo /xx/xx/xx/xx/sdc/syn.sdc
set_propagated_clock [all_clocks]
} else {
source /xx/xx/scripts/pt_constrant.tcl
}
这里的pt_constrant.tcl 的设置如下,在sdc文件时可以用以下的设置粗略的检查。
if{$MODE == "func"} {
set_case_analysis 0 [get_port TEST_MODE]
} elseif {$MODE == “dft”}{
set_case_analysis 1 [get_port TEST_MODE]
}
set_wire_load_mode top
set_wire_load_model
if{$STEP=="pre_layout"}{
set_ideal_network -no_propagate
}elseif {$STEP=="post_layout"}{
set_propagated_clock [all_clocks]
}
2.6 检查输出
检查输出包括了参数设置的输出,同时也包括时序检查结果的输出。参数设置的输出是为了核实参数设置的正确性。
check_timing -verbose > check_timing_pre.rpt
update_timing -full
check_timing > check_timing_post.rpt
#=====source /xx/xx/scripts/output.tcl======用于输出相关参数信息=====
report_bottleneck > report_bottleneck.rpt
report_analysis_coverage -exclude_untested {constant_disable} -status_details {violated untested} > report_analysis_coverage.rpt
report_qor > report_qor_summary.rpt
report_annotated_parasitics -check -internal_nets -pin_top_pin_nets -list_not_annotated -boundary_nets -max_nets 10> report_annotated_parasitics.rpt
report_clock >
report_clock -skew -attribute >
report_clock_timing -type latency>
report_clock_timing -type skew >
report_exceptions >
report_disable_timing >
report_clock_gating_check >
report_constraint -max_capacitance -verbose -nosplit >
report_constraint -max_fanout -verbose -npsplit >
report_constraint -max_transition -verbose -nosplit >
report_constraint -max_capacitance -verbose -all_violators -nosplit >
report_constraint -max_fanout -verbose -all_violators -nosplit >
report_constraint -max_transition -verbose -all_violators -nosplit >
report_constraint -min_pulse_width -all_violators -nosplit >
set_noise_parameter -enable_propagation
check_noise > check_noise.rpt
update_noise
report_noise -all_vio -nosplit > report_noise.rpt
report_si_double_switching -nosplit -rise -fall > report_si_double_switch.rpt
在report timing时还需要考虑片上变化(OCV)如derate的考虑,对derate的设置参考文末的第一个链接。这里简单给出基本的report timing。
source -echo -verbose /xx/xx/scripts/report_min_timing.tcl
source -echo -verbose /xx/xx/scripts/report_max_timing.tcl
保存session,用于快速恢复已有PT运行。
save_session ./session
report timing是STA的相对关键的一部分,只有报告全了,才能全面的检查这个设计的时序。在timing报告中,主要用到的有report_命令,可以在pt_shell中查找相关的命令及其使用方法,下面给出部分命令使用的脚本举例:
report_min_timing.tcl #report hold的violation
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time > report_timing_hold.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -start_end_type reg_to_reg >report_timing_hold_r2r.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -start_end_type in_to_reg >report_timing_hold_i2r.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -start_end_type reg_to_out >report_timing_hold_r2o.min.rpt
report_timing -delay_type min -nworst 1 -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -start_end_type in_to_out >report_timing_hold_i2o.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -exclude [concat [all_inputs] [all_outputs]]>report_timing_hold_internal_nw1.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -group **async_default**>report_timing_hold_nw1.async_default.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -group **clock_gating_default**>report_timing_hold_nw1.clock_gating_default.min.rpt
report_timing -delay_type min -nworst 1 -derate -capacitance -path_type full_clocked_expanded -net -input -crosstalk_deta -nosplit -transition_time -group **default**>report_timing_hold_nw1.default.min.rpt
report_constraints -all > report_constraints.min.rpt
report_global_timing > report_global_timing.min.rpt
report_global_slack>report_global_slack.min.rpt
report_constraint -all_violations > report_drc_violations.min.rpt
report_max_timing.tcl #report setup violation
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time > report_timing_setup.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -start_end_type reg_to_reg > report_timing_setup_r2r.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -start_end_type in_to_reg > report_timing_setup_i2r.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -start_end_type reg_to_out > report_timing_setup_r2o.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -start_end_type in_to_out > report_timing_setup_i2o.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time > report_timing_setup_nw1.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -exclude [concat [all_input] [all_outputs]]> report_timing_setup_internal_nw1.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -group **async_default**> report_timing_setup_nw1.async_default.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -group **clock_gating_default**> report_timing_setup_nw1.clock_gating_default.max.rpt
report_timing -delay_type max -nworst 1 -derat -capacitance -path_type full_clocked_expanded -net -input -crosstalk_delta -nospilt -transition_time -group **default**> report_timing_setup_nw1.default.max.rpt
report_constraints -all > report_constraints.max.rpt
report_global_timing > report_global_timing.max.rpt
report_global_slack>report_global_slack.max.rpt
report_constraint -all_violators > report_drc_violations.max.rpt
上面的举例不全,使用时可根据需要增删。如果为了避免检查项不全,可以将所有检查项都检查一遍。
3 相关链接
静态时序分析STA基础 - 陆路慧 - 博客园 (cnblogs.com)
特别推荐这个链接,详细看完,收获颇丰。
STA静态时序分析——学习笔记_sta corner-CSDN博客
静态时序分析(STA) —— 时序检查_sta检查-CSDN博客
静态时序分析Static Timing Analysis1——STA概述、标准工艺库、时钟、IO约束的建立-CSDN博客
静态时序分析Static Timing Analysis2——建立时间和保持时间的时序检查_sta 保持时间检查-CSDN博客
静态时序分析Static Timing Analysis3——特殊路径(多周期、半周期、伪路径)的时序检查_半周期时序检查-CSDN博客
静态时序分析Static Timing Analysis4——多时钟域和多时钟时序检查_慢时钟到快时钟建立时间不足-CSDN博客 【干货】STA静态时序分析详细解析 - 连更 - 后端讨论区 - EETOP 创芯网论坛 (原名:电子顶级开发网) -
笔记整理到这里,大致写成这样,后续优化再更新,若有侵权,告知并删除。