完整的STA需要滿足以下兩點:
- 完整的設計限制(完整并不意味着正确)
- 運作所有需要的時序檢查
可以用以下兩條指令來進行完整性的檢查:
check_timing // 檢查是否缺少了限制條件
report_analysis_coverage // 檢查是否是否對時序進行check
一、檢查限制的完整性
check_timing 這一指令會檢查設計中的每個現有限制,如果有缺失的限制,則會發出警告,我們可以根據警告對設定的限制進行檢查。
check_timing的完整檢查項目如下,粗體表示預設選項:
我們以下圖所示電路為例,對check_timing的檢查内容進行說明。
1、No input delay
這類警告是預設關閉的,你需要設定變量:
pt_shell>set_app_var timing_input_port_default_clock true
收到這種警告資訊,我們需要知道:這個輸入引腳和什麼相連?哪條路徑會受到這條警告的影響(或者此case缺少輸入端口的分析)?
我們需要檢查是否有必要限制這個port,一些情況下,是不需要為input port添加限制的
- 假設這個端口應該由set_case_analysis 指令設定,驅動一個固定的信号比如
- 假設以這個port為起點的路徑在目前模式的分析中是不存在的;
2、No output delay
收到這類警告需要去知道:輸出端口連接配接的是什麼,寄存器還是輸入端口?這條警告所影響的路徑是哪一條,他是否是一個輸出的時鐘端口?
輸出端口必須被output delay 所限制;
如果這個端口是一個輸出的時鐘端口,我們不需要為端口定義output_delay,建立所需要的generate_clock 然後忽略這條警告;
3、No clock
收到這類警告需要去知道:哪裡需要建立一個時鐘去驅動受影響的端口;
檢查時鐘信号是否由于某些時序弧的禁用或使用者使用set_sense指令手動停止信号而在時鐘端口的扇出中被阻斷。
二、檢查執行的完整性
report _ analysis _coverage 這一指令會檢查設計中的每個現有時序檢查,如果有任何未執行,則會發出警告和原因。我們需要決定這個時序檢查是否有必要,還有檢查什麼原因導緻時序檢查沒有被執行。
導緻時序檢查未執行的原因由下面這些:
我們以下圖為例,對這些原因進行具體的說明。
1、False path
false_path一般是使用者使用set_false_paths指定,異步或者專用的時鐘組;
收到此類的警告,我們需要去知道:1.這條時序路徑包含哪個時鐘?2.F1的上一級觸發器是什麼?3.哪條false_path的指令或者clock_group的指令與此warning相關
設定false path使用的指令為
pt_shell > set_false_path -from F2/CLK -to F1/D
2、user disabled
出現此類的warning,我們需要去知道:這個時序檢查隻是對指定cell(F1)無效還是定義在cell庫中,對所有instance都無效?這兩者在指令的書寫上是不同的:
pt_shell > set_disable_timing -from CLK -to D F1
pt_shell > set_disable_timing -from CLK -to D {get_lib_cell core_slow.db/fdesf2a15}
3、constant_disable
這種警告一般出現在:
- 使用者指定 set_case_analysis
- 信号固定為高電平或低電平;
出現此警告我們需要确認,這個timing的disable是不是由于使用者指定的case或者恒高或者恒低電平的信号導緻的;使用者哪條限制導緻了 timing的disable。
pt_shell > set_case_analysis 0 scan_en
三、Debug指令
當使用check_timing 和 report_analysis_coverage 指令對限制進行檢查時,按上文所述,有可能出現一些warning,這時我們需要對出現的warning進行檢查,最常用的debug指令如下圖:
這些指令可以讓我們快速定位問題所在。
1、all_fanin
如上圖,當F1的clk端發出no clock warning,我們可以使用以下指令
pt_shell > all_fanin -startpoints -flat -to F1/CLK
即可以找到CLK的起始點,溯源問題發生的原因。
all_fanin的用法如下:
如例子中的圖所示,all_fanin會追蹤時序弧,最後在三種端口停下:
- 輸入端口(input port)
- CLK flop pins ,鎖存器的G和D pins
- 時序弧被disable或missing的cell 的輸出pins
2、report_cell
如果我們定位到了問題的所在,可以使用report_cell指令檢視該單元的詳細資訊。
report_cell的用法如下:
3、get_attribute
PrimeTime中,針對每一個設計對象(design objects)的資訊都存儲在attribute中,我們可以利用get_attribute指令來擷取單獨的設計對象的資訊。
上圖中,指定的clocks這一attribute存儲了所有穿過該pin的時鐘資訊。
4、report_disable_timing
report_disable_timing這一指令會檢查disable的時序弧,并給出原因。
其具體用法如下:
5、report_case_propagation
我們可以使用 report_case_propagation指令來查找使用者定義的值。
其用法如下
6、all_fanout
這一指令與all_fanin類似:
用法也基本一緻:
合理利用PT提供的指令,我們可以很快地找到問題的所在,快速修改時序限制不合理的地方。