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