Mots-clés : $display, $write, $strobe, $monitor

En Verilog, les 4 tâches système suivantes sont principalement utilisées pour afficher (imprimer) des informations de débogage : $display, $write, $strobe, $monitor.

$display

$display s'utilise de manière très similaire à la fonction printf en C. Il peut imprimer directement des chaînes de caractères, et peut également spécifier le format des variables dans la chaîne pour imprimer les variables concernées. Par exemple :

$display("This is a test.");   //直接打印字符串
$display("This is a test number: %b.", num); //打印变量 num 为二进制格式

Si le format d'affichage de la variable n'est pas spécifié, la valeur de la variable sera affichée en fonction de sa position dans la chaîne, ce qui équivaut à participer à une concaténation de chaînes. Par exemple :

$display("This is a test number: ", num, "!!!");

Si aucun format n'est spécifié, $display affiche par défaut en décimal. $displayb, $displayo et $displayh affichent respectivement aux formats binaire, octal et hexadécimal. De même, il existe également $writeb, $writeo, $writeh, $strobeb, etc.

Le tableau suivant présente les spécifications de format courantes.

%h ou %HSortie au format hexadécimal%c ou %CSortie au format code ASCII
%d ou %DSortie au format décimal%e ou %ESortie au format exponentiel
%o ou %OSortie au format octal%f ou %FSortie au format à virgule flottante (type réel)
%b ou %BSortie au format binaire%t ou %TSortie au format de l'heure actuelle
%s ou %SSortie au format chaîne de caractères%m ou %MSortie du chemin d'accès hiérarchique actuel

Les caractères d'échappement peuvent également être utilisés pour afficher des caractères spéciaux, par exemple :

\nCaractère de saut de ligne%%Signe de pourcentage "%"
\tCaractère de tabulation (touche Tab)\0Caractère représenté en octal
\\Caractère barre oblique inverse "\"\0xCaractère représenté en hexadécimal
\"Guillemet double  

$write

$write s'utilise exactement de la même manière que $display, sauf que le premier n'ajoute pas automatiquement de saut de ligne après l'affichage des informations à chaque fois, alors que le second le fait. Lorsqu'aucun saut de ligne n'est nécessaire après la sortie, la tâche d'affichage $write peut être utilisée.

$write("This is a test");
$write("number: %b", num);
$write("!!!\n");

$strobe

$strobe est une tâche d'affichage stroboscopique. $strobe s'utilise de la même manière que $display, mais le moment d'impression des informations diffère de celui de $display.

Lorsque de nombreuses instructions sont exécutées en même temps que la tâche $display, l'ordre d'exécution de ces instructions et de $display est incertain, et suit généralement la structure séquentielle du programme.

$strobe, en revanche, n'exécute la tâche d'affichage qu'après que les autres instructions ont achevé leur exécution. Par exemple :

Exemple

   reg [3:0]  a ;
   initial begin
      a = 1 ;
      #1 ;
      a <= a + 1 ;
      //premier affichage
      $display("$display résultat d'exécution : %d.", a);
      $strobe("$strobe résultat d'exécution : %d.", a);
      #1 ;
      $display();
      //deuxième affichage
      $display("$display résultat d'exécution : %d.", a);
      $strobe("$strobe résultat d'exécution : %d.", a);
   end

Le résultat de l'exécution est affiché ci-dessous.

Lorsque la première tâche d'affichage est exécutée, l'affectation non bloquante et $display s'exécutent en même temps. $display montre la valeur de la variable avant l'affectation, tandis que $strobe montre la valeur de la variable après l'affectation. Cela reflète précisément la caractéristique d'affichage strobe de $strobe.

Regardons un autre exemple :

Exemple

   entier  i ;
   initial begin
      for (i=0; i<4; i=i+1) begin
         $display("Nombre d'exécutions de $display : %d.", i);
         $strobe("Nombre d'exécutions de $strobe : %d.", i);
      end
   end
Le résultat de l'exécution est le suivant :

$display effectue l'opération d'affichage 4 fois selon la structure du programme. Comme cette instruction de boucle s'exécute au temps 0, la valeur de variable affichée par $strobe est le résultat de la variable à la fin de la boucle, c'est-à-dire que $strobe n'est exécuté qu'après la sortie de la boucle avec i=4. Cela reflète la caractéristique d'affichage temporel de la tâche d'affichage $strobe.

$monitor

$monitor est une tâche de surveillance utilisée pour surveiller en continu les variables. Tant qu'une variable change, $monitor imprime et affiche les informations correspondantes.

Par exemple :

Exemple

   reg [3:0]    cnt ;
   initial begin
      cnt = 3 ;
      forever begin
         # 5 ;
         if (cnt<7) cnt = cnt + 1 ;
      end
   end

   initial begin
      $monitor("Le compteur passe à la valeur %d au temps %t.", cnt, $time);
   end

Téléchargement du code source de ce chapitre

Téléchargement