Es ist sinnvoll, eine Versionsnummer oder einen Zeitstempel in Ihr FPGA-Design eingebettet zu haben. Eine Versionsnummer oder ein Zeitstempel beseitigen jegliche Verwechslungen darüber, welche Version Ihres Designs derzeit im FPGA programmiert ist. Damit eine solche Zahl nützlich sein kann, muss sie im Designkompilierungsablauf automatisch aktualisiert werden. Außerdem muss die Nummer in der Design-Hardware, wie im Speicher oder einer Registerbank, gespeichert sein.
Dieses Tcl-Beispiel beschreibt verschiedene Möglichkeiten, eine Versionsnummer oder einen Zeitstempel zu generieren, sowie verschiedene Arten, sie in einem Design zu speichern. Dann wird ein Skript-Framework angezeigt, mit dem Sie ein Tcl-Skript erstellen können, das die Versionsnummer bei jeder Kompilierung eines Designs automatisch generiert und speichert. Schließlich wird ein Beispiel für ein vollständiges Skript angezeigt.
Eine Zahl erhalten
Die folgende Liste zeigt, wie Sie eine Versionsnummer generieren können:
Speichern Sie die Nummer
Sie müssen die Nummer nicht nur erhalten, sie in eine Designdatei schreiben. Die folgenden Beispiele zeigen, wie Sie die Nummer speichern:
Skript-Framework
Sie können Methoden zum Abrufen und Speichern einer Zahl passend zu Ihrem Designablauf kombinieren. Wählen Sie aus den oben genannten Beispielen eine Methode, um eine Zahl und eine Methode zum Speichern der Nummer zu erhalten. Kopieren Sie die entsprechenden Verfahren in eine Tcl-Datei und fügen Sie Befehle hinzu, um die Verfahren aufzurufen. Das nachstehende Skript-Framework zeigt, wie Ihr Skript geschrieben werden soll. Fügen Sie schließlich eine Zuweisung (unten beschrieben) zu Ihrer Quartus II Settings-Datei hinzu (. qsf), damit das Skript automatisch ausgeführt werden kann.
# Insert-Verfahren, um eine Zahl hier zu erhalten # Insert-Verfahren, um die Nummer hier zu speichern # Diese Zeile bietet Script-Automatisierung, beschrieben später foreach { flow project revision } $quartus(args) { break } # Call-Verfahren, um eine Zahl hier zu erhalten # Führen Sie eine beliebige anzahlformatige Konvertierungsprozedere durch, um die Nummer hier zu speichern
Skriptautomatisierung
Fügen Sie der QSF Ihres Projekts die folgende Zeile hinzu, damit das Skript automatisch vor jeder Kompilierung ausgeführt werden kann. Ersetzen Sie <Beschreibungsnamen > durch den Namen Ihrer Tcl-Datei.
set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:<Script-Name>
Weitere Informationen über die Zuweisung und andere Möglichkeiten zur automatischen Ausführung von Skripts finden Sie unter Automatische Skriptausführung.
Beispiel
Das folgende Skriptbeispiel verwendet Verfahren aus den folgenden zwei Beispielen:
- Eine Nummer erhalten: Versionskontrolle-Software-Revisionsnummer lesen
- Speichern Sie die Nummer: Verilog-Datei bei einer Registerbank
# Holt SVN-Revisionsnummer für die angegebene Datei proc get_subversion_revision { file_name } { global done # Die maximale Anzahl von Sekunden, bis der Befehl svn info # vollständig timeout_seconds 30 # gesetzt ist. Der Befehl svn info mit Dateiname, der eingestellt ist cmd "svn info ${file_name}" # Versuch, die Versionsinformationen zu erhalten. # Wenn der Befehl nicht ausgeführt werden kann, geben Sie einen Fehler zurück. # Andernfalls richten Sie ein Dateiereignis ein, um die Befehlsausgabe zu verarbeiten. if { [catch {open "|$cmd"} input] } { return -code error $input } else { fileevent $input readable [list get_revision_info $input ] # Einrichten eines Timeouts, damit der Prozess nicht hängen kann, wenn das #Repository nicht läuft. Timeout einstellen [nach [ expr { $timeout_seconds * 1000 } ] [list set done -1] ] # Don't continue, until the revision number is found, # or the operation timesout. Abbrechen Sie das Timeout sowieso. vwait nach Cancel $timeout } } # Helper procedure for the above procedure proc get_revision_info { inp } { global done revision_number if { [eof $inp] } { catch {close $inp} set 1 } elseif { $done } { gets $inp line } else { gets $inp line # Verwenden Sie einen regulären Ausdruck, um die Zeile mit der Nummer der Revisionsnummer zu entsprechen. if { [regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] } { set done 1 } } } # Erstellt eine Registerbank in einer Verilog-Datei mit dem angegebenen Hex-Wert proc generate_verilog { hex_value } { set num_digits [string length $hex_value] set bit_width [expr { 4 * $num_digits } ] set high_index [expr { $bit_width - 1 } ] gesetzt reset_value [string repeat "0" $num_digits] if { [catch { set fh [open "version_reg.v" w ] setzt $fh "Modul-version_reg (Takt, Reset, data_out);" setzt $fh " Input-Clock;" setzt $fh " Input Reset;" setzt $fh " ausgabe \[$high_index:0\] data_out;" setzt $fh " reg \[$high_index:0\] data_out;" setzt $fh " always @ (posedge clock oder negedge reset) begin" setzt $fh " if (!reset)" setzt $fh " data_out <= ${bit_width}'h${reset_value};" setzt $fh " else " setzt $fh " data_out < = ${bit_width}'h${hex_value};" puts $fh " end " setzt $fh "endmodule" close $fh } res ] } { return -code error $res } else { return 1 } } # Diese Zeile bietet Script Automation foreach { flow project revision } $quartus (args) { break } set file_name ${project}.qpf set done 0 set revision_number "" # Call procedure to get file revision number and handle any errors if {[catch { get_subversion_revision $file_name } msg] } { post_message -type critical_warning "Der Befehl konnte nicht ausgeführt werden, um die Revisionsnummer zu erhalten. $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 { # Aufrufverfahren, um die Nummer zu speichern, wenn { [catch { generate_verilog $revision_number } res] } { post_message -type critical_warning \ "Verilog-Datei konnte nicht generiert werden. $res" } else { post_message "Erfolgreich aktualisierte Versionsnummer auf\ Version 0x${revision_number}" } } }
Wenn Sie das Skript update_version.tclbenennen, müssen Sie der QSF die folgende Zeile hinzufügen:
set_global_assignment -name PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl