針對特定的設(shè)計(jì),就編譯時(shí)間而言,我們要分析時(shí)間都消耗在哪些環(huán)節(jié)從而有針對性的縮短編譯時(shí)間。通常,時(shí)間可能花費(fèi)在加載約束上,也可能花費(fèi)在某個(gè)子步驟如布局。有時(shí)面對的情況是同一設(shè)計(jì)在不同Vivado版本上運(yùn)行時(shí)間出現(xiàn)較大差異。
report_constraints
我們先來介紹第一個(gè)命令:report_constraints。運(yùn)行該命令之前需要先在Vivado Tcl Console中執(zhí)行如下命令:
source report_constraints.tcl
同時(shí)最好將該腳本與待分析的dcp放置在同一目錄下,這樣在讀取dcp時(shí)就只用提供當(dāng)前工作目錄即可。另外,需要注意的是report_constraints只能在Linux系統(tǒng)下運(yùn)行。report_constraints可報(bào)告出設(shè)計(jì)中所用到的約束的種類(包括時(shí)序約束也包括非時(shí)序約束)、數(shù)量以及有效性。
通常情況下,Xilinx建議采用如下順序描述時(shí)序約束。除第10條set_bus_skew之外,約束的優(yōu)先級也是依此順序的,即1號優(yōu)先級最低,9號優(yōu)先級最高。因此,不合理的順序以及不合理的描述方式會(huì)導(dǎo)致一些約束被覆蓋,從而造成設(shè)計(jì)“假收斂”的現(xiàn)象。
對于一個(gè)復(fù)雜的設(shè)計(jì),除了用戶約束文件外,還可能會(huì)有IP的約束文件,這些約束文件可能在用戶約束文件之前被調(diào)用(約束文件屬性PROCESSING_ORDER為EARLY),也可能在用戶約束文件之后被調(diào)用(約束文件屬性PROCESSING_ORDER為LATE)。report_constraints可報(bào)告出所有約束文件所包含的約束。
案例1:只報(bào)告上述10種時(shí)序約束的個(gè)數(shù)
如下圖所示(使用report_constraints時(shí)需要在添加作用域即tb::)。該報(bào)告第1列顯示約束類型,第2列顯示需要在用戶約束之前調(diào)用的約束個(gè)數(shù),第3列顯示用戶約束的個(gè)數(shù),第4列顯示需要在用戶之后調(diào)用的約束個(gè)數(shù),第5列顯示和開發(fā)板相關(guān)的約束個(gè)數(shù)(當(dāng)Part選擇為開發(fā)板時(shí)),最后一列顯示OOC綜合時(shí)用到的約束個(gè)數(shù)。
案例2:報(bào)告所有約束及約束用到的命令
通過添加-all選項(xiàng),report_constratins可報(bào)告所有約束(時(shí)序約束+非時(shí)序約束)的數(shù)目以及這些約束用到的Tcl命令的個(gè)數(shù),如下圖所示。
在Vivado Commands Summary中,可以看到get_cells、get_pins、get_ports以及set_property等命令的使用情況。
案例3:報(bào)告約束的具體信息
添加選項(xiàng)-details和-verbose,report_constratins可報(bào)告約束的詳細(xì)信息,如下圖所示。
案例4:報(bào)告時(shí)序畫像
選項(xiàng)-timing_graph和-verbose可用于報(bào)告時(shí)序畫像,如下圖所示。當(dāng)Status列由Invalidatetiming變?yōu)镽equired valid timing時(shí),Estimatedupdates加1,這個(gè)值越小越好,根據(jù)此值可判斷約束描述的順序是否是最優(yōu)的。
profiler
對Vivado編譯時(shí)間進(jìn)行調(diào)試時(shí),命令profiler可幫助用戶查看特定操作的運(yùn)行時(shí)間,分析指定命令的調(diào)用次數(shù),從而確定整體運(yùn)行時(shí)間的瓶頸。profiler命令的具體使用方法如下所示:
profiler add *
profiler start
open_checkpoint top_routed.dcp
profiler stop
profiler summary
profiler summary -log profiler.log
profiler summary -log profiler.csv -csv
生成的csv文件可用excel打開,第一部分內(nèi)容如下。第一列顯示了所執(zhí)行的命令,倒數(shù)第2列(ncalls)顯示了該命令被調(diào)用的次數(shù),最后一列顯示了執(zhí)行該命令所耗時(shí)間占整體運(yùn)行時(shí)間的百分比。
profiler生成報(bào)告還能顯示前50條最耗時(shí)的命令,如下圖所示。可用看到除open_checkpoint之外,get_clocks最耗時(shí)。
報(bào)告的第三部分可以看到設(shè)計(jì)中Tcl命令的使用情況,如下圖所示。圖中commands列(最后一列)為Tcl命令,size列為該命令返回的對象的個(gè)數(shù),count列為返回同樣個(gè)數(shù)的命令的個(gè)數(shù),total列等于size與count的乘積。以第122行g(shù)et_cells為例,返回120個(gè)對象的get_cells有24個(gè),所以總對象個(gè)數(shù)為120x24即2880。
profiler命令還可用于查看指定命令的運(yùn)行時(shí)間,這對于發(fā)現(xiàn)約束中哪些命令最為耗時(shí)很有幫助,使用方法如下所示。從生成報(bào)告中可以看到get_cells命令共耗時(shí)32.984ms。
profiler start
set cells [get_cells
-hier -filter"REF_NAME==FDRE"]
profiler stop
profiler summary
vivadoRuntime
命令vivadoRuntime可用于查看不同策略下每個(gè)階段所消耗的時(shí)間,使用方法如下圖所示。每個(gè)Elapsed列對應(yīng)1個(gè)策略(也就是1個(gè)DesignRun)。
使用上述3個(gè)命令我們可用快速偵測出約束中耗時(shí)的命令以及implementation階段耗時(shí)的子步驟。
審核編輯:劉清
-
DCP
+關(guān)注
關(guān)注
0文章
30瀏覽量
17251 -
Vivado
+關(guān)注
關(guān)注
19文章
813瀏覽量
66657 -
csv
+關(guān)注
關(guān)注
0文章
39瀏覽量
5832
原文標(biāo)題:縮短Vivado編譯時(shí)間(4):時(shí)間都去哪兒了
文章出處:【微信號:Lauren_FPGA,微信公眾號:FPGA技術(shù)驛站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論