配置文件的自动化生成和管理

注意:本文所有内容皆来源于Xilinx工程师,如需转载,请写明出处作者及赛灵思论坛链接并发邮件至cncrc@xilinx.com,未经Xilinx及著作权人许可,禁止用作商业用途。

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子文件夹。如果不存在的话,可以添加相关命令,生成子文件夹之后再进行复制。

本文粗浅地介绍了一种利用Tcl脚本来自动化实现mcs生成并复制的方法。关键点在于弄获取Tcl文件执行和存放的路径。由于Tcl的加入,Vivado可以有更多新的玩法来简化日常工作。有心的朋友可以多关注一下,并在论坛中多进行交流。

附件下载: gen_mcs.zip https://forums.xilinx.com/xlnx/attachments/xlnx/CN_support_blog/47/1/gen...

来源:赛灵思论坛

最新文章

最新文章