Contoh Quartus® II Tcl: Nomor Versi Otomatis

author-image

Oleh

Hal ini berguna untuk memiliki nomor versi atau stempel waktu yang tertanam dalam desain FPGA Anda. Stempel nomor atau waktu versi menghilangkan kebingungan tentang versi desain Anda yang saat ini diprogram di FPGA. Agar angka tersebut bermanfaat, nomor tersebut harus diperbarui secara otomatis dalam alur kompilasi desain. Selain itu, nomor harus disimpan dalam perangkat keras desain, seperti di memori atau bank register.

Contoh Tcl ini menjelaskan berbagai cara untuk menghasilkan cap versi atau stempel waktu, serta berbagai cara untuk menyimpannya dalam desain. Kemudian, ini menunjukkan kerangka kerja skrip yang dapat Anda gunakan untuk membuat skrip Tcl yang menghasilkan dan menyimpan nomor versi secara otomatis, setiap kali Anda mengompulasikan desain. Terakhir, ini menunjukkan contoh skrip lengkap.

Dapatkan Nomor

Daftar berikut menunjukkan bagaimana Anda dapat menghasilkan nomor versi:

Simpan Nomor

Selain mendapatkan nomor, Anda harus menuliskannya dalam file desain. Berikut adalah contoh cara menyimpan nomor:

Kerangka Kerja Skrip

Anda dapat menggabungkan metode untuk mendapatkan dan menyimpan nomor yang sesuai dengan alur desain Anda. Dari contoh di atas, pilih metode untuk mendapatkan nomor dan metode untuk menyimpan nomor. Salin prosedur yang sesuai ke berkas Tcl dan tambahkan perintah untuk menghubungi prosedur. Kerangka kerja skrip berikut menunjukkan bagaimana skrip Anda harus ditulis. Terakhir, tambahkan tugas (dijelaskan di bawah) ke File Pengaturan Quartus II Anda (. qsf ) untuk memungkinkan skrip berjalan secara otomatis.

# Masukkan prosedur untuk mendapatkan nomor di sini 
# Prosedur masukkan untuk menyimpan nomor di sini # Baris ini 
mengakomodasi otomatisasi skrip, dijelaskan di kemudian hari 
{ flow project revisi } $quartus(arg) { 
   break } # Prosedur panggilan untuk mendapatkan nomor di sini # Lakukan 
konversi format angka yang diperlukan # Prosedur panggilan untuk menyimpan nomor di 
sini

Otomatisasi Skrip

Tambahkan baris berikut ke QSF proyek Anda untuk memungkinkan skrip berjalan secara otomatis sebelum setiap kompilasi. Ganti nama <skrip > dengan nama file Tcl Anda.

nama -set_global_assignment PRE_FLOW_SCRIPT_FILE quartus_sh:<script>

Lihat Eksekusi Skrip Otomatis untuk informasi lebih lanjut tentang penugasan dan cara lain untuk menjalankan skrip secara otomatis.

Contoh

Contoh skrip berikut menggunakan prosedur dari dua contoh berikut:

# Dapatkan nomor revisi SVN untuk
file proc get_subversion_revision { file_name } {

    global done # Jumlah detik maksimum untuk menunggu perintah

    svn info
    # menyelesaikan set timeout_seconds
    30

    # Perintah info svn dengan nama file yang dijalankan
    set cmd "svn info ${file_name}"

    # Upaya untuk mendapatkan informasi versi.
    # Jika perintah tidak dapat dijalankan, kembalikan galat.
    # Jika tidak mengatur peristiwa file untuk memproses keluaran perintah.
    jika { [catch {open "|$cmd"} input] } {
        return -code error $input
    } else {
        fileevent $input dapat dibaca [list get_revision_info $input ]

        # Mengatur waktu habis sehingga proses tidak dapat hang jika
        repositori # sedang down.
        setel timeout [after [ expr { $timeout_seconds * 1000 } ]  [list set done -1] ]

        # Jangan lanjutkan hingga nomor revisi ditemukan,
        # atau waktu operasi habis. Tetap batalkan waktu habis.
        vwait dilakukan
        setelah membatalkan $timeout } } # Prosedur

pembantu untuk prosedur
proc get_revision_info { inp  } { global yang dilakukan revision_number jika {

    [eof $inp] } } {
        penangkapan {close $inp}
        yang diatur selesai 1 }
    elseif { $done } {
        gets $inp line } else {
        gets $inp line # Gunakan ekspresi
        reguler untuk mencocokkan baris dengan
        nomor revisi #.
        jika { [regexp {^Revisi:\s+(\d+)\s*$} $line cocok revision_number] } {
            set done 1
        } } } # Membuat bank register dalam file

verilog dengan
nilai hex proc generate_verilog yang ditentukan { hex_value } { set num_digits

    [string length $hex_value]
    bit_width [expr { 4 * $num_digits } ]
    set high_index [expr { $bit_width - 1 } ]
    set reset_value [string repeat "0" $num_digits]

    jika { [catch { set
        fh [buka "version_reg.v" w ]
        menempatkan "modul version_reg $fh (clock, reset, data_out);"
        menempatkan $fh "    clock input;"
        menempatkan $fh "    input reset;"
        menempatkan keluaran $fh "    \[$high_index:0\] data_out;"
        menempatkan $fh "    reg \[$high_index:0\] data_out;"
        puts $fh "    always @ (posedge clock or negedge reset) begin"
        menempatkan $fh " jika        (!reset)"
        menempatkan $fh "            data_out <= ${bit_width}'h${reset_value};"
        menempatkan $fh "        else"
        menempatkan $fh "            data_out <= ${bit_width}'h${hex_value};"
        menempatkan $fh "    end"
        menempatkan $fh "endmodule"
        dekat $fh }
    res ] } {
        return -code error $res } else {
    return
        1 } } #
    Baris ini

mengakomodasi foreach otomasi skrip
{ flow project revisi } $quartus(args) { break }

set file_name ${project}.qpf
set done 0 set revision_number
"" # Prosedur panggilan untuk mendapatkan

nomor revisi file dan menangani kesalahan
jika { [menangkap { get_subversion_revision $file_name } msg] } {
   post_message -type critical_warning "Tidak dapat menjalankan perintah untuk mendapatkan nomor revisi. $msg" } 
else { 
   if { -1 == $done }  { post_message 
      -type critical_warning "Timeout getting revision number." 
   } elseif {[string equal "" $revision_number] } { 
      post_message -type critical_warning "Tidak menemukan nomor revisi dalam output info svn $file_name." 
   } else { 
      # Prosedur panggilan untuk menyimpan nomor jika { 
       [penangkapan { generate_verilog $revision_number } res] } { 
         post_message -type critical_warning \ "Tidak dapat menghasilkan file Verilog. $res" } 
      lain { 
         post_message "Nomor versi yang berhasil diperbarui ke\ versi 0x${revision_number}" 
      } } 
}

Jika Anda memberi nama skrip update_version.tcl, Anda harus menambahkan baris berikut ke QSF Anda:

set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl

Isi halaman ini adalah kombinasi terjemahan manusia dan komputer dari konten berbahasa Inggris. Konten ini diberikan hanya untuk kenyamanan Anda serta sebagai informasi umum dan tidak bisa dianggap sebagai lengkap atau akurat. Jika terdapat kontradiksi antara versi bahasa Inggris halaman ini dan terjemahannya, versi bahasa Inggris akan didahulukan. Lihat versi bahasa Inggris halaman ini.