基于Project模式Vivado GUI使用的配置文件自动化生成管理

电子说

1.2w人已加入

描述

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在每一步操作的设置中,有两个选项可以使用。

Vivado

其中,tcl.pre和tcl.post是添加tcl文件的路径。tcl.pre表示这一步之前运行添加的tcl文件,tcl.post表示这一步之后运行添加的tcl文件。综合,实现和bit文件的生成这些步骤都有这两个设置可以使用。

所以基本思路就是,将需要的操作以Tcl脚本的形式写在Tcl文件中,然后添加到Bitstream Settings中的tcl.post中,这样生成bit文件之后,Vivado就会自动运行相关的Tcl文件来实现需要的功能。

Vivado

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分