当前位置: 首页 > news >正文

STA静态时序检查笔记整理

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的检查的参数设置很重要,个人的思路大概如下,不恰当之处还望指正。

芯片的实际工作情况:不同的工艺、电压和温度,也就是经常提到的PVT(process、voltage、temperature);

芯片本身的参数设置:首先芯片的端口——时钟端口、输入端口、输出端口、输入输出端口的参数设置;

时钟端口的参数设置包括了时钟源、时钟频率、时钟周期、占空比、边沿时间、uncertainty(uncertainty=skew+jitter+delay)、setup时间、hold时间等。

输入端口的参数设置包括了输入延时(包括max和min)、驱动能力的设置(可参看该链接:为设计指定输入端口驱动强度:set_driving_cell、set_drive 和set_input_transition_set driving cell-CSDN博客)。当然如果存在通过端口控制的工作模式,还需要设置具体检查的工作模式,如function、scan等,每种模式都需要检查。

输出端口的参数设置包括了输出延时(包括max和min)、负载能力。

输入输出端口的参数设置需要向输入端口和输出端口的参数进行设置。

其次芯片内部也有参数需要设置——输入信号未经过时序逻辑直接输出、虚拟时钟、时钟信号的同步和异步设置、跨时钟域的处理(由快到慢、由慢到快、时钟周期的整数倍和非整数倍)、时钟之间存在相移关系、多周期路径、半周期路径、false_path、锁存器的timing_borrow、门控时钟(参考链接:芯片设计进阶之路——门控时钟 - 知乎)的处理。以上的芯片内部参数都是基于假设芯片的每一个位置的性能都相同,但实际还是存在制造偏差,因此还需考虑芯片片上的变化(OCV),设置derate参数来增强实际芯片的性能。

4 相关链接

静态时序分析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 创芯网论坛 (原名:电子顶级开发网) -

笔记整理到这里,大致写成这样,后续优化再更新,若有侵权,告知并删除。

http://www.cnnetsun.cn/news/4105477.html

相关文章:

  • BenchmarkTools.jl 可视化:用 BenchmarkPlots 让性能结果一目了然
  • Kindle漫画转换工具KCC完整指南:6个步骤让整卷漫画在电子墨水屏上完美呈现
  • 《YOLO系列模型的多模态项目》配置使用教程(必看内容)
  • Python数据可视化科技图表绘制系列教程(四)
  • 单片机毕业设计-基于 STM32 单片机的心率血氧体温监测报警系统设计 基于 STM32 的便携式人体体征采集与跌倒检测设备开发(023703)
  • AZ-400管道风格对比:YAML管道vs经典管道、托管代理vs自托管代理,到底怎么选?
  • 5步搭建DNF私服完整指南:Docker容器化部署地下城与勇士服务器实战
  • LTX-2.5 Python API编程实战:用ltx-pipelines构建你的自定义视频生成应用
  • 如何读懂 BenchmarkTools.jl 基准测试报告?Trial 结果完整解读
  • BOSL贝塞尔曲线进阶实战:自由曲面、旋转体与沿路径挤出技巧
  • AI论文软件哪个最好?2026亲测
  • ai免费写论文实用吗?实测3款AI写作辅助软件,结果有高有低!
  • APKMirror 客户端怎么用?5 分钟掌握安卓应用安全下载的完整流程
  • 用 shadcn-svelte 搭建 Svelte 项目 UI:5 步从初始化到交付
  • 2019款帕杰罗:从硬派越野到全场景生活伙伴的进化之路
  • OpenCore Legacy Patcher实战指南:让老Mac免费吃上最新macOS的完整攻略
  • Linux 罗技设备驱动配置 3 步走:用 LogiOps 开源驱动唤醒你的 MX Master
  • OpenLane-V2 展望:无图驾驶时代的数据与基准新机遇
  • 桌面图标堆成山?用 NoFences 给桌面分区,找文件快 3 倍
  • Rekognition 误判客户年龄差20岁?我用AWS深度学习课程重学图像分析
  • SoundCloud音乐下载终极指南:scdl一条命令搞定单曲、歌单与收藏归档
  • 深入 grunt-wiredep 源码:依赖注入顺序究竟如何确定?
  • 抖音批量下载工具保姆级教程:去水印、保画质、博主主页一键搬空,从安装到进阶一篇搞定
  • Qwen3.8-27B-ABLITERATED-GGUF多模态实战指南:让本地模型读懂图片与视频
  • STM32简单的串口Bootloader入门
  • FastOCR:基于OpenVINO的免费离线智能表格识别工具实测
  • 挑选靠谱微信投票小程序,重点看这几项核心能力
  • hcache实战教程:10个必会命令参数玩转页缓存分析
  • 如何为 vim-dogrun 贡献代码?从提交 PR 到通过 CI 的完整流程
  • 集群运维评审怎样提前发现风险