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 :
- Générer un horodatage
- Lisez un numérode révision du logiciel de contrôle de version . Cet exemple utilise SVN.
- Incrément d’un numéro stocké dans un fichier HDL
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 :
- Obtenir un numéro : lire un numéro de révision du logiciel de contrôle de version
- Stockez le numéro : fichier Verilog avec une banque de registres
# 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