STA静态时序分析——学习笔记

  • 静态时序分析简介及基本知识
  • PT流程以及分步骤讲解
    • 2.1 设计STA环境
    • 2.2 指定STA库文件
    • 2.3 读取Netlist文件
    • 2.4 读取SPEF文件
    • 2.5 设置约束文件
    • 2.6 输出报告并保存数据文件
    • PT基础使用
  • PT其他使用
  • PT实操
    • 输出文件和报告

静态时序分析简介及基本知识


静态时序分析(STA)是通过工具对同步电路中所有存在的时序路径进行分析,检查是否存在时序违例。是标准的timing sign-off(时序签字)的工具。

PT和综合的过程和命令都是十分相似的;
!!与综合过程中对时序检查的区别:PT使用的是更加精准的时序模型,并且使用PT做STA会扫描所有的corner,而综合一般只做一两个corner

静态时序分析具有以下功能

  • STA可分析电路最高时钟频率;
  • STA可检查设计在所有corner下均能时序收敛(综合通常只跑个别corner,但跑STA资源小速度快,可以遍历各种corner);
  • 分析时钟的偏移,不平衡等各种因素对电路时序的影响

补充知识:PVTProcess、Voltage、tempreture

  • Process:由于fab制造过程的工艺掺杂不均匀,分为ff, ss, tt等(电子、空穴掺杂不均匀);
  • Voltage:芯片工作电压,由于电源的不稳定,以及后端的IR-drop(压降)等因素导致。(可分为0.9 * VDD, 1.1 * VDD);
  • tempreture:芯片工作时的温度,一般分为-40,-10, 70 ,125几个温度;

常用的工具

  • Synopsys: Prime Time(用的更多)
  • Cadence: Tempus

时序单元的相关约束

  • Setup time建立时间Tsetup:数据在时钟沿之前必须有效的时间;
  • Hold time保持时间Thold:数据在时钟沿之后必须稳定的时间;
  • recover time恢复时间:低电平复位信号或者高电平清零信号在时钟有效沿之前保持有效的最小时间长度;
  • removal time移除时间:低电平复位信号或者高电平清零信号在时钟有效沿之后保持有效的最小时间长度;
  • 最小脉冲宽度:脉冲波形从开始到结束之间的最小时间间隔;

时序路径:
时序路径(timing path)指设计中数据信号传播过程中所经过的逻辑路径。每一条时序路径都存在与之对应的一个始发点和一个终止点。

始发点:组合逻辑输入端、时序单元输入端;
终止点:组合逻辑输出端、时序单元输入端;

这样就有4种时序路径的组合:
1、输入端到触发器;
2、触发器到触发器;
3、触发器到输出端;
4、出入端到输出端;(需要虚拟时钟??)

PT的输入输出文件:
输入文件(【】表示非必须):

  • 后端的网表和【SPEF文件】(连线的寄生电容电阻)(网表是综合后的网表,SPEF是后端PR的)
  • 标准单元的库文件
  • 【其他库文件。如IO库,IP库等等】
  • 时序约束文件

输出文件:

  • 带延时的SDF文件(主要!!!,做后仿使用)
  • 各种报告以及保留结果的session文件;
  • Timing eco文件(有时序违例时重复迭代此步(给后端进一步优化版图,修完后会重新给一个SDF文件和session文件)直到时序违例消除,)

PT流程以及分步骤讲解


过程可寻求帮助:

  • man pt_command
  • pt_command -help
  • help * command *

2.1 设计STA环境

  • 设置环境变量,如顶层的名字
  • 创建目录结构,RPT,OUT等文件夹
  • 指定临时文件存放目录等
  • 设置一些自定义命令等

2.2 指定STA库文件

  • 设置search_path,link_library
  • search_path设定好后,综合工具只会从该指定的路径去寻找各种库文件
  • link_library:包含target_library??,在此基础上再加上IO库文件,IP库文件等
  • 不需要target_library(因为不需要做compile)??

2.3 读取Netlist文件

  • 读入所有Netlist后,指定顶层模块并link
  • 一般只有一个网表文件
  • 使用 read_verilog netlist.v读入网表

2.4 读取SPEF文件

  • SPEF是由专门的Start RC工具从后端版图中提取的参数文件(标准的工具算的寄生电容、寄生电阻更精确)ICC也可以提取,但是不是专门的工具。
  • SPEF主要包括连线的寄生电容和寄生电阻

2.5 设置约束文件

  • set_propagated_clock [all_clocks]设计成propagate后是一个实际的延时(实际的线网延时),这步是必不可少的。(没设置的话clock默认是理想的具有无穷大的驱动能力,时序就不准确)

  • 时钟的创建,需要知道在哪一个端口创建时钟,以及时钟的频率,相位等。还要知道时钟之间的相互关系

  • 设置内部transition约束,输入输出的延时控制,输入输出的驱动能力/负载;

  • 设置时钟的不确定性。设置的值可以比DC时的小,因为skew和latency已经确定了。主要是预防jitter以及预留一些余量;

设置约束文件——OCV(on chip variation)
早期的工艺没有OCV,直接BC_WC(Bset_coner,Worst_coner)分别检查hol/setup时序;进入深压微米后,芯片内部不同位置的PVT情况不同,更差情况是同一条时序路径上launch path和capture path的PVT不同

假设date path(Launch path)处在WC,clock path(capture path)处在BC,有少量的偏差。通过引入OCV用derate来模拟实际的这种情况,并保留一定的余量,按一定的系数放大或者缩小,来模拟OCV的情况。比如Launtch的正常的延时是A,系数是0.95,则现在的延时是0.95A,Capture path正常的延时是B,系数是1.03则现在的延时是1.03B

  • 一般有专门CAD team的人确定这个sign-off标准
  • 计算setup时,launch path * late(>1), capture path * early(<1)
  • 计算hold时,launch path * early, capture path * late 扫到所有corner并且保证不会有时序违例

设置约束文件——AOCV(更高级的OCV,之前是对整个芯片使用统一的derate,不是特别可靠)

  • 对于更新的工艺,如12nm,7nm,5nm,需要AOCV
  • fab会提供一个derate的查找表
  • 通过逻辑的物理级数以及物理距离对不同的逻辑单元给予不同的derate数值。更 加贴近实际情况。不至于过分悲观,也不至于过分乐观

2.6 输出报告并保存数据文件

  • 用check_timing检查设计中是否有路径没有被约束
  • 用report_clock检查时钟是否设置正确
  • 用report_qor查看整体综合后的summary结果
  • 用report_timing查看具体的setup/hold时序信息
  • 用write_sdf写出综合后的sdf文件
  • 用save_session保存当前数据文件
  1. 设置propagate 2.设置derate模拟OCV的过程

PT基础使用

两种启动PT方式

  • pt_shell:命令行方式,最常用
  • primetime: 图形化界面方式

PT打开时会自动运行当前目录下的.synopsys_pt.setup文件。一些统一的参数配置等可以写在这个文件里。

脚本分步骤运行以及source一次性运行
pt_shell -f top_pt.tcl -output_log_file top_pt.log
可以用history查看之前使用过的命令或者上下箭头

PT其他使用

  • 一般由专门研究工艺的CAD team设计一个合理的timing sign-off标准。对不同的PVT分别设置什么derate。过分悲观会增大面积,过分乐观可能导致实际芯片时序有问题。

  • 针对不同的Library会分别启动PT逐个把所有corner都处理一遍,并保存对应的session。一个PT处理一个corner,多运行几次PT。

  • 每次PT设置不同的derate。只有每次PT的timing都通过了整个timing才能算通过。

  • 用pt_shell -multi_senario可以同时导入所有的session。并用fix_eco_drc以及fix_eco_timing修复timing,并给出timing ECO文件。

  • 后端会根据ECO文件进行进一步修复

  • 迭代直到时序收敛

PT实操

初始目录结构:

##   file :top_pt_ff.tcl
set SCRIPT_FILE         script
set CORNER              saed90nm_max_hth###############################################################
######              设置STA环境                          ######
###############################################################
source -echo ./$SCRIPT_FILE/set_env.tcl
source -echo ./$SCRIPT_FILE/file_create.tcl###############################################################
######              指定STA库文件                         ######
###############################################################
set search_path [list \./ \../ \/home/XXX/fab/synopsys90nm_lib/stdcel/db/ss1p08v125c \]#set target_library   [list ${CORNER}.db]
set link_library     [list "*" ${CORNER}.db]set_app_var report_default_significant_digits 4###############################################################
######              读取Netlist                            ######
###############################################################
puts "### read design started"
read_verilog $NETLIST
current_design $WORKING_DESIGN
link_design -verboseputs "### read design done"set_operating_conditions -analysis_type on_chip_var -library [get_libs ${CORNER}*]
###############################################################
######              读取SPEF                           ######
###############################################################
############# read spef ################
set parasitics_log_file $REPORT_PATH/parasitics_command.log
set_app_var si_enable_analysis true
set_app_var si_filter_per_aggr_noise_peak_ratio 0.01
set_app_var si_xtalk_delay_analysis_mode  all_path_edgesif ($EXIST_SPEF) {read_parasitic  -keep_capacitive_coupling $SPEF_FILE -verbosecomplete_net_parasiticsreport_annotated_parasitics -check -constant_arcs -list_not_annotated -max_nets 100000
}###############################################################
######              设置约束文件                           ######
###############################################################source -echo ./${SCRIPT_FILE}/read_constraints.tclupdate_timing -fullset_timing_derate  -early [expr 1 - 0.05]
set_timing_derate  -late  [expr 1 + 0.03]# write sdf
write_sdf -context verilog -significant 4 $OUT_PATH/${WORKING_DESIGN}.sdf.setuphold_recrem -version 3.0 -include {SETUPHOLD RECREM}
write_sdf -context verilog -significant 4 $OUT_PATH/${WORKING_DESIGN}.sdf -version 3.0######################### save session ###################
if {$SAVE_SESSION == 1} {save_session $DATA_OUT/$CORNER/sessionset f [open "restore_session_${CORNER}.csh" w]puts $f "\
#!/bin/csh
pt_shell -sgq normal:1c:4m -x \"restore_session $OUT_PATH/session\"
"close $fexec chmod +x "restore_session_${CORNER}.csh"
}###############################################
###############################################################
######              输出报告                                 ######
###############################################################
source -echo ./${SCRIPT_FILE}/report.tcl# get fanout number
#sizeof_collection [get_pins -leaf -of [get_nets x_stdblk_rtl/inst_sif/ADDR1[1] ] -filter "direction==in" ]

set_env.tcl:

###   file :set_env.tclset WORKING_DESIGN      plus_pipe
set SOURCE_FILE         source_file
set NETLIST             ./${SOURCE_FILE}/${WORKING_DESIGN}.v
set SPEF_FILE           ./${SOURCE_FILE}/${WORKING_DESIGN}.spefset file_version        cp_test
set RPT_DIR             RPT
set OUT_DIR             OUT###  设置的控制变量
set SAVE_SESSION        1
set REPORT_GEN          1
set EXIST_SPEF          0set RPT_OUT             [format "%s%s" $RPT_DIR/ $file_version]
set DATA_OUT            [format "%s%s" $OUT_DIR/ $file_version]
set REPORT_PATH         [format "%s%s" $RPT_OUT/ $CORNER]
set OUT_PATH            [format "%s%s" $DATA_OUT/ $CORNER]

file_create.tcl :创建目录结构

### file  : file_create.tclif {[file exist $RPT_DIR]} {echo "File $RPT_DIR already exist"
} else {exec mkdir $RPT_DIRecho "Creating $RPT_DIR !!!"
}if {[file exist $RPT_DIR/$file_version]} {echo "File $file_version already exist"#exec rm $RPT_DIR/$file_version -r#exec mkdir $RPT_DIR/$file_version#echo "Re-create $file_version files"
} else {exec mkdir $RPT_DIR/$file_versionecho "Creating $file_version in $RPT_DIR !!!"
}if {[file exist $RPT_DIR/$file_version/$CORNER]} {echo "File $file_version/$CORNER already exist"exec rm $RPT_DIR/$file_version/$CORNER -rexec mkdir $RPT_DIR/$file_version/$CORNERecho "Re-create $file_version files"
} else {exec mkdir $RPT_DIR/$file_version/$CORNERecho "Creating $file_version/$CORNER in $RPT_DIR !!!"
}if {[file exist $OUT_DIR]} {echo "File $OUT_DIR already exist"
} else {exec mkdir $OUT_DIRecho "Creating $OUT_DIR !!!"
}if {[file exist $OUT_DIR/$file_version]} {echo "File $file_version already exist"# exec rm $OUT_DIR/$file_version -r# exec mkdir $OUT_DIR/$file_version# echo "Re-create $file_version files"
} else {exec mkdir $OUT_DIR/$file_versionecho "Creating $file_version in $OUT_DIR !!!"
}if {[file exist $OUT_DIR/$file_version/$CORNER]} {echo "File $file_version/$CORNER already exist"exec rm $OUT_DIR/$file_version/$CORNER -rexec mkdir $OUT_DIR/$file_version/$CORNERecho "Re-create $file_version files"
} else {exec mkdir $OUT_DIR/$file_version/$CORNERecho "Creating $file_version/$CORNER in $OUT_DIR !!!"
}

执行以上内容得到新的目录结构
OUT:存放输出文件
RPT:存放报告

read_constrains.tcl:

set timing_disable_clock_gating_checks true
set timing_enable_multiple_clocks_per_reg true
set enable_recovery_removal_arcs true
set timing_report_unconstrained_paths 1create_clock -name CLK_IN  -p 10 [get_ports CLK_IN] -waveform {0 5}set_max_transition  1.0 [current_design]
set_max_transition  -clock_path 0.90 [all_clocks]
set_clock_transition 0.9 [all_clocks]
set_input_transition 0.89 [all_inputs]set_driving_cell -lib_cell NBUFFX2 -pin Z -no_design_rule  [all_inputs]
set_load [load_of ${lib_slow}/NBUFFX2/INP] [all_outputs]
#set_load  0.02 [all_outputs]
#set_load  0.006484 [all_outputs]set_input_delay 3 -clock CLK_IN [all_inputs]
set_input_delay -max 5 -clock CLK_IN  {PLUS_A PLUS_B}
set_input_delay -min 2 -clock CLK_IN  {PLUS_A PLUS_B}
set_output_delay 1 -clock CLK_IN {COUT SUM_OUT}#set_multicycle_path -setup  2 -from A -to B
#set_multicycle_path -hold   1 -from A -to B# false path
set_false_path -from [get_ports RST]

report.tcl

puts "### reporting started"if {$REPORT_GEN == 1} {update_timing -fullredirect -tee -compress -file $REPORT_PATH/all_clock.rpt.gz {report_clock -skew}#check multiple clocks pe$REPORT_PATHredirect -tee -compress -file $REPORT_PATH/check_timing_multiclock.rpt.gz {check_timing -over {data_check_multiple_clock}}#check no clocksredirect -tee -compress -file $REPORT_PATH/check_timing_no_clock.rpt.gz {check_timing -over {no_clock} -verbose}#check ideal clocksredirect -tee -compress -file $REPORT_PATH/check_timing_ideal_clocks.rpt.gz {check_timing -over {ideal_clocks} -verbose}#check input delayredirect -tee -compress -file $REPORT_PATH/check_timing_input_delay.rpt.gz {check_timing -over {no_input_delay partial_input_delay} -verbose}#check no driving cellredirect -tee -compress -file $REPORT_PATH/check_timing_no_driving_cell.rpt.gz {check_timing -over {no_driving_cell} -verbose}#check loopsredirect -tee -compress -file $REPORT_PATH/check_timing_loops.rpt.gz {check_timing -over {loops} -verbose}#check unconstrained endpoints (clock-domain crossing may be included).redirect -tee -compress -file $REPORT_PATH/check_timing_unconstrained_endpoints.rpt.gz {check_timing -over {unconstrained_endpoints} -verbose}#check disbled timing arcsredirect -tee -compress -file $REPORT_PATH/disable_timing.rpt.gz {report_disable_timing -nosplit}#constraints violationsredirect -tee -compress -file $REPORT_PATH/violators_short_all.rpt.gz {report_constraint -all_violators -nosplit}#setup timingredirect -tee -compress -file $REPORT_PATH/violators_short_setup.rpt.gz {report_constraint -all_violators -max_delay -nosplit -recovery}#hold timingredirect -tee -compress -file $REPORT_PATH/violators_short_hold.rpt.gz {report_constraint -all_violators -min_delay -nosplit -removal}#report_timingalias report_timing_summary report_timing -path summary -nosplit -slack_lesser_than 0.0 -max_paths 1000redirect -tee -compress -file $REPORT_PATH/violators_summary_setup.rpt.gz {report_timing_summary -delay max}redirect -tee -compress -file $REPORT_PATH/violators_summary_hold.rpt.gz {report_timing_summary -delay min}#transitionredirect -tee -compress -file $REPORT_PATH/violators_short_trans.rpt.gz {report_constraint -all_violators -max_transition -min_transition -nosplit}#qorputs "##### reporting qor #####"redirect -tee -compress -file $REPORT_PATH/qor.rpt.gz {report_qor}
}

输出文件和报告

STA静态时序分析——学习笔记相关推荐

  1. (108)FPGA面试题-介绍STA静态时序分析及其作用

    1.1 FPGA面试题-介绍STA静态时序分析及其作用 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍STA静态时序分析及其作用: 5)结束语. 1 ...

  2. TCL与STA静态时序分析----邸志雄课程

    一.TCL语言 1. TCL概述 1.1 启动TCL 1.2 置换 1.2.1 变量置换 1.2.2 命令置换 1.2.3 反斜杠置换 1.3 变量.数组和列表 1.3.1 变量 脚本语言的变量可以存 ...

  3. 【小技巧】STA静态时序分析概述

    STA的简单定义如下:套用特定的时序模型(Timing Model),针对特定电路分析其是否违反设计者给定的时序限制(Timing Constraint).以分析的方式区分,可分为Path-Based ...

  4. STA(静态时序分析)总结

    STA(Static Timing Analysis,即静态时序分析)在实际FPGA设计过程中的重要性是不言而喻的,其作用是: 1.帮助分析和验证一个FPGA设计的时序是否符合要求: 2.指导fitt ...

  5. java时序图工具_每日学习:静态时序分析入门面面观

    关注并标星大同学吧 每天1次,打卡学习 积累1个新知识,增1分职场底气 作者称谓:Jack xu 个人介绍:不断学习的数字后端工程师 微信公众号:志芯 半导体知识分享第41期 技能升级,从这里开始 本 ...

  6. [静态时序分析简明教程(一)] 绪论

    静态时序分析简明教程一:绪论 一.写在前面 1.1 快速导航链接· 二.什么是静态时序分析 三.为什么需要时序约束 四.约束的第一步:综合 4.1 什么是综合 4.2 综合与时序约束的关系 4.2.1 ...

  7. FPGA学习笔记【FPGA原理与结构】

    注意:本篇内容根据<FPGA原理和结构>([日]天野英晴 著 赵谦 译)一书整理,作者也是初学者,有错漏请见谅 基础知识 FPGA即现场可编程门阵列(Field Programmable ...

  8. 数字IC设计学习笔记_静态时序分析STA_ STA基本概念

    数字IC设计学习笔记 STA基本概念 1. STA基本概念 2. 时序弧概念 Timing Arc 3. 建立时间和保持时间概念 4. 时序路径概念Timing Path 5. 时钟域概念clock ...

  9. 数字IC设计学习笔记_静态时序分析STA_伪路径False Paths

    数字IC设计学习笔记 半周期路径Half Cycle Path 1. 伪路径False Paths 2. 如何处理False Paths 1. 伪路径False Paths 在设计中,有些路径是不可能 ...

最新文章

  1. java多线程中的join方法详解
  2. Python 元类(控制实例创建)
  3. nginx的error.log日志常见的几个错误解决方法
  4. poj 3308(最小割求解最小点权覆盖)
  5. lede 命令 启用 ssh_PHP imap_open函数任意命令执行漏洞
  6. Python缩进的几个原则
  7. java get方法不序列化_Java中的Json序列化,不容忽视的getter
  8. numpy数组中冒号[:,:,0]与[...,0]的区别
  9. 兼容彩虹支付系统商户登录模板(彩虹系统版本)
  10. 应届生开40万年薪?OPPO大手笔招揽芯片人才引热议
  11. Pytorch forward()的简单理解与用法
  12. C++查找一个目录下所有特定扩展名的文件
  13. mysql 索引建立标准_mysql索引规范
  14. QQ坦白说v1.1 软件 源码 解析
  15. 腾讯地图api使用——地图选点自动定位到当前位置
  16. Sql Sugar使用仓储实现增删改查
  17. Elasticsearch 如何实现类主流搜索引擎广告置顶显示效果?
  18. 51nod_1000
  19. arm push/pop/b/bl汇编指令
  20. 鼠标被计算机无法识别怎么办,电脑无法识别鼠标的处理方案

热门文章

  1. python资讯_python学习-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  2. DMOZ重新接受登录申请(转)
  3. 转溪风吴韵のPower Design下载地址
  4. 3月下旬到5月中旬之前采制的茶叶
  5. android studio 下拉菜单,android studio 的下拉菜单Spinner使用详解
  6. 汽油的90#、93#、97#有什么区别的?
  7. [笔记]Open3D基础知识及例程demo
  8. 房价整体下降已成定局
  9. 软件架构非功能需求——互操作性
  10. 哪位神犇可以帮忙啊。