在您的FPGA設計中嵌入版本編號或時間戳記是十分有用的。版本編號或時間戳記可消除目前FPGA中程式化設計版本的任何困惑。若要讓這樣的數位有用,必須在設計編譯流程中自動更新。此外,該號碼必須儲存在設計硬體中,例如記憶體或收銀機。
這個 Tcl 範例說明產生版本編號或時間戳記的不同方式,以及在設計中儲存的不同方式。然後,它顯示一個腳本框架,您可以用來建立一個 Tcl 腳本,每次您編譯設計時都會自動產生並儲存版本編號。最後,它展示了一個完整腳本的範例。
腳本框架
您可以結合獲取和節省數位的方法,以符合您的設計流程。從上述範例中,選擇取得編號的方法和儲存號碼的方法。將適當的程式複製到 Tcl 檔案中,並新增命令來呼叫程式。下列腳本框架顯示您的腳本應如何編寫。最後,將作業(如下所述)新增到您的 Quartus II 設定檔 (。qsf ) 允許腳本自動執行。
# 插入程式以在此處取得編號 # 插入程式以將號碼儲存在這裡 #此行可適應腳本自動化,說明後續 的 foreach { Flow 專案修訂版 [ $quartus (args) { 中斷 [ # 呼叫程式 ,以在這裡取得號碼 # 做任何號碼格式轉換必要的 # 呼叫程式,將號碼儲存在這裡
腳本自動化
在專案的 QSF 中加入下列行,讓腳本在每次編譯之前自動執行。請用 Tcl 檔案的名稱>更換<腳本名稱。
set_global_assignment-名稱 PRE_FLOW_SCRIPT_FILE quartus_sh:<script 名稱>
如需作業和其他自動執行腳本方式的詳細資訊,請參閱 自動腳本執行 。
# 取得特定檔案專家的 SVN 修訂編號 get_subversion_revision { file_name { global 完成 # 等待 svn 資訊 # 命令完成設定為 timeout_seconds 30 的數秒之最長秒數 # 執行的 svn 資訊指令與檔案名稱 設定為 cmd 「svn 資訊 ${file_name[」# 嘗試取得版本資訊。 # 如果無法執行命令,請退回錯誤。 # 以其他方式設定檔事件以處理命令輸出。 如果 { [擷取 {開啟「|$cmd」[ 輸入] \ { 退回代碼錯誤 $input \ 否則 { fileevent $input可讀 [清單get_revision_info $input] # 設定超時,使程式無法在 # 儲存庫關閉時掛斷。 設定超時 [在 [expr { $timeout_秒 * 1000 ] [清單集完成 -1] 之後 ]# 請勿繼續,直到找到修訂編號 、# 或作業時間完成。反正取消超時。 vwait 在 取消上述程式的$timeout ® ® # 說明程式後完成, proc get_revision_info { inp = { global 完成revision_number 如果 { [eof $inp] \ {catch {關閉 $inp® 設定完成 1 = else elseif { $done { 得到$inp 行 [ 其他 { 得到$inp行 # 使用一般表達來符合 修訂編號的行號。 如果 { [RegExp {^修訂版:\s+(\d+)\s*$® $line比 revision_number] [ { set done 1 = = # 在 verilog 檔案中建立一個註冊銀行,其中包含特定的六重值 proc generate_verilog { hex_value { { 設定 num_digits [字串長度 $hex bit_width_value] 設定bit_width [expr { 4 * $num_位數 ] ] 集 high_index [expr { $bit_寬度 - 1 ] 設定 reset_value [字串重複 」0" $num_位數 ],如果 { [catch { set fh [開啟」version_reg.v" w ] 將$fh「模組version_reg(頻率、重設、data_out);」 將$fh「 輸入頻率;」 將$fh「 輸入重設;」 將$fh『 輸出 \[$high_index:0\] data_out;」 將 $fh『』[$high_index:0\] data_out;」 將$fh「 永遠 @(按時計時或 negedge 重設)開始 」,$fh「 如果 (!重設)」 將 $fh「data_out <= ${bit_width\h${reset_value\;」 將 $fh「其他」 放 $fh「data_out <= ${bit_width\'h${hex_value\;」 將 $fh「結尾」 讓$fh「endmodule」 關閉$fh [ res ] { 回程代碼錯誤 $res = 其他 { 退貨 1 \ # 此行符合腳本自動化 前言 { 流程專案修訂版 [ $res $quartus (args) { break { 設定 file_name ${project\.qpf 設定完成 0 組revision_number「」# 呼叫程式,以取得檔修訂編號並處理任何錯誤 ,如果 { [捕捉 { get_subversion_revision $file_name [ msg] { { post_message類型critical_warning「無法執行命令以取得修訂版編號。$msg」 \ 其他 { 如果 { -1 == $done \ { post_message -type critical_warning「超時取得修訂編號 」。[ elseif {[字串等於」$revision_編號] { { post_message -類型 critical_warning「找不到 svn 資訊輸出$file_name 的修訂編號。」 其他 { 如果 { [摽取 { generate_verilog $revision_編號 [ res] [ { { post_message -type critical_warning \ 「無法產生 Verilog 檔案,則可以儲存號碼。$res」 \ 其他 { post_message「成功更新版本編號至\ 版本 0x${revision_number\"\ =
如果您將腳本命名 update_version.tcl,則必須在您的 QSF 中新增下列行:
set_global_assignment───名稱 PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl