這篇博文介紹了多種自動生成報告的有效途徑,以便您在嘗試對設計中特定階段所耗用的編譯時間進行調試時使用,例如,自動報告加載設計約束的時間、每條命令的持續時間,甚至是跨多個設計的運行時間差異。
此外還提供了關于如何解讀這些結果的建議。其中涵蓋了 3 個強大的腳本,用于應對這些用例。
一、Report_constraints:
對約束分析時間進行剖析之前,需知曉寫入約束時建議的順序要求。這些要求是根據每種類型的約束的優先級來決定的。時序約束的最優排序如下所述:
1. set_disable_timing
2. set_case_analysis
3. create_clock
4. set_clock_sense
5. create_generated_clock
6. set_input_delay / set_output_delay
7. set_min_delay / set_max_delay
8. set_false_path
9. set_multicycle_path
10. set_bus_skew
除了 set_bus_skew 之外,其他約束類型的優先級隨編號而遞增,并且覆蓋先前約束類型的可能性也越高。因此,僅限更高優先級的約束才會對所涵蓋的路徑進行分析。
為減少約束解析所用的時間,約束應盡可能精確無誤并且限定到目標范圍內。如需了解更多信息,請參考 UG949 中的“建議的約束順序”部分:
在復雜設計中,總是需要添加許多約束文件,包括 IP 約束和用戶添加的約束。要獲取這些約束的匯總表,可在 Tcl shell 中調用 report_constraints 腳本,以報告 XDC 或 DCP 文件中使用的約束 Tcl 命令(時序和非時序)數量。它還可以根據約束排序,對生成的時序更新數量進行粗略估計。您需使用下列語法找到此腳本:
語法
示例:
1. 按 XDC 文件名報告時序約束數量
此示例演示了 4 個獨立 XDC 文件中每一種約束類型的數量
2. 利用 -all 選項報告時序約束和非時序約束
非時序命令包括當前使用的所有 Vivado 命令,例如,get_pins、get_clocks 等。
3. 報告詳細的約束信息和各項約束的詳情
4. 報告時序計算圖 (graph)
此腳本可以估算各命令對于時序計算圖的影響,它還能通過報告估算的時序更新數量(部分更新或完整更新)來幫助您了解這些約束是否采用了最優排序,其報告結果為 “Estimated updates: xxx”。
當命令流從 “Invalidate timing”(使時序失效)轉變為“Require valid timing”(需有效時序)時,即可檢測到時序更新。
通過使用此腳本,您應該能夠看到這些約束的更新和加載次數,并確定約束是否具有重復的定義或有效的狀態。
注釋:報告的時序更新次數只是估算總數。但它確實能夠呈現時序約束是否采用了最優排序。
二、剖析器profiler.tcl:
在 Vivado shell 中根據執行目標操作來調試特定設計的運行時間問題時,可以在 Vivado Tcl shell 中找到剖析器文件“profiler.tcl”,用于執行以下操作:
剖析 Vivado 命令或用戶進程
執行運行時間分析,幫助了解運行時方面的瓶頸
分析特定命令或進程的調用次數(以改善腳本效率)
剖析器報告的輸出 log 日志文件中包含 4 個部分:
匯總表
排名前 50 的運行時間
排名前 10 的集合
剖析的所有命令的詳細運行時間
注釋:輸出格式可采用表格(默認)格式或 CSV (profiler summary -csv) 格式。
語法:
使用示例:
報告部分詳情:
第 1 部分:匯總表
通過對表格列進行計數,得到耗用的總體時間的統計結果。每個列的含義如下:
這樣即可輕松確定哪些命令占用的運行時間最長。如下圖所示,get_clocks 和 get_nets 命令均多次調用,占用了大部分的運行時間。
第 2 部分:排名前 50 的運行時間
此處報告了前 50 個最差的運行時間,按最差到最好進行排序。它提供了對運行時間影響最嚴重的命令的快速匯總信息。
其中包含以下列:
? ID(可用于查找 log 日志文件內的命令):匹配 Vivado 已處理的命令的順序。ID 1 是運行的第一條命令,ID 2 是第二條,以此類推。
? runtime:以 ms 為單位的運行時間
? command:Vivado 運行的命令
以下截屏顯示了 50 行列表中的一部分:
第 3 部分:排名前 10 的集合
這部分包括由任意剖析的命令返回的 10 個最大的對象集合。其中對于每個集合都包含:
? size:集合大小
? count:大小相同的集合數量
? total:對象總數 (size * count)
? commands:返回該集合的命令列表
第 4 部分:詳情報告
這部分包含已剖析的每條命令的全部詳細信息,按第一條到最后一條命令排序。其中包含命令 ID、運行時間、命令以及每條命令對象數量:
用例:
1. 改善約束效率
對 Tcl 腳本進行剖析有助于了解運行時間的使用方式以及 Vivado 命令或用戶進程的調用次數。它有助于重構對運行時至關重要的 Tcl 代碼,顯著改善運行時間。
以下示例對兩個等效版本的 Tcl 循環之間的運行時間差異和 Vivado 命令的調用次數進行了比較:
構造前:
結果顯示,有 75,216 次調用用于 get_property 命令,這占用了大部分的運行時間。因此,我們可以把“get_property”命令移至循環外部以節省時間。
構造代碼后,耗費的總時間減少了 95%:
2. 跨多個設計比較運行時間
在跨不同 Vivado 版本進行網表加載或約束解析時,您可能會遇到時間差異。以下示例演示了 2 輪不同的 Vivado 運行之間耗用運行時間的方式。
此方法有助于對不同版本間耗用的每條命令的調用次數進行調試。在此情況下,有問題的版本運行針對每個命令的調用次數都增加了一倍。
正常版本:
問題版本:
三、Vivado Runtime:
如需對多個設計上跨多個階段的 Vivado 命令的運行時間進行比較,可使用 VivadoRuntime 腳本從 Vivado log 日志文件內的:
runtime/memory/checksum/timing/congestion/command 行提取部分調試信息。它還可用于比較多個 Vivado log 日志文件之間的信息。此腳本可用于提取定制運行時間,前提是這些運行時間的格式正確。它會從文本 log 日志文件中提取信息,并可在 Shell 提示符下執行。
語法:
示例:
在此示例所示表格中,對 Vivado 流程中每個階段的多個 log 日志文件進行了比較。
總結:
通過使用這 3 個強大的腳本,您即可快速識別約束和運行階段的瓶頸,從而最終幫助您節省運行時間。
審核編輯:湯梓紅
-
調試
+關注
關注
7文章
589瀏覽量
34062 -
TCL
+關注
關注
10文章
1741瀏覽量
88873 -
編譯時間
+關注
關注
0文章
4瀏覽量
5509 -
時序約束
+關注
關注
1文章
115瀏覽量
13457 -
腳本
+關注
關注
1文章
391瀏覽量
14938
原文標題:開發者分享|節省編譯時間系列-利用 Tcl 腳本對編譯時間進行剖析
文章出處:【微信號:gh_2d1c7e2d540e,微信公眾號:XILINX開發者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論