本篇是《Vivado使用誤區與進階》系列的最后一章,關于FPGA的時序分析。
《XDC 約束技巧》系列中討論了XDC 約束的設置方法、約束思路和一些容易混淆的地方。我們提到過約束是為了設計服務,寫入 Vivado中 的 XDC 實際上就是用戶設定的目標,Vivado對 FPGA 設計的實現過程必須以滿足 XDC 中的約束為目標進行。那我們如何驗證實現后的設計有沒有滿足時序要求?又如何在開始布局布線前判斷某些約束有沒有成功設置?或是驗證約束的優先級?這些都要用到 Vivado 中的靜態時序分析工具。
靜態時序分析
靜態時序分析(Static Timing Analysis)簡稱 STA,采用窮盡的分析 方法來提取出整個電路存在的所有時序路徑,計算信號在這些路徑上的傳播延時,檢查信號的建立和保持時間是否滿足時序要求,通過對最大路徑延時和最小路徑延時的分析,找出違背時序約束的錯誤并報告。 STA 不需要輸入向量就能窮盡所有的路徑,且運行速度很快、占用內存較少、覆蓋率極高,不僅可以對芯片設計進行全面的時序功能檢查,而且還可以利用時序分析的結果來優化設計。所以 STA 不僅是數字集成電路設計 Timing Sign-off 的必備手段,也越來越多地被用到設計的驗證調試工 作中。 STA 在 FPGA 設計中也一樣重要,但不同于一般數字集成電路的設計,FPGA 設計中的靜態時序分析工具一般都整合在芯片廠商提供的實現工具中。在 Vivado 中甚至沒有一個獨立的界面,而是通過幾個特定的時序 報告命令來實現。
OCV與PVT
即便是同一種FF,在同一個芯片上不同操作條件下的延時都不盡相同,我們稱這種現象為OCV(on-chip variation)。OCV 表示的是芯片內部的時序偏差,雖然很細小,但是也必須嚴格考慮到時序分析中去。
產生OCV 的原因主要有PVT(Process / Voltage / Temperature)三個方面,而STA 要做的就是針對不同工藝角(Process Corner)下特定的時序模型來分析時序路徑,從而保證設計在任何條件下都能滿足時序要求,可以正常工作。
通常PVT 對芯片性能的影響如下圖所示,
不同的PVT 條件組成了不同的corner,另外在數字電路設計中還要考慮RC corner 的影響,排列組合后就可能有超過十種的corner 要分析。但是在FPGA 設計中的靜態時序分析一般僅考慮Best Case 和WorstCase,也稱作Fast Process Corner 和Slow Process Corner,分別對應極端的PVT 條件。
Multi-Corner
Vivado 中的 STA 支持多角時序分析(Multi-Corner Timing Analysis),會對以上兩種corner 下的時序同時進行分析,然后報告最差的情況。因為每個 corner 下的延時也會有一定的變化范圍,所以時序分析還會考慮每 種 corner 下的最大延時和最小延時。
如果一個設計在 Best Case 和 Worst Case 下都能滿足時序要求,則可以推算這個設計在其允許的任何操作條件下都能保持正常工作。
這里要提醒大家,不要被 corner 的名字誤導,實際上,同樣一條路徑可能在 Slow Corner 中滿足時序卻在 Fast Corner 中有時序違例。但是你在 Vivado 中看到的時序報告只會顯示其對兩種 corner 并行分析后選出的 最差情況。
有特殊需要的情況下,可以在 Vivado 中通過 config_timing_corners -corner-delay_type來選擇將某種 corner 應用于 setup 和/或 hold 的分析。在 Report Timing Summary 和 ReportTiming 的圖形化界面也可以通過 Timer Setting 對 corner 做調整,具體界面詳見稍后描述。
這樣最大化考慮 OCV 的時序分析方法在處理同一條路徑的共同時鐘路徑時也會應用不同的延時數據,從而會得出更為悲觀的數據。為了真實反映路徑延時情況,這部分延時必須被糾正,這就是 CRPR(Clock Reconvergence Pessimism Removal)。
仔細觀察時序報告便可以發現在報告路徑的 Slack 之前有一行顯示 clock pessimism 已經被考慮在內,在進行 Setup Check 時會加上一定的 clock pessimism,而 Hold Check 時則會減去一定的 clock pessimism。
下圖顯示了 CRPR 的來源以及在 Vivado 時序報告中的具體體現。
時序命令與報告
Vivado 中用于時序分析的命令主要有以下兩條,且都有對應的圖形化設置界面。
report_timing_summary 主要用于實現后的 timing sigh-off
report_timing 主要用于交互式的約束驗證以及更細致具體的時序報告與分析
report_timing_summary
我們先看看 report_timing_summary,實際上,不僅在布局布線后,在綜合后甚至是更具體的實現過程中 的每一小步之后都可以運行,從而得到一個全局的時序報告。
在 Vivado IDE 中點擊 Report Timing Summary 后可以改變報告的內容,例如每個時鐘域報告的路徑條數,是否 setup 和 hold 全都報告等等。每改變一個選項都可以看到窗口下方的 Command 一欄顯示出對應的 Tcl 命令。修改完設置后可以直接按 OK 鍵確認執行,也可以拷貝 Command 欄顯示的命令到 Tcl 腳本中稍后執行。
這里有個小竅門,通過-name 指定一個名字,就可以在 Vivado IDE 中新開一個窗口顯示這條命令的執行 結果,這個窗口還可以用來跟其他諸如 Device View 或是 Schematic View 等窗口之間 cross probing。這一點也同樣適用于包括 report_timing 在內的絕大部分 Vivado 中的 report 命令。
在設置窗口中還有 Timer Settings 一欄(report_timing 中也有),可以用來改變報告時采用的具體 corner、速度等級以及計算布線延時的方式。很多時候我們可以借助 Timer 的設置來快速驗證和調試設計需求。
舉例來說,在實現后的報告中顯示時序違例比較嚴重,我們可以直接在 Timer 設置中改變速度等級后重新 報告時序,來驗證把當前這個已經布局布線完畢的設計切換到更快一檔的芯片中是否可以滿足時序要求。
另外,在布局布線后的設計上報告時序,往往不能更直觀地發現那些扇出較大或是邏輯級數較高的路徑。此時我們可以修改連線模型為 estimated,報告出布局后布線前的時序而無需另外打開對應階段的 DCP 并重 新運行時序報告命令來操作,這么做節約時間的同時,也更容易找到那些高扇出路徑以及由于布局不佳而導致的時序違例。我們也可以修改連線模型為 none,這樣可以快速報告出那些邏輯延時較大以及邏輯級數較高的路徑。以上這些改變 Timer 設置的方法可以幫助我們快速定位設計中可能存在的問題和缺陷。
report_timing_summary 實際上隱含了 report_timing、report_clocks 、check_timing 以及部分的 report_clock_interaction 命令,所以我們最終看到的報告中也包含了這幾部分的內容。另外自 2014.3 版起,打開實現后的結果時會直接打開一個預先產生好的報告。
Timing Summary 報告把路徑按照時鐘域分類,每個組別下缺省會報告 Setup、Hold 以及 Pulse Width 檢 查最差的各 10 條路徑,還可以看到每條路徑的具體延時報告,并支持與 Device View、Schematic View 等窗 口之間的交互。
每條路徑具體的報告會分為 Summary、Source Clock Path、Data Path 和 Destination Clock Path 幾部分,詳細報告每部分的邏輯延時與連線延時。用戶首先要關注的就是 Summary 中的幾部分內容,發現問題后 再根據具體情況來檢查詳細的延時數據。其中,Slack 顯示路徑是否有時序違例,Source 和 Destination 顯示 源驅動時鐘和目的驅動時鐘及其時鐘頻率, Requirement 顯示這條路徑的時序要求是多少,Data Path 顯示數據路徑上的延時,Logic Level 顯示這條路徑的邏輯級數,而 Clock Path Skew 和 Clock Uncertainty 則顯示時鐘路徑上的不確定性。
以上圖這條路徑來舉例,通過 Summary 我們可以得到這樣的信息:這是一條 clk 時鐘域內的路徑,時鐘周期為 3.125ns,這條路徑有 0.268ns 的時序違例。違例的主要原因是邏輯級數較高導致的數據鏈路延時較大,但連線延時的比例也較高,所以可以仔細看看這條路徑的數據路徑上有沒有可能改進布局、降低扇出或者是減少邏輯級數的優化方向。
report_timing
report_timing 是更具體的時序報告命令,經常用來報告某一條或是某些共享特定節點的路徑。用戶可以在設計的任何階段使用 report_timing,甚至是一邊設置 XDC,一邊用其來驗證約束的可行性與優先級。在 Vivado IDE 中可以由 Tools > Timing > ReportTiming 調出其圖形化設置窗口。
與 report_timing_summary 類似,調整選項后對應的Tcl 命令也會在 Command 欄生成,在 Targets 一欄 還可以設置需要報告路徑的起始點/途經點/結束點,可以三個都設置或是僅設置其中任何一項,每一項都支持通配符匹配甚至是正則表達式查找。report_timing 報告出的路徑延時與 report_timing_summary 中具體到每根 路徑上的報告一致,可以以此為依據幫助我們定位時序失敗的原因。
用 report_timing 來報告時序其實還有一些更常見的應用場景,用來幫助我們設置和驗證約束,尤其是那些時 序例外約束。
舉例來說,在設計過程中我們約束了一條或數條多周期約束,不同于 UCF 必須讀入約束后重跑設計,我們可以直接在 Tcl Console 中輸入這條 XDC,無需重跑設計,直接用 report_timing 來驗證。在隨之顯示的時序報告 Summary 部分可以看到 Timing Exception 后列出這條路徑被設置了怎樣的時序例外約束(注意,不加額外 option 時,以下兩條命令都僅針對 setup check) 。
單純的一條多周期約束沒有什么特別,但是如果使用了通配符后的時序例外有重疊的情況下,Vivado 會根據 優先級來決定對某條路徑應用怎樣的約束。當設計較大,XDC 較多時,一邊設置 XDC 一邊用 report_timing 來驗 證就變得尤其重要。
另外,僅僅輸入 report_timing 而不加任何 option,Vivado 便會報告出時序違例最嚴重的那條路徑,方便我們快速了解當前設計的 WNS,找到最差的那條路徑。在驗證 I/O 約束時也常常用到 report_timing,只要指定-from 某個輸入或是-to 某個輸出便可以快速驗證當前設計在接口上的時序。
get_timing_paths
除了上述兩個大家比較熟悉的時序報告命令,Vivado 中還提供一個 get_timing_paths 的命令,可以根據指定 的條件找到一些特定的路徑。我們可以利用其返回值中的一些屬性來快速定位設計中的問題。
例如邏輯級數這個影響 FPGA 性能的一大因素,因為經常隱藏在時序報告后很難被發現。在 Vivado 中,除了借助綜合后的報告來找到那些可能因為邏輯級數較高而導致的時序難滿足的路徑外,還有一個更直接的辦法,可以一次性報告出設計中那些高邏輯級數的路徑,方便我們有針對性的深入分析和優化。
下圖這個例子報告了時序最差的 10 條路徑的邏輯級數。需要注意的是,在綜合后和在布局布線后用一樣的腳本報告出的結果會稍有不同,對邏輯級數較為關注的情況,還是建議以綜合后的結果為主要依據。
小結
本文可以視為對《XDC 約束技巧》系列文章的補充,希望可以幫助大家了解 FPGA 設計中的時序分析方法,學會使用 Vivado 中的靜態時序分析工具來驗證時序,定位問題,快速找到問題和解決方案。
《Vivado使用誤區與進階》系列,到此篇便結束了,更多關于Vivado設計集成環境的應用,可參考Xilinx官網的UG和在工程開發中體會。
審核編輯:湯梓紅
-
FPGA
+關注
關注
1630文章
21796瀏覽量
605999 -
FPGA設計
+關注
關注
9文章
428瀏覽量
26628 -
時序分析
+關注
關注
2文章
127瀏覽量
22616 -
靜態時序
+關注
關注
0文章
20瀏覽量
6962 -
Vivado
+關注
關注
19文章
815瀏覽量
66888
原文標題:Vivado使用進階:讀懂用好Timing Report
文章出處:【微信號:FPGA算法工程師,微信公眾號:FPGA算法工程師】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
玩轉Vivado之Timing Constraints
ISE Timing Anlayzer report
vivado:時序分析與約束優化
無法通過Vivado GUI在OOC模式下運行實現
Vivado 2017.4和2018.2不同的Linux和Windows之間的實現結果
Vivado下顯示指定路徑時序報告的流程
Vivado使用誤區與進階
Vivado中的靜態時序分析工具Timing Report的使用與規范
![<b class='flag-5'>Vivado</b>中的靜態時序分析工具<b class='flag-5'>Timing</b> <b class='flag-5'>Report</b>的使用與規范](https://file1.elecfans.com//web2/M00/A6/EA/wKgZomUMQT2AdIGwAAAygowafWg279.png)
Report QoR Suggestions助力解決Vivado設計問題
![<b class='flag-5'>Report</b> QoR Suggestions助力解決<b class='flag-5'>Vivado</b>設計問題](https://file.elecfans.com/web1/M00/B2/2D/pIYBAF4Efa-AC-4hAAJrlkkcCSA395.png)
時序分析的小工具——Global Timing Debugger
![時序分析的小工具——Global <b class='flag-5'>Timing</b> Debugger](https://file.elecfans.com/web1/M00/BC/FD/pIYBAF7DlKWAYQduAAAgMfqPLsg964.jpg)
Vivado時序案例分析之解脈沖寬度違例
![<b class='flag-5'>Vivado</b>時序案例分析之解脈沖寬度違例](https://file.elecfans.com/web1/M00/CF/F5/o4YBAF-2GjCAXj9CAABq_T6Hwc8147.png)
VIVADO中時序報告中WNS、WHS、TNS、THS有什么含義
![<b class='flag-5'>VIVADO</b>中時序報告中WNS、WHS、TNS、THS有什么含義](https://file.elecfans.com/web2/M00/18/CD/pYYBAGFxCe-AbCahAAAGD6M14zs019.png)
評論