此示例脚本展示了如何访问项目的版本控制软件版本号。可以将版本号写入在 FPGA 设计中编译的设计文件。FPGA 可以使用附加设计逻辑报告版本号。此信息在调试期间非常有用,在多个编程文件之间切换时尤其如此。可以根据 FPGA 中的版本号轻松找到正在 FPGA 上运行的设计版本。
此示例在项目中使用 Subversion 修订号。它使用 svn info 命令获取有关指定文件的信息。svn info 命令打印有关工作副本中各项的信息,其中一行包含修订号,格式如下:
Revision: <revision number>
此示例使用两个程序运行 svn info 命令并解析输出,从而获取修订号。get_subversion_revision 程序运行 svn info 命令。使用在 svn info 命令中使用的文件名调用此程序。如果无法运行此命令,此程序将返回错误。否则,此程序不返回任何信息,但会设置某些全局变量。如果 svn info 命令超时,全局变量 done 的值将为 -1。如果找到修订号,全局变量 done 的值将为 1,修订号位于 revision_number 全局变量中。可以在消息中显示修订号(如此示例所示),或者将其写入设计文件。
get_version_info 程序是一个帮助器程序,一次解析一行命令输出。它包含与修订号所在的行匹配并提取修订号的正则表达式。
proc get_subversion_revision { file_name } { global done # 等待完成 svn info 命令的 # 最大秒数 set timeout_seconds 30 # 包含已运行文件的文件名的 svn info 命令 set cmd "svn info ${file_name}" # 尝试获取版本信息。 # 如果无法运行此命令,则返回错误。 # 否则,设置一个处理命令输出的文件事件。 if { [catch {open "|$cmd"} input] } { return -code error $input } else { fileevent $input readable [list get_revision_info $input ] # 设置超时,使存储库停止运行时此程序 # 无法挂起。 set timeout [after [ expr { $timeout_seconds * 1000 } ] \ [list set done -1] ] # 找到修订号或操作超时时 # 再继续。无论哪种情况,取消超时。 vwait done after cancel $timeout } } proc get_revision_info { inp } { global done revision_number if { [eof $inp] } { catch {close $inp} set done 1 } elseif { $done } { gets $inp line } else { gets $inp line # 使用正则表达式匹配修订号 # 所在的行。 if { [regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] } { set done 1 } } } set done 0 set revision_number "" # 文件名通常为项目文件的名称 .qpf set file_name [lindex $quartus(args) 0] if { [catch { get_subversion_revision $file_name } msg] } { post_message -type critical_warning "Couldn't run command to get\ revision number. $msg" } else { if { -1 == $done } { post_message -type critical_warning "Timeout getting revision number." } elseif { [string equal "" $revision_number] } { post_message -type critical_warning \ "Couldn't find revision number in output of svn info $file_name." } else { post_message "Revision for $file_name is $revision_number" } }
可以使用以下命令在系统命令提示符下运行脚本(假设脚本位于名为 svn_revision.tcl 的文件中):
quartus_sh -t svn_revision.tcl myproject.qpf
脚本生成如下所示的消息,在其中显示修订号:
Info: Revision for myproject.qpf is 417
可以显示修订号位于全局变量 revision_number 中的消息(如此示例所示),或者将其写入设计文件。