Contrôle de simulation : $finish, $stop

Tâche systèmeFormat d'appelDescription de la tâche
Quitter la simulation$finish( type ) ;Termine la simulation. Le paramètre type sélectionne s'il faut imprimer des informations en quittant la simulation.
type=0 : Quitter directement sans imprimer
type=1 : Imprimer le temps de simulation et les informations de ligne de l'emplacement de l'instruction
type=2 : Affiche le temps de simulation, l'emplacement, la mémoire et l'utilisation du temps CPU
Mettre la simulation en pause$stop( type ) ;Met la simulation en pause. Le format d'utilisation est le même que celui de $finish.

Tant $finish que $stop ont pour fonction d'arrêter la simulation, mais ils restent différents.

$finish termine la simulation en cours. $stop met la simulation en cours en pause. Après la mise en pause de la simulation, elle peut être poursuivie via l'outil de simulation Verilog ou la ligne de commande, mais après la fin de la simulation, elle ne peut en aucun cas être poursuivie. $stop est similaire à la fonction de débogage par points d'arrêt du langage C.

La simulation suivante illustre les informations imprimées correspondant au paramètre type.

Exemple

   initial begin
      forever begin
         #100;
         if ($time >= 10000)  $finish(0) ;
         //if ($time >= 10000) $finish(1) ;
         //if ($time >= 10000) $finish(2) ;
      end
   end

$finish(0), aucune information n'est imprimée lorsque la simulation se termine.

$finish(1), lorsque la simulation se termine, il imprime le temps de simulation et les informations de ligne où se trouve $finish, comme indiqué ci-dessous.

La précision temporelle du module test est ns, mais la précision temporelle du simulateur est ps, donc les informations de temps imprimées diffèrent d'un facteur 1000.

$finish(2), lorsque la simulation se termine, il n'affiche pas seulement le temps de simulation et les informations de ligne, mais affiche aussi le temps d'utilisation du PC et l'utilisation de la mémoire, comme montré ci-dessous.

Format temporel : $printtimescale, $timeformat

Tâche systèmeFormat d'appel et description 
Afficher le temps
Unité et précision
$printtimescale( hierarchy ) ; 
 Cette tâche système affiche les informations d'échelle de temps dans le format suivant :
Échelle de temps de ( hierarchy ) est 1 ( unité ) / 1 ( précision )
hierarchy est le niveau d'accès du module, peut être omis. Dans ce cas, il affiche les informations d'échelle de temps du module courant.
 
Définir le temps
Unité et précision
$timeformat(unit_num, precision_num, suffix_string, min_field_width) 
 unit_num, définit l'unité de temps, sa valeur par défaut est `timescale
precision_num, définit le nombre de chiffres décimaux significatifs dans l'unité de temps, sa valeur par défaut est 0
suffix_string, définit les informations de suffixe temporel, telles que "ns", vide par défaut
min_field_width, définit le nombre de caractères numériques occupés par les informations de temps, 20 par défaut
 

Lorsque les tâches d'affichage (telles que $display, $monitor, etc.) et les tâches d'écriture de fichier (telles que $display, etc.) utilisent le format "%t" pour la sortie des données, $timeformat peut spécifier le format de sortie des informations d'unité de temps.

Dans $timeformat, unit_num utilise un nombre signé pour spécifier l'unité de temps. La relation correspondante est présentée dans le tableau suivant :

unit_numUnité de tempsunit_numUnité de temps
01 s-810 ns
-1100 ms-91 ns
-210 ms-10100 ps
-31 ms-1110 ps
-4100 us-121 ps
-510 us-13100 fs
-61 us-1410 fs
-7100 ns-151 fs

Utilisez le code suivant pour effectuer une simulation simple des 2 tâches système de l'échelle de temps.

Exemple

   //changer timescale
   initial begin
      # 10 ;
      //précision en ps, 5 chiffres significatifs dans la partie décimale, suffixe d'unité affiché comme "my-ps", occupant 15 positions de caractères
      $timeformat(-12, 5, " my-ps", 15) ;
   end
   initial begin
      # 5 ;
      $printtimescale() ;
      $display("Temps avant la reconfiguration : %t", $time);
      # 10 ;
      $printtimescale() ;
      $display("Temps après la reconfiguration : %t", $time);
   end

Le journal de simulation est affiché ci-dessous.

D'après la figure, il est possible de comparer le format d'affichage du temps avant et après le réglage de $timeformat.

De plus, au cours de ce processus, l'échelle de temps reste inchangée ; $timeformat ne modifie que le format d'affichage du temps.

Temps de simulation : $time, $stime, $realtime

Appel de tâche systèmeDescription
$timeRenvoie une valeur de temps entière de 64 bits
$stimeRenvoie une valeur temporelle entière sur 32 bits
$realtimeRenvoie une valeur temporelle réelle, qui peut être un nombre à virgule flottante

Le code de simulation est le suivant :

Exemple

   initial begin
      #10;
      $display("$time sortie1: %t", $time);
      $display("$stime sortie1: %t", $stime);
      $display("$realtime sortie1: %t", $realtime);
      #3.2;
      $display("$time sortie2: %t", $time);
      $display("$stime sortie2: %t", $stime);
      $display("$realtime sortie2: %t", $realtime);
      #5.6;
      $display("$time sortie2: %t", $time);
      $display("$stime sortie2: %t", $stime);
      $display("$realtime sortie2: %t", $realtime);
   end

Le journal de simulation est affiché ci-dessous.

Comme le temps de simulation est court, il n'y a pas de différence entre $time et $stime.

Cependant, $realtime lit précisément le temps de simulation selon la précision temporelle actuelle, tandis que $time et $stime arrondissent le temps actuel selon la précision temporelle.

Passage d'arguments en ligne de commande : $test$plusargs, $value$plusargs

Verilog fournit également les tâches interactives $test$plusargs et $value$plusargs. Pendant la simulation, des paramètres peuvent être passés via des arguments de ligne de commande, ce qui offre une grande commodité pour le débogage de simulation.

Tâche systèmeFormat d’appelDescription de la tâche
Passage d'arguments de type chaîne$test$plusargs( str ) ;Pendant la simulation, si la donnée de chaîne passée via la ligne de commande correspond à str, la valeur de retour est 1, sinon elle est 0.
Passage d'arguments numériques$value$plusargs( str, var ) ;Pendant la simulation, si la donnée de chaîne passée via la ligne de commande correspond à str, la valeur de retour est 1, sinon elle est 0.
Le type de la variable var passée au module doit être spécifié à l'intérieur de str. Reportez-vous à la tâche d'affichage $display pour le format.

Lors de l'utilisation de $test$plusargs( str ), ajoutez simplement "+str " à la ligne de commande de simulation.

Lors de l'utilisation de $value$plusargs( str, var ), le type de la valeur lors du passage du paramètre doit être spécifié à l'intérieur de str. Lors du passage de paramètres sur la ligne de commande, la valeur n'a pas besoin de spécification de base ; conservez simplement la valeur dans la base correspondante. Le format des paramètres de ligne de commande doit suivre le format déclaré par str dans $value$plusargs.

La simulation suivante illustre cela :

Exemple

   initial begin
      if ($test$plusargs("DISPLAY_CTRL")) begin
          $display("Afficher les informations de simulation!!!");
      end
   end
   reg  [1:0]   display_sel ;
   initial begin
      if ($value$plusargs("INFO_SEL=%b", display_sel)) begin
          $display("Le transfert de paramètre réussit!!!");
      end
      else begin
         display_sel = 2'b0 ;
      end
   end
   initial begin
      #1 ;
      if (display_sel == 2'b01)
          $display("Vous avez sélectionné Exemple!!!");
      else if (display_sel == 2'b10)
          $display("Vous avez sélectionné Verilog!!!");
      else if (display_sel == 2'b11)
          $display("Vous m'avez sélectionné!!!");
      else
          $display("Que voulez-vous vraiment???");
   end

Ajouter à la ligne de commande de simulation: +DISPLAY_CTRL +INFO_SEL=01

Le journal de simulation est le suivant. On peut en déduire que le paramètre de chaîne et le paramètre binaire sont tous deux transmis correctement.

Téléchargement du code source pour ce chapitre

Téléchargement