Maîtriser Xilinx Vivado : Analyseur de logique intégré (ILA) et Entrée/Sortie virtuelle (VIO) pour le débogage
Ce tutoriel vous guide dans l'utilisation des cœurs Integrated Logic Analyzer (ILA) et Virtual Input/Output (VIO) de Xilinx Vivado pour déboguer et surveiller des conceptions VHDL directement sur la puce. À la fin, vous saurez comment insérer des sondes, configurer des déclencheurs et capturer le comportement précis des signaux sans équipement externe.
Vue d'ensemble
Tout au long de l'article, nous ferons référence à des captures d'écran de Vivado. Cliquez sur chaque image pour l'agrandir. Utilisez la barre latérale ou la navigation contextuelle mobile pour un accès rapide.
ILA et VIO
L'IP ILA permet de sonder les signaux internes du FPGA en temps réel, tandis que l'IP VIO permet de piloter des signaux internes depuis Vivado. Les deux sont gratuits, hautement configurables et s'intègrent parfaitement au flux de travail Vivado.
- IP Xilinx : Integrated Logic Analyzer (ILA)
- IP Xilinx : Virtual Input/Output (VIO)
Prérequis
- Une carte d'évaluation FPGA Xilinx
- La suite Vivado Design Suite (version 2020.2 ou ultérieure)
- Connaissances de base en VHDL
Nous utiliserons le kit d'évaluation Kintex‑7 KC705 dans les exemples, mais les étapes s'appliquent à tout FPGA Xilinx moderne.
Télécharger le projet exemple
Téléchargez l'archive ZIP contenant la conception exemple et les fichiers VHDL. Ouvrez ila_tutorial.xpr dans Vivado pour explorer la conception, ou continuez la lecture pour la créer à partir de zéro.
Créer un projet avec Vivado
Lancez Vivado et cliquez sur Create Project sur l'écran d'accueil.
Suivez l'assistant : nommez le projet ila_tutorial (sans espaces), sélectionnez RTL Project, et ajoutez les sources counter.vhdl et counter_top.vhdl. Activez Copy sources into project et continuez.
Ajoutez le fichier de contraintes top.xdc en le copiant dans le projet. Adaptez les broches d'horloge et de LED à votre carte, et définissez la période d'horloge correcte.
Sélectionnez votre carte dans la liste et cliquez sur Finish pour ouvrir le projet.
Présentation de la conception exemple
L'exemple consiste en deux compteurs 4 bits chaînés. counter.vhdl implémente un compteur qui s'incrémente lorsqu'il est activé et affirme une sortie trigger 1 bit entre les valeurs 12 et 15.
Déclaration d'entité :
---------------------------------------------------------------------------- -- DÉCLARATION D'ENTITÉ. ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- Horloge principale reset : IN STD_LOGIC; -- Reset, actif haut enable : IN STD_LOGIC; -- Active le compteur suivant trigger : OUT STD_LOGIC -- Déclenche le compteur suivant ); END ENTITY;
Signaux internes :
count– la valeur du compteur 4 bits.trigger_o– signal intermédiaire connecté à la sortietrigger.
Utilisation d'attributs (expliquée plus loin) :
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
Logique séquentielle :
seq_proc: PROCESS (reset, clk) BEGIN -- for seq_proc IF (reset = '1') THEN count <= (OTHERS => '0'); trigger_o <= '0'; ELSIF rising_edge(clk) THEN IF (enable = '1') THEN count <= count + 1; IF (count > x"B" AND count <= x"F") THEN trigger_o <= '1'; ELSE trigger_o <= '0'; END IF; END IF; END IF; END PROCESS;
counter_top.vhdl instancie deux compteurs. counter_1_inst est toujours activé et horloge counter_2_inst via sa sortie trigger. Par conséquent, counter_2_inst s'incrémente seulement quatre fois par cycle de 16 coups d'horloge de counter_1_inst.
Créer un cœur VIO pour RESET
Nous allons générer un VIO qui pilote l'entrée reset de la conception, permettant une bascule manuelle depuis Vivado.
Ouvrez le Catalogue IP, recherchez VIO, double-cliquez sur VIO (Virtual Input/Output), et renommez-le en vio_reset. Réglez Input Probe Count à 0 et Output Probe Count à 1.
Configurez la sonde de sortie : largeur = 1, valeur initiale = 0x1, puis cliquez sur OK et Generate.
Après la synthèse, déclarez un composant dans counter_top.vhdl et instanciez-le. N'oubliez pas de régler flatten_hierarchy sur None avant de relancer la synthèse.
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
Insérer des sondes de débogage
Les signaux peuvent être sondés via trois méthodes :
- Depuis le source VHDL (via les attributs
MARK_DEBUG). - Depuis le netlist ou le schéma (clic droit Mark Debug).
- Depuis un fichier XDC/TCL (non couvert ici).
Insertion depuis le fichier VHDL
Déclarez l'attribut MARK_DEBUG une fois par fichier, puis appliquez-le aux signaux souhaités :
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
Dans la conception synthétisée, count apparaîtra sous Unassigned Debug Nets avec une icône de bug.
Insertion depuis le netlist
Naviguez vers Netlist ou Schematic, localisez le net trigger, clic droit, et choisissez Mark Debug pour les deux compteurs.
Créer le cœur de débogage ILA
Ouvrez Set Up Debug depuis le Catalogue IP. Vivado listera tous les nets de débogage et leurs domaines d'horloge. Conservez les quatre signaux pour ce tutoriel.
Configurez la profondeur FIFO de l'ILA (1024 suffit) et activez Capture control. Terminez l'assistant ; Vivado génère un cœur ILA et un fichier de contraintes.
Sauvegardez les contraintes sous ila_core.xdc. Ce fichier applique les attributs de débogage, crée le cœur ILA, configure chaque sonde, et instancie un dbg_hub qui relie le cœur à Vivado. Mettez à jour la fréquence d'horloge du hub pour qu'elle corresponde à votre conception.
Relancez la synthèse, puis l'implémentation, et générez le bitstream. Ouvrez le Hardware Manager, connectez-vous automatiquement, et programmez le dispositif ainsi que le fichier de sondes .ltx.
Configurer les déclencheurs ILA
Après la programmation, le tableau de bord ILA apparaît. Activez l'onglet VIO et supprimez les fenêtres inutiles. Ajoutez la sonde reset au VIO pour pouvoir la basculer pendant la capture.
Configurez un déclencheur sur counter_1_inst/trigger avec une condition de front montant et une fenêtre de pré-déclenchement de 32 échantillons.
Exécuter l'ILA avec un déclencheur
Armez le déclencheur (le statut passe à waiting for trigger) et mettez reset à 0. Une fois le déclencheur activé, l'ILA enregistre 32 échantillons avant l'événement et continue jusqu'à ce que le FIFO soit plein.
En dézoomant, on observe également le comportement de counter_2_inst.
Exécuter l'ILA avec plusieurs déclencheurs
Pour les scénarios complexes, chaînez plusieurs déclencheurs. Par exemple, déclenchez lorsque counter_1_inst/count == 9 et counter_2_inst/count > 2, en divisant le FIFO en quatre fenêtres.
Mode de ré-déclenchement automatique
Activez Auto re‑trigger pour capturer des événements sporadiques ou à haute fréquence. Configurez un seul déclencheur, définissez la profondeur FIFO, et armez le cœur.
Mode de capture
Le mode capture n'enregistre que les échantillons satisfaisant une condition globale. Par exemple, capturer lorsque counter_1_inst/trigger == 1 ET counter_2_inst/trigger == 0 simultanément.
Conclusion
L'ILA et le VIO sont des outils puissants et gratuits pour le débogage sur puce. En exploitant les sondes, les déclencheurs multiples et les modes de capture, vous pouvez surveiller et contrôler précisément des conceptions FPGA complexes directement depuis Vivado.
VHDL
- Maîtriser VHDL et Verilog : écrire une logique combinatoire et séquentielle propre
- Élargir les horizons cloud : nouvelles zones, conteneurs, et stratégies multicloud
- Fondamentaux C# : Entrées et sorties essentielles
- Maîtriser l'entrée/sortie en C++ : Guide pratique
- Maîtriser l'entrée/sortie en C : scanf() et printf() expliqués
- Maîtriser les E/S et l'importation de modules en Python : Guide pratique
- Maîtriser l'entrée/sortie Java : Afficher, lire et formater vos données
- Maîtriser les verrous D : Conception, Fonctionnement et Différences Clés
- Maîtriser les entrées/sorties en C : Fonctions standards et fichiers