BY 盧昊
曾就職于上海貝爾(阿爾卡特朗訊),任FPGA工程師。目前從事FPGA加速計(jì)算方面的工作。有多年使用FPGA開(kāi)發(fā)和應(yīng)用的經(jīng)歷,熟悉Xilinx FPGA的體系結(jié)構(gòu)。
Vivado相比與上一代開(kāi)發(fā)工具ISE,一個(gè)巨大的提升就是全面支持Tcl腳本語(yǔ)言。由于全面支持Tcl腳本,所以可以利用Tcl來(lái)做一些好玩的事情。這里拋磚引玉,分享一點(diǎn)關(guān)于Vivado Tcl的使用小心得。
通常的工程中,直接生成的文件是bit文件(如果需要調(diào)試,可能還需要ltx文件)。而量產(chǎn)項(xiàng)目中,bit文件的內(nèi)容通常需要放在flash中(除了早年的Spartan-3AN,Xilinx目前還沒(méi)有在售的內(nèi)置Flash的FPGA產(chǎn)品),這個(gè)時(shí)候常見(jiàn)的操作是將bit文件轉(zhuǎn)為mcs文件或者bin文件,利用Vivado或者第三方工具燒入到Flash中。
在ISE時(shí)代,有個(gè)很好用的工具iMPACT來(lái)完成bit到mcs/bin文件的轉(zhuǎn)換。到了Vivado時(shí)代,由于可以使用Tcl腳本,所以通常建議使用Tcl腳本來(lái)生成mcs/bin文件,具體命令是write_cfgmem。
不過(guò)每次生成bit文件之后需要手動(dòng)輸入命令來(lái)生成一次,這樣的操作是比較麻煩的。這里提供一個(gè)方法來(lái)自動(dòng)實(shí)現(xiàn)生成mcs/bin文件的功能,在此基礎(chǔ)上還能完善更多的細(xì)節(jié)功能。
注意,如果使用non-project模式,或者即使是project模式也使用全腳本模式,那么則直接寫(xiě)入Tcl腳本即可。本文論述的方法是基于Project模式Vivado GUI使用的。
Vivado在每一步操作的設(shè)置中,有兩個(gè)選項(xiàng)可以使用。
其中,tcl.pre和tcl.post是添加tcl文件的路徑。tcl.pre表示這一步之前運(yùn)行添加的tcl文件,tcl.post表示這一步之后運(yùn)行添加的tcl文件。綜合,實(shí)現(xiàn)和bit文件的生成這些步驟都有這兩個(gè)設(shè)置可以使用。
所以基本思路就是,將需要的操作以Tcl腳本的形式寫(xiě)在Tcl文件中,然后添加到Bitstream Settings中的tcl.post中,這樣生成bit文件之后,Vivado就會(huì)自動(dòng)運(yùn)行相關(guān)的Tcl文件來(lái)實(shí)現(xiàn)需要的功能。
1. 首先需要注意的問(wèn)題是,Tcl文件運(yùn)行路徑。當(dāng)Tcl文件設(shè)置到Bitstream Settings中的tcl.post中之后,在運(yùn)行時(shí),運(yùn)行的路徑就是最后生成bit文件所在路徑,而與所添加的Tcl文件存放的路徑無(wú)關(guān)。獲取當(dāng)前路徑的Tcl命令:pwd。這一步通常是最令人困惑的,經(jīng)常會(huì)因?yàn)槁窂讲徽_而無(wú)法正確的運(yùn)行。
2. 知道路徑之后,下一步是需要知道bit文件名,這里就有一個(gè)需要注意的地方。通常,在生成bit文件的路徑下只會(huì)有一個(gè)bit文件,文件名是固定的,每次生成新的bit文件會(huì)覆蓋掉舊文件。但是有時(shí)候會(huì)出現(xiàn)有多個(gè)bit文件的情況,例如:會(huì)將bit文件改名但是依然保存在當(dāng)前路徑下;用于備份、調(diào)試時(shí)臨時(shí)放置了多個(gè)bit文件等。雖然這些情況并不被推薦,但是如果一旦存在,會(huì)導(dǎo)致Tcl腳本無(wú)法知道應(yīng)該處理哪個(gè)文件。一個(gè)簡(jiǎn)單可用的方法是,遍歷出所有的bit文件,并取修改時(shí)間最新的一個(gè)。由于剛生成bit文件之后就運(yùn)行Tcl腳本,所以最新的文件自然就是剛剛生成的bit文件。
對(duì)應(yīng)的Tcl腳本如下
set pro_path "[pwd]//" set bit_file_list [glob -path "$pro_path" "*.bit"] set file_time 0 foreach file $bit_file_list { set ftime [file mtime $file] if {$ftime == 0} { puts "Error File!" } if { $ftime > $file_time} { set file_time $ftime set file_name $file } }
上述代碼中,glob是用來(lái)查找bit文件的,file mtime是用來(lái)獲取文件的更新時(shí)間,用來(lái)對(duì)比。第一行用pwd獲取的路徑是絕對(duì)路徑, 后面加上“//”是用來(lái)作為一個(gè)目錄路徑,便于glob搜索并合成出新的文件名。為了防止出問(wèn)題,如果文件的修改時(shí)間查到是0,則認(rèn)為該文件不正確,會(huì)打印信息做提示。
3. 獲取文件之后,就可以生成mcs文件了。此時(shí)bit文件的文件名以完整的絕對(duì)路徑存儲(chǔ)在file_name變量中,最簡(jiǎn)單的做法是直接將文件的后綴“.bit”替換為“.mcs”即可。
Tcl代碼: set mcs_file "[file rootname $file_name].mcs" file rootname會(huì)獲取除了文件后綴之外的文件名全部信息,后面加上”.mcs”即可使用。如果要生成bin文件,修改mcs為bin即可。
4. 生成mcs文件。這里使用write cfgmem命令。具體格式依據(jù)需要進(jìn)行調(diào)整即可。最好加上-force來(lái)實(shí)現(xiàn)覆蓋舊文件。下面時(shí)write cfgmem的一個(gè)使用范例。
write_cfgmem -format MCS -size 256 -interface BPIx16 -loadbit "up 0x0 $file_name" -file $mcs_file -force
需要注意的是,這條指令中flash的容量及支持的接口模式需要用戶根據(jù)自己的開(kāi)發(fā)板進(jìn)行配置。另外,Zynq及Zynq Ultrascale+系列器件不是很適合用本文的方法來(lái)生成mcs文件。
到次,Tcl文件已經(jīng)完成自動(dòng)生成mcs文件的工作。每次生成好bit文件之后,就會(huì)在bit文件的路徑下自動(dòng)生成mcs文件。
不過(guò),通常的項(xiàng)目開(kāi)發(fā),對(duì)配置文件的需求還不止于此。這種每次生成的bit文件都放在工程默認(rèn)目錄下的操作,并不利于文件/版本的管理,也不利于發(fā)送/提交。較為常見(jiàn)的做法是將bit文件作為原始文件,附上燒錄Flash用的mcs文件、調(diào)試用的ltx文件等,一起轉(zhuǎn)存到其他路徑(例如公司的內(nèi)部私有網(wǎng)盤(pán))進(jìn)行備份/分發(fā),便于各個(gè)工程師按需所取。而這一步轉(zhuǎn)存,也可以集成在這個(gè)Tcl文件中。
首先,上文已經(jīng)點(diǎn)明,Tcl文件運(yùn)行的路徑和Tcl文件本身的路徑無(wú)關(guān),所以這個(gè)Tcl文件可以放在任意路徑下。如果需要將bit文件和mcs文件放置于某個(gè)固定路徑下保存,可以將該Tcl文件放于這個(gè)路徑下。然后運(yùn)行時(shí),從Tcl腳本中獲取Tcl文件所在路徑即可。
Tcl文件獲取文件本身路徑的命令 set dest_path "[ file dirname [ info script ] ]"
這樣Tcl文件的絕對(duì)路徑就存儲(chǔ)在dest_path這個(gè)變量中了,后續(xù)如果需要復(fù)制/移動(dòng)文件,可以以這個(gè)路徑作為基礎(chǔ)進(jìn)行相關(guān)修改。
復(fù)制文件的相關(guān)Tcl命令:
file copy -force $file_name "$dest_path/bitfile/" file copy -force $mcs_file "$dest_path/mcsfile/"
需要注意的是,目的路徑需要確實(shí)存在,比如上面的bitfile子文件夾和mcsfile子文件夾。如果不存在的話,可以添加相關(guān)命令,生成子文件夾之后再進(jìn)行復(fù)制。
編輯:hfy
-
project
+關(guān)注
關(guān)注
0文章
35瀏覽量
13264 -
Vivado
+關(guān)注
關(guān)注
19文章
804瀏覽量
66224
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論