FPGA开发,在实际工程应用中,会将每次编译的版本时间写在寄存器中,以便在上板测试时能够通过读寄存器的方式,获取版本号。传统的方式,我们会在每次综合前,手动去更改版本号和版本日期。下面介绍一种,Quartus每次综合时自动更改版本号和版本日期的方式。
这个方法,在Intel FPGA的官网中有介绍:
Quartus II Tcl实例
Quartus II Tcl实例:自动版本号
Quartus II Tcl实例:日期时间戳
Quartus II Tcl实例:数据和时间格式
上述介绍中,有一些链接无法点开,需要重新访问Intel的英文网站,即可点开,如下:
Quartus II Tcl Example: Automatic Script Execution
Quartus II Tcl Example: Automatic Version Number
Quartus II Tcl Example: Get Subversion Revision Number
Quartus II Tcl Example: Increment Version Number in File
Quartus II Tcl Example: Version Number in Verilog Register Bank
下面介绍详细的步骤:
Step 1. 使用宏定义赋值版本号寄存器
使用宏定义的方式写RTL中的版本号。
//版本号
assign version = `VERSION;
assign compile_date = `COMPILE_DATE;
assign compile_time = `COMPILE_TIME;
将版本号的宏定义单独放在1个.h文件中,如:version.h
`define VERSION 32'hAAAA_BBBB
`define COMPILE_DATE 32'h2020_0423
`define COMPILE_TIME 32'hFF23_2325
Step 2. 制作TCL脚本
使用TCL自动化脚本,用于生成版本号。TCL每运行一次,重新更改一次version.h中的内容。
version_gen.tcl脚本如下:
#version_gen.tcl
set dat [clock format [clock seconds] -format{%Y-%m-%d %H:%M:%S}]
puts stdout $dat
set date [clock format [clock seconds] -format{%Y%m%d}]
set time [clock format [clock seconds] -format{%H%M%S}]
#注意修改version.h的路径
set file "./version.h"
set fileid [open $file w+]
seek $fileid 0 start
puts $fileid "`define VERSION 32'hAAAABBBB"
puts $fileid "`define COMPILE_DATE 32'h$date "
puts $fileid "`define COMPILE_TIME 32'hFF$time "
close $fileid
Step 3. 修改QSF文件
单独执行version_gen.tcl即可更改version.h文件。下面,我们需要做的是,在Quartus每次综合前,自动去调用这个脚本。那么,每次综合前version.h会自动刷新一遍。
在Quartus每次综合前,自动去调用这个脚本,需要在Quartus工程的QSF文件中,添加如下代码行。那么,在每次综合之前,脚本就会自动运行。
set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:version_gen.tcl
从此之后,再也不用手动去更改版本号了。Intel的示例中,还有很多更高级的用法,详见前文链接中的内容。