本文轉自:自己的微信公眾號《集成電路設計及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的全稱 #