Exemple de Quartus® II Tcl : Numéro de version automatique

author-image

Par

Il est utile d’avoir un numéro de version ou un horodatage intégré à votre conception FPGA. Un numéro de version ou un horodatage élimine toute confusion quant à la version de votre conception actuellement programmée dans le FPGA. Pour qu’un tel nombre soit utile, il doit être mis à jour automatiquement dans le flux de compilation de la conception. Le numéro doit également être stocké dans le matériel de conception, par exemple en mémoire ou dans une banque de registres.

Cet exemple Tcl décrit différentes façons de générer un numéro de version ou un horodatage, ainsi que différentes façons de le stocker dans une conception. Ensuite, il présente un cadre de script que vous pouvez utiliser pour créer un script Tcl qui génère et stocke automatiquement le numéro de version, chaque fois que vous compilez une conception. Enfin, il montre un exemple de script complet.

Obtenir un numéro

La liste suivante montre comment générer un numéro de version :

Stockez le numéro

En plus d’obtenir le numéro, vous devez l’écrire dans un fichier de conception. Vous trouverez ci-dessous des exemples de stockage du numéro :

Script Framework

Vous pouvez combiner des méthodes permettant d’obtenir et d’enregistrer un nombre en fonction de votre flux de conception. Dans les exemples ci-dessus, choisissez une méthode pour obtenir un numéro et une méthode pour stocker le numéro. Copiez les procédures appropriées dans un fichier Tcl et ajoutez des commandes pour appeler la procédure. Le cadre de script suivant montre comment écrire votre script. Enfin, ajoutez une affectation (décrite ci-dessous) à votre fichier de paramètres Quartus II (. qsf ) pour permettre au script de s’exécuter automatiquement.

# Insérer la procédure pour obtenir un numéro ici 
# Insert procédure pour stocker le numéro ici # Cette ligne 
s’adapte à l’automatisation du script, décrit la version ultérieure 
foreach {révision du projet de flux } $quartus(args) { break } # procédure d’appel pour obtenir un numéro ici # Faites la conversion du format de 
   nombre nécessaire # La procédure 
d’appel pour stocker le numéro ici

Automatisation des scripts

Ajoutez la ligne suivante à la QSF de votre projet pour permettre au script de s’exécuter automatiquement avant chaque compilation. Remplacez <script name > par le nom de votre fichier Tcl.

Nom set_global_assignment PRE_FLOW_SCRIPT_FILE quartus_sh:<script>

Reportez-vous à Automatic Script Execution (Exécution automatique du script) pour plus d’informations sur la cession et d’autres moyens d’exécuter automatiquement des scripts.

Exemple

L’exemple suivant utilise les procédures à partir des deux exemples suivants :

# Obtient le numéro de révision SVN pour le proc de fichier spécifié
get_subversion_revision { file_name } { global done # Le nombre maximum de secondes à attendre que la commande svn info # remplisse le jeu timeout_seconds
    30 # La commande svn info avec nom de

    fichier qui est exécuté
    cmd « svn info {file_name} »

    # Tentative d’obtenir les informations
    de version. # Si la commande ne peut pas être exécutée, retournez une erreur.
    # Sinon, configurez un événement de fichier pour traiter la sortie de commande.
    si {[capture {open « |$cmd"} entrée] }
        {erreur de retour de code $input
    }
        {fileevent $input lisible [liste get_revision_info $input ] # Configurez un délai de mise

        à l’arrêt afin que le processus ne puisse pas rester en place si le
        référentiel #est désactivé.
        définir le délai d’expiration [après [expr { $timeout_secondes * 1000 } ]  [list set done -1] ] # Ne continuez pas tant que le numéro de

        révision n’est pas trouvé,
        le # ou les temps d’exploitation s’arrêtent. Annuler le délai d’expiration de toute façon.
        possibilités
        d’annulation $timeout } } # Procédure

d’aide pour la procédure ci-dessus
proc get_revision_info { inp  } { global done revision_number if {

    [eof $inp] } {
        catch {close $inp}
        set done 1 }
    elseif { $done } { gets
        $inp line } else { gets $inp line # Use a regular expression to
    correspond à la ligne avec le numéro de révision
        #.
        si {[regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] }
            {set done 1 } } } Créer une banque de
        registre dans un
    fichier

verilog avec le proc de valeur hex spécifiée
generate_verilog { hex_value } {set num_digits [longueur de chaîne

    $hex_) valeur]
    défini bit_width [expr { 4 * $num_digits } ]
    défini high_index [expr { $bit_width - 1 } ] réglé reset_value [répétition de
    la chaîne « 0 » $num_digits]

    si {[catch
        {set fh [open « version_reg.v » w ]
        met $fh « version_reg de module (horloge, réinitialisation, data_out) »
        ; met $fh «    horloge d’entrée »
        ; met $fh «    réinitialisation des entrées »
        ; met $fh «    sortie \[$high_index:0\] data_out ; »
        met $fh «    reg \[$high_index:0\] data_out ; »
        met $fh «    toujours @ (l’horloge posée ou la réinitialisation negedge) commence »
        met $fh « if        (!reset) »
        met $fh « data_out < =            ${bit_width}'h{reset_value}; »
        met $fh «        autre » met $fh « data_out < =            ${bit_width}'h{hex_value}; »
        met $fh «    fin » met $fh «
        endmodule » proche $fh } res ] } { erreur de
        retour de code $res }
    d’autre
        {return 1
    } } # Cette ligne

s’adapte à l’automatisation du script
foreach { révision du projet de flux } $quartus (args) { break }

réglé file_name ${project}.qpf set done 0 défini revision_number « » # Call procedure pour obtenir le numéro de révision du fichier et gérer les

erreurs si
{catch {{get_subversion_revision $file_name} } msg] } {
   post_message type critical_warning « Impossible d’exécuter la commande pour obtenir le numéro de révision. $msg » 
} d’autre 
   {si {1 == $done}  { post_message 
      -type critical_warning « Timeout getting revision number » 
   }elseif {[string equal « » $revision_number] } { 
      post_message -type critical_warning « Could’t find revision number in output of svn info $file_name » 
   } {#  Call procedure pour stocker le numéro 
       si {capture {{generate_verilog $revision_number} res] } { 
         post_message -type critical_warning \ « Impossible de générer un fichier Verilog. $res » } {post_message « Mise à jour réussie du numéro de 
         version vers\ version 0x${revision_number} » 
      } 
}

Si vous nommez le script update_version.tcl,vous devez ajouter la ligne suivante à votre QSF :

set_global_assignment nom PRE_FLOW_SCRIPT_FILE quartus_sh:update_version.tcl

Le contenu de cette page est une combinaison de traduction humaine et informatique du contenu original en anglais. Ce contenu vous est fourni pour votre commodité et à titre informatif seulement et ne saurait être totalement exact ou complet. En cas de contradiction entre la version anglaise de cette page et la traduction, c'est la version anglaise qui prévaut. Afficher la version anglaise de cette page.