PT教程

本文转自:自己的微信公众号《集成电路设计及EDA教程》

《PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)》

这篇推文讲一下数字IC设计中的post mask ECO和premask ECO,并讲解一下在ICC中Apply ECO的流程。

理论:

前面介绍了在ICC中Apply ECO的方法与流程,但是ICC并非Timing Signoff的一个工具,在ICC中做完布局布线之后,需要到PT中做STA,在Formaliry中做形式验证等等,如果存在违反需要进行ECO。

流程及脚本分享:

这里以修复hold为例,介绍一下PT ECO的方法并分享一下脚本。

首先在PT中进行STA,在任意一个scenario下面,如果存在timing的违反,最好将违反的path报告导出为一个文件,且不分行,这样便于用进程进行处理(如果同一个路径的报告换行的话格式会有点混乱,不便于处理)。可以用上面的redirect命令导出。

修复hold的方法一般就是在endpoint插入buffer或者delay cell。

下面是PT调用的修复hold的进程:

修复完成后需要再报告一下看是否还存在违反,如果还有违反就再次执行该进程:

sta_fix_hold_file ../../backend/pt/sta_rpts/hold_vio.timing “icc”

 

下面给出该tcl代码,并对该程序进行讲解:

#sta_fix_hold_file是进程的名字,要想调用该进程可以用如下格式:

#sta_fix_hold_file file_name(即PT产生的timing violations报告) icc/astro(设置PT产生ECO tcl脚本是用于astro的还是icc的)

# buf_lst后边是buffer或者delay cells的list,这些cells可被用于修复hold。

proc sta_fix_hold_file {file_name {tool icc} {buf_lst {DEL1V1_8TH40DEL1V2_8TH40 DEL2V1_8TH40 DEL2V2_8TH40 DEL3V1_8TH40 DEL3V2_8TH40 DEL4V1_8TH40

DEL4V2_8TH40 BUFV0_8TH40 BUFV12RQ_8TH40BUFV12_8TH40 BUFV16RQ_8TH40

BUFV16_8TH40 BUFV1_8TH40 BUFV20RQ_8TH40BUFV20_8TH40 BUFV24RQ_8TH40

BUFV24_8TH40 BUFV2_8TH40 BUFV32RQ_8TH40 BUFV32_8TH40BUFV3RQ_8TH40

BUFV3_8TH40 BUFV40RQ_8TH40 BUFV40_8TH40BUFV4RQ_8TH40 BUFV4_8TH40

BUFV6RQ_8TH40 BUFV6_8TH40 BUFV8RQ_8TH40BUFV8_8TH40}}} {

   set f [open $file_name r]

   gets $f line

   set end_path [lindex $line 0]

#regexp 命令(regexp expstring)用于判断正规表达式exp 是否全部或部分匹配字符串string,匹配返回1,否则0。

   while {![regexp {^Endpoint}$end_path]} {

   gets $f line

   set end_path [lindex $line 0]

   }

#TCL 提供了seek,tell和eof 等命令使用户可以非连续访问文件。

#eof fileId

#如果到达fileId 标识的文件的末尾返回1,否则返回0。

#string 命令具有强大的操作字符串的功能,其中的option 选项多达20 个。下面介绍其中常用的部分。

#string compare ?-nocase? ?-length int? string1 string2

把字符串string1 和string2 进行比较,返回值为-1、0 或1,分别对应string1 小于、等于或大于string2。如果有 -length 参数,那么只比较前 int个字符,如果 int 为负数,那么这个参数被忽略。如果有 -nocase 参数,那么比较时不区分大小写。

   while {![eof $f]} {

   gets $f line

   set end_path [lindex $line 0]

   if { [string compare $end_path""] && ![regexp {^---} $end_path] && ![regexp {^1}$end_path] } {

     puts "###fix holdviolation###current hold violated end point =============> $end_path"

     fix_eco_timing -type hold-method insert_buffer -to $end_path -buffer_list $buf_lst

   }

  }

#注意有个!{regexp {^1} $end_path},这是因为在生成报告的末尾会有个1,不能将其视为hold的违反。

  close $f

  if {$tool == "astro"}{

    write_astro_changes -formatscheme  eco_fix_hold.cmd

  } elseif {$tool =="icc"} {

    write_changes -format icctcl-output  eco_fix_hold.tcl

  } else {}

}

#使用范例,先报告PT中的hold违反:

report_timing -delay_type min

     -start_end_pair

     -slack_lesser_than -0

     -path_type end

     -nosplit >../../backend/pt/sta_rpts/hold_vio.timing

软件产生的报告是这样的(下面给的图片中slack没有小于-0的,所以用slack小于0.12的为例,主要关注报告的格式。由于系统精度与显示的问题,注意一定要在0前面加上负号,因为某些slack非常小的正数由于精度的问题,会四舍五入成0.00):

#调用进程修复hold违反

sta_fix_hold_file ../../backend/pt/sta_rpts/hold_vio.timing"icc"

# ../../backend/pt/eco_fix_hold.tcl

#修复完成后在PT中检查是否还存在hold的违反

check_timing

update_timing

report_timing

#report_timing -delay_type min

report_constraint -all_violators -min_delay

在PT产生ECO脚本之后,便可以在ICC中take ECO了。

更多资料欢迎移步微信公众号《数字集成电路设计及EDA教程》

 

网易云课堂视频课程

  

链接:https://study.163.com/course/introduction/1005909004.htm

Calibredrv教程-提高流程自动化

##  为了方便大家交流讨论  ##

##  建了一个QQ群  ##

## 集成电路设计及EDA教程  ##

## 加群请备注:EDA  ##

##  群二维码如下  ##

# 本公众号有个红包和资料福利微信群  #

#  集成电路设计及EDA教程福利群  #

#  为了避免乱七八糟的人加进来  #

#  可以先加我微信,我拉你进群  #

#  加我微信 请备注下面问题的答案  #

#       ASIC的全称       #

原文地址:https://www.cnblogs.com/ASIC-Horizon/p/11185974.html