Maîtriser les Tâches d'Affichage Verilog : Débogage et Journalisation Efficaces
Les tâches système d'affichage sont principalement utilisées pour afficher des messages d'information et de débogage pour suivre le flux de simulation depuis les fichiers log et aident aussi à déboguer plus rapidement. Il y a différents groupes de tâches d'affichage et formats dans lesquels elles peuvent afficher les valeurs.
Tâches Display/Write
Syntaxe
À la fois $display et $write affichent les arguments dans l'ordre où ils apparaissent dans la liste d'arguments.
$display(<liste_d_arguments>);
$write(<liste_d_arguments>);
$write n'ajoute pas le caractère de nouvelle ligne \n à la fin de sa chaîne, tandis que $display le fait et cela peut être vu dans l'exemple ci-dessous.
Exemple
module tb;
initial begin
$display ("Ceci se termine par une nouvelle ligne ");
$write ("Ceci ne se termine pas,");
$write ("comme ça. Pour nouvelle ligne, utilisez le char newline ");
$display ("Ceci commence toujours sur une nouvelle ligne !");
end
endmodule
Journal de Simulation
ncsim> run Ceci se termine par une nouvelle ligne Ceci ne se termine pas,comme ça. Pour nouvelle ligne, utilisez le char newline Ceci commence toujours sur une nouvelle ligne ! ncsim: *W,RNQUIE: Simulation is complete.
Strobes Verilog
$strobe affiche les valeurs finales des variables à la fin du pas de temps delta courant et a un format similaire à $display.
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10; // Attendre que la simulation atteigne 10ns
b <= a + 1; // Assigner la valeur a+1 à b
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
end
endmodule
Notez que $strobe montre la valeur finale mise à jour de la variable b au temps 10ns qui est 0x2E, et $display la reprend seulement au prochain delta de simulation à 11ns.
Journal de Simulation
ncsim> run [$display] time=10 a=0x2d b=0x2d [$strobe] time=10 a=0x2d b=0x2e [$display] time=11 a=0x2d b=0x2e [$strobe] time=11 a=0x2d b=0x2e ncsim: *W,RNQUIE: Simulation is complete.
Moniteurs Continus Verilog
$monitor aide à afficher automatiquement les valeurs de variable ou d'expression chaque fois que la variable ou l'expression dans sa liste d'arguments change. Il obtient un effet similaire à appeler $display après chaque fois que l'un de ses arguments est mis à jour.
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10; // Attendre que la simulation atteigne 10ns
b <= a + 1; // Assigner la valeur a+1 à b
$monitor ("[$monitor] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1 b <= 8'hA4;
#5 b <= a - 8'h33;
#10 b <= 8'h1;
end
endmodule
Notez que $monitor est comme une tâche qui est lancée pour s'exécuter en arrière-plan du thread principal qui surveille et affiche les changements de valeur de ses variables d'arguments. Une nouvelle tâche $monitor peut être émise n'importe quel nombre de fois pendant la simulation.
Journal de Simulation
ncsim> run [$monitor] time=10 a=0x2d b=0x2e [$monitor] time=11 a=0x2d b=0xa4 [$monitor] time=16 a=0x2d b=0xfa [$monitor] time=26 a=0x2d b=0x1 ncsim: *W,RNQUIE: Simulation is complete.
Spécificateurs de Format Verilog
Pour afficher des variables dans les fonctions d'affichage, des spécificateurs de format appropriés doivent être donnés pour chaque variable.
| Argument | Description |
|---|---|
| %h, %H | Afficher en format hexadécimal |
| %d, %D | Afficher en format décimal |
| %b, %B | Afficher en format binaire |
| %m, %M | Afficher le nom hiérarchique |
| %s, %S | Afficher comme une chaîne |
| %t, %T | Afficher en format temps |
| %f, %F | Afficher 'real' en format décimal |
| %e, %E | Afficher 'real' en format exponentiel |
module tb;
initial begin
reg [7:0] a;
reg [39:0] str = "Hello";
time cur_time;
real float_pt;
a = 8'h0E;
float_pt = 3.142;
$display ("a = %h", a);
$display ("a = %d", a);
$display ("a = %b", a);
$display ("str = %s", str);
#200 cur_time = $time;
$display ("time = %t", cur_time);
$display ("float_pt = %f", float_pt);
$display ("float_pt = %e", float_pt);
end
endmodule
Journal de Simulation
ncsim> run a = 0e a = 14 a = 00001110 str = Hello time = 200 float_pt = 3.142000 float_pt = 3.142000e+00 ncsim: *W,RNQUIE: Simulation is complete.
Séquences d'Échappement Verilog
Certains caractères sont considérés comme spéciaux car ils représentent d'autres buts d'affichage comme nouvelle ligne, tabulations et sauts de page. Pour afficher ces caractères spéciaux, chaque occurrence de tels caractères doit être échappée.
| Argument | Description |
|---|---|
| \n | Caractère nouvelle ligne |
| \t | Caractère tabulation |
| \\ | Le caractère \ |
| \" | Le caractère " |
| %% | Le caractère % |
module tb;
initial begin
$write ("Caractère nouvelle ligne \n");
$display ("Caractère tabulation \t stop");
$display ("Échappement \" %%");
/* // Erreurs de compilation
$display ("Sans échappement \n"); // ERREUR : Chaîne non terminée
$display ("Sans échappement \""); // ERREUR : Chaîne non terminée
*/
end
endmodule
Journal de Simulation
ncsim> run Caractère nouvelle ligne Caractère tabulation stop Échappement " % ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Verilog `ifdef : Compilation Conditionnelle Expliquée
- Maîtriser la Portée de Référence Hiérarchique Verilog : Éviter les Collisions de Noms dans les Modules et Blocs
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation