在FPGA版本管理中,一般会在工程中通过寄存器定义版本号,在每次编译前需要修改相关寄存器的值来记录不同的功能版本,这样在上板调测时可以通过命令读取版本号来确认。在工程版本快速迭代时,手动方式修改版本号容易遗漏混淆,下面结合intel官网的《Quartus II Tcl 示例:脚本自动执行》,总结一种自动化的版本管理方法,具体实现步骤如下。
生成版本号
可以使用Tcl命令生成仅包含所需日期和时间元素的自定义格式日期和时间字符串。使用Tcl命令clock seconds返回当前时间,使用clock format生成自定义格式的日期和时间字符。
clock format [clock seconds] -format {%Y%m%d%H%M%S}
这样,把获取的时间信息写入到宏定义头文件保存后再调用即可,下面制作update_version.tcl脚本文件实现时间信息导出到update_version.h头文件,脚本内容如下:
#1.设置date年月日
set date [clock format [clock seconds] -format{%Y%m%d}]
#2.设置time时分秒
set date [clock format [clock seconds] -format{%H%M%S}]
#3.设置头文件路径
set file “design/top/update_version.h”
#4.打开文件
set fileid [open $file w+]
#5.定位到文件头
seek $fileid 0 start
#6.写入date年月日信息
puts $fileid “`define VERSION_DATE 32'h$date //year+month+day”
#7.写入time时分秒信息
puts $fileid “`define VERSION_TIME 32'h$time //hour+min+second”
#8.关闭文件
close $fileid
#9.删除变量date
unset date
#10.删除变量time
unset time
Tcl文件运行后,update_version.h文件中即会保存`define VERSION_DATE和`define VERSION_DATE宏定义声明。
脚本自动化
有三个全局赋值可以控制脚本的自动执行。此处列出了这些全局赋值以及它们运行脚本的时间。
PRE_FLOW_SCRIPT_FILE - before a flow starts
POST_MODULE_SCRIPT_FILE - after a module finishes
POST_FLOW_SCRIPT_FILE - after a flow finishes
将以下行添加到项目的QSF中,使脚本在每次编译之前自动运行。
set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:<sript_name>
如果将脚本命名为update_version.tcl,必须将以下行添加到QSF中:
set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl
使用set_global_assignment -name SEARCH_PATH命令分配指定项目库,把上述生成的update_version.h文件加入到该路径下编译。
set_global_assignment -name SEARCH_PATH /design/top
寄存器赋值
最后,通过宏定义对版本号寄存器赋值。
assign version_date = `VERSION_DATE;
assign version_time = `VERSION_TIME;