Quartus® II Tcl 範例:自動版本編號

author-image

作者

在您的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

這個頁面的內容綜合了英文原始內容的人工翻譯譯文與機器翻譯譯文。本內容是基於一般資訊目的,方便您參考而提供,不應視同完整或準確的內容。如果這個頁面的英文版與譯文之間發生任何牴觸,將受英文版規範及管轄。 查看這個頁面的英文版。