Améliorer la vérification matérielle avec un testbench interactif basé sur Tcl
Un testbench interactif est une configuration de simulateur où l'entrée vers le device under test (DUT) est fournie par un opérateur pendant que le testbench s'exécute. Le plus souvent, cela signifie que vous entrez des commandes dans la console du simulateur pour fournir des stimuli au DUT.
Bien que vous deviez toujours créer un testbench auto-vérifiant, un testbench interactif peut être un bon complément. Il est plus facile d'effectuer des tests ad-hoc avec un testbench interactif sous la main, que de modifier le code du testbench auto-vérifiant.
Souvent, vous découvrirez des problèmes en laboratoire que vous voudrez essayer dans le testbench. Avec un testbench interactif, cela peut être aussi simple que de taper la séquence d'entrée observée pour reproduire le comportement indésirable dans le simulateur.
Interaction Tcl avec VHDL
La plupart des simulateurs VHDL utilisent Tcl comme langage de console. Les simulateurs ont un ensemble de commandes spécifiques au fournisseur, mais la bonne nouvelle est qu'elles peuvent être traitées comme n'importe quelle autre commande Tcl. Vous pouvez utiliser Tcl pour créer des scripts complexes, principalement portables, pour gérer et supporter vos testbenches VHDL.
Modification des signaux VHDL depuis Tcl
Pour interagir avec VHDL, nous devons trouver la commande pour changer une valeur de signal. Dans ModelSim, c'est la commande "force". Comme spécifié dans le document de référence des commandes, le synopsis de la commande est :
force {<object_name> <value> [[@]<time_info>][, <value> [@]<time_info>]... [-deposit | -drive | -freeze] [-cancel [@]<time_info>] [-repeat [@]<time_info>]
Le commutateur que vous voulez utiliser est le drapeau "-deposit". Cela change la valeur du signal VHDL instantanément, mais permet à un autre pilote VHDL ou Tcl de le changer à une autre valeur plus tard.
En ignorant les options que nous n'utilisons pas, le synopsis simplifié ressemble à ceci :
force -deposit <signal_name> <value>
Le déclencheur VHDL
Maintenant que nous savons comment contrôler les signaux VHDL depuis Tcl, nous devons créer un processus récepteur dans notre testbench VHDL. Le code ci-dessous montre un exemple minimal d'un tel testbench.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity interactive is
end interactive;
architecture sim of interactive is
-- Contrôlé par Tcl
signal trigger : std_logic := '0';
begin
process is
begin
wait until trigger = '1';
report "Triggered!";
end process;
end architecture;
Le processus se réveillera quand le signal trigger passera de quelque chose à '1'. Il affichera "Triggered!" dans la console quand cela se produit, nous permettant de tester le concept de contrôle de processus VHDL depuis Tcl.
Je viens de faire cela dans la console ModelSim. Les commandes émises, ainsi que la sortie, peuvent être vues dans la transcription ci-dessous.
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
J'ai exécuté le testbench pendant 10 nanosecondes après le démarrage de la simulation.
Ensuite, j'ai forcé le signal trigger à '1'. Sur la ligne suivante, j'attends 0 nanosecondes. Le but de cela est de créer un cycle delta. Je veux que le processus soit déclenché, mais je ne veux pas que du temps de simulation passe.
Finalement, je force le signal trigger de retour à '0' avant de continuer le testbench.
Nous pouvons voir que le processus VHDL s'est réveillé après la ligne "run 0 ns", et a affiché "Triggered!" dans la console.
Lecture des valeurs de signaux VHDL en Tcl
Pour lire les valeurs de signaux dans ModelSim, vous pouvez utiliser la commande "examine". Nous pouvons par exemple lire la valeur du signal trigger en utilisant cette commande dans la console ModelSim :
VSIM 6> examine /trigger # 0
Vous voudriez assigner la valeur à une variable Tcl quand vous utilisez "examine" dans un script. Essayons cela dans la console ModelSim :
VSIM 7> set triggerVal [examine /trigger] # 0
Ensuite, nous pouvons par exemple afficher la variable en utilisant la commande Tcl "puts" :
VSIM 8> puts "triggerVal: $triggerVal" # triggerVal: 0
Arrêt du simulateur après chaque test
La façon la plus simple d'exécuter le test assez longtemps pour que le DUT réagisse, est de simplement exécuter le simulateur pour une valeur de temps fixe. Par exemple, si le DUT doit réagir après deux cycles d'horloge, et que la période d'horloge est de 10 nanosecondes, nous utiliserions la commande "run 20 ns" dans notre script Tcl.
Si le DUT n'a pas un temps de réaction fixe, une assertion VHDL peut être utilisée pour arrêter la simulation et passer le contrôle à une fonction de rappel Tcl. Dans ModelSim, cela signifierait définir un point d'arrêt depuis votre script Tcl en utilisant la commande "when" :
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
Vous devriez aussi définir une fonction de rappel "onBreak" en Tcl qui sera exécutée quand le point d'arrêt est atteint. La fonction "onBreak" est spécifiée dans la référence des commandes ModelSim.
Les inconvénients des tests pilotés par Tcl
Il y a des inconvénients à utiliser des testbench qui reposent fortement sur des scripts Tcl. Les plus apparents sont les problèmes de vitesse et de portabilité.
Les testbench pilotés par Tcl fonctionnent en démarrant et arrêtant le simulateur plusieurs fois pour interagir avec le code VHDL. Démarrer et arrêter la simulation pour exécuter une fonction Tcl entre les deux, prend plus de temps que d'exécuter un testbench VHDL en continu. Bien que Tcl soit un langage interprété, le VHDL est compilé dans le simulateur et s'exécute beaucoup plus vite que Tcl.
Bien que Tcl soit portable vers d'autres simulateurs, les commandes spécifiques au simulateur que vous devrez utiliser, ne le sont pas. Même si vous trouvez les commandes équivalentes dans l'autre simulateur, elles peuvent fonctionner différemment. Les fournisseurs de simulateurs créent leur propre ensemble de règles pour les commandes qu'ils supportent. Par conséquent, un testbench piloté par Tcl devrait être considéré comme moins portable qu'un testbench VHDL pur.
Nouveau cours VHDL et FPGA
* Je crée un nouveau cours VHDL et FPGA qui plongera dans les testbench de manière extensive. Vous apprendrez comment créer un design FPGA à partir de zéro. Après avoir terminé le cours, vous saurez comment créer des testbench auto-vérifiants, et comment réutiliser le code pour créer un testbench interactif.
* Mis à jour le 12 octobre 2020 : J'ai terminé le cours. Cliquez sur l'image ci-dessous pour en savoir plus.
Le produit que nous allons créer est un module contrôleur de matrice de points LED. Nous utiliserons la carte de développement Lattice iCEstick à 49 $. À la fin, nous implémenterons le design sur une breadboard. Vous pourrez taper sur le clavier de votre ordinateur, et les caractères apparaîtront sur l'écran LED à matrice de points contrôlé par le FPGA.
En savoir plus sur le cours VHDL et FPGA Matrice de Points ici !
Ouverture :
À décider.
VHDL
- Introduction à VHDL : construire votre première porte ET
- Guide complet des conversions de types VHDL avec Numeric_Std et Std_Logic_Arith
- Exemple de procédure VHDL : incrémenter un std_logic_vector
- Exploiter les records VHDL pour des interfaces FIFO propres et réutilisables
- Maîtriser les directives using C# : Imports, alias et directives static
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
- Comment construire un testbench auto-vérifiant en VHDL - Guide pratique
- Construction d'un projecteur laser interactif avec capteurs Zigbee et plateforme Gravio Edge
- Transformer une Fraiseuse en Tour : Étapes Simples pour Métallurgistes