Quartus® II TCL Beispiel: Automatische Versionsnummer

author-image

Von

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:

# 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

Der Inhalt dieser Seite ist eine Kombination aus menschlicher und computerbasierter Übersetzung des originalen, englischsprachigen Inhalts. Dieser Inhalt wird zum besseren Verständnis und nur zur allgemeinen Information bereitgestellt und sollte nicht als vollständig oder fehlerfrei betrachtet werden. Sollte eine Diskrepanz zwischen der englischsprachigen Version dieser Seite und der Übersetzung auftreten, gilt die englische Version. Englische Version dieser Seite anzeigen.