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:
- Menghasilkan stempel waktu
- Baca nomor revisi perangkat lunak kontrol versi. Contoh ini menggunakan SVN.
- Masukkan angka yang disimpan dalam file HDL
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: baca nomor revisi perangkat lunak kontrol versi
- Menyimpan nomor: Berkas Verilog dengan bank register
# 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