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