1.新建一个set_version.tcl
文件,执行该tcl就可以新建一个version.h文件。
#!/usr/bin/tclsh
set d [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S}]
puts stdout $d
#post_message -type critical_warning "compile time is: $d"
puts "compile time is: $d"
set dat [clock format [clock seconds] -format {%Y%m%d}]
set tim [clock format [clock seconds] -format {%H%M%S}]
set file "../src/include/version.h"
set fileid [open $file w+]
seek $fileid 0 start
puts $fileid "`define REVISION 32'h00000000"
puts $fileid "`define REVISION_DATE 32'h20200617"
puts $fileid "`define COMPILE_DATA 32'h$dat"
puts $fileid "`define COMPILE_TIME 32'h00$tim"
close $fileid
2.生成的version文件
`define REVISION 32'h00000000
`define REVISION_DATE 32'h20200617
`define COMPILE_DATA 32'h20210304
`define COMPILE_TIME 32'h00232900
3.在代码中引用头文件即可。
`include "version.h"
4.注意version.h的位置,可以引用相对工程文件的路径,也可以添加全局搜索路径,例如quartus中设置如下。
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:../build_lib/set_version.tcl"
set_global_assignment -name SEARCH_PATH ../build_lib
5.quartus工具中,加入PRE_FLOW_SCRIPT_FILE约束,即表示在编译前先执行该脚本。该脚本生成了一个version.h的文件,该文件中有宏定义,访问该寄存器即可以知道该版本是何时编译的。
6.在vivado中,打开setting,找到synthesis的tcl.pre,表示运行综合前先执行该脚本。
7.值得注意的是,vivado中tcl中的路径比较怪异,根路径并不是xpr的路径。比如:
---> prj
--->set_version.tcl
---> src
--->include
version.h
set_version.tcl的路径是set file "./../../../../src/include/version.h"
8.添加文件 C:\Xilinx\Vivado\2019.2\scripts\vivado_init.tcl 默认编译最多线程8
set_param general.maxThreads 8
get_param general.maxThreads