Vivado 自动维护的版本信息
- 读取和写入 verilog 文件中的宏定义
- 读取版本号并更新
- 获取日期时间并格式化
gen_version.tcl
# gen_version.tcl
proc gen_version {args} {
proc get_defines_from_vh {file_name} {
## 创建空字典
set verilog_defines [dict create]
## 检查文件是否存在
if {[file exists $file_name] } {
## 打开文件
catch { set fid [open $file_name r] }
## 检查文件是否成功打开
if {[info exists fid]} {
seek $fid 0 start
while { [eof $fid] == 0} {
## 从文件读取一行, 并使用正则表达式匹配 verilog 宏定义
if {[regexp {.*?`define\s+(.*?)\s+(.*?)$} [gets $fid] full_match key value]} {
## 将 verilog 宏定义加入到字典中
dict set verilog_defines $key $value
}
}
close $fid
}
}
return $verilog_defines
}
proc put_defines_to_vh {file_name verilog_defines} {
## 打开文件
catch { set fid [open $file_name w] }
## 检查文件是否成功打开
if {[info exists fid]} {
seek $fid 0 start
## 遍历字典中所有项并按照宏定义格式写入到文件
dict for {key value} $verilog_defines {
puts $fid "`define $key $value"
}
close $fid
}
return 0
}
## 获取工程跟目录
set prjDir [file normal [get_property "DIRECTORY" [get_projects]]]
## 推断输出文件目录
set file_name "$prjDir/src/version.vh"
## 检查输出目录是否存在
if {![file exist "$prjDir/src"]} {
file mkdir "$prjDir/src"
}
## 从文件中读取宏定义数据到字典
set verilog_defines [get_defines_from_vh $file_name]
set new_revision_number 0
## 遍历字典所有项
dict for {key value} $verilog_defines {
## 显示旧版本号并更新版本号
if {[string equal COMPILE_REVISION $key] == 1} {
set new_revision_number [expr $value + 1]
puts "old revision number :$value"
}
## 显示旧编译日期
if {[string equal COMPILE_DATE $key] == 1} {
set year [string range $value 0 3]
set month [string range $value 4 5]
set day [string range $value 6 7]
puts "old compile date :$year-$month-$day"
}
## 显示旧编译时间
if {[string equal COMPILE_TIME $key] == 1} {
set hour [string range $value 0 1]
set minutes [string range $value 2 3]
set seconds [string range $value 4 5]
puts "old compile time :$hour:$minutes:$seconds"
}
}
## 设置新的编译日期和时间
set new_compile_date [clock format [clock seconds] -format "32'h%Y%m%d" ]
set new_compile_time [clock format [clock seconds] -format "32'h00%H%M%S" ]
## 更新字典中的宏定义数据
dict set verilog_defines COMPILE_REVISION $new_revision_number
dict set verilog_defines COMPILE_DATE $new_compile_date
dict set verilog_defines COMPILE_TIME $new_compile_time
puts "write to $file_name"
puts "write contents $verilog_defines"
## 将字典中宏定义数据写入到文件中
put_defines_to_vh $file_name $verilog_defines
## 将 version.vh 文件添加到当前文件组中
if {[llength [get_files version.vh -of_objects [current_fileset]]] == 0} {
add_files -norecurse $file_name
update_module_reference
}
return 0
}