Maîtriser les entrées/sorties de fichiers en Verilog : Ouvrir, Lire, Écrire et Fermer
Verilog propose des tâches et fonctions système permettant d'ouvrir des fichiers, d'y écrire des valeurs, de lire des valeurs depuis des fichiers pour les charger dans des variables, et de fermer les fichiers.
Ouverture et fermeture de fichiers
module tb;
// Déclaration d'une variable pour stocker le gestionnaire de fichier
integer fd;
initial begin
// Ouvre un nouveau fichier nommé "my_file.txt"
// avec des permissions d'écriture, et stocke le pointeur
// du gestionnaire de fichier dans la variable "fd"
fd = $fopen("my_file.txt", "w");
// Ferme le gestionnaire de fichier pointé par "fd"
$fclose(fd);
end
endmodule
Modes d'ouverture de fichiers
| Argument | Description |
|---|---|
| "r" ou "rb" | Ouvre en lecture |
| "w" ou "wb" | Crée un nouveau fichier pour l'écriture. Si le fichier existe, le tronque à zéro et l'écrase |
| "a" ou "ab" | Si le fichier existe, ajoute (ouvre en écriture à la fin), sinon crée un nouveau fichier |
| "r+", "r+b" ou "rb+" | Ouvre pour la lecture et l'écriture |
| "w+", "w+b" ou "wb+" | Tronque ou crée pour mise à jour |
| "a+", "a+b" ou "ab+" | Ajoute, ou crée un nouveau fichier pour mise à jour à la fin |
Comment écrire dans des fichiers
| Fonction | Description |
|---|---|
| $fdisplay | Similaire à $display, mais écrit dans un fichier |
| $fwrite | Similaire à $write, mais écrit dans un fichier |
| $fstrobe | Similaire à $strobe, mais écrit dans un fichier |
| $fmonitor | Similaire à $monitor, mais écrit dans un fichier |
Chacune de ces fonctions système affiche les valeurs en radix décimal par défaut. Elles possèdent également trois variantes pour afficher en binaire, octal et hexadécimal.
| Fonction | Description |
|---|---|
| $fdisplay() | Affiche en décimal par défaut |
| $fdisplayb() | Affiche en binaire |
| $fdisplayo() | Affiche en octal |
| $fdisplayh() | Affiche en hexadécimal |
module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
// Crée un nouveau fichier
fd = $fopen("my_file.txt", "w");
my_var = 0;
$fdisplay(fd, "Valeur affichée avec $fdisplay");
#10 my_var = 8'h1A;
$fdisplay(fd, my_var); // Affiche en décimal
$fdisplayb(fd, my_var); // Affiche en binaire
$fdisplayo(fd, my_var); // Affiche en octal
$fdisplayh(fd, my_var); // Affiche en hexadécimal
// $fwrite n'ajoute pas automatiquement le caractère de nouvelle ligne '\n'
// à la fin de chaque ligne ; toutes les valeurs ci-dessous apparaîtront
// donc sur la même ligne
$fdisplay(fd, "Valeur affichée avec $fwrite");
#10 my_var = 8'h2B;
$fwrite(fd, my_var);
$fwriteb(fd, my_var);
$fwriteo(fd, my_var);
$fwriteh(fd, my_var);
// Passe à la ligne avec '\n', et affiche avec strobe qui prend
// la valeur finale de la variable après les affectations non bloquantes
$fdisplay(fd, " Valeur affichée avec $fstrobe");
#10 my_var <= 8'h3C;
$fstrobe(fd, my_var);
$fstrobeb(fd, my_var);
$fstrobeo(fd, my_var);
$fstrobeh(fd, my_var);
#10 $fdisplay(fd, "Valeur affichée avec $fmonitor");
$fmonitor(fd, my_var);
for(i = 0; i < 5; i = i+1) begin
#5 my_var <= i;
end
#10 $fclose(fd);
end
endmodule
Journal de simulation
Valeur affichée avec $fdisplay 26 00011010 032 1a Valeur affichée avec $fwrite 43001010110532b Valeur affichée avec $fstrobe 60 00111100 074 3c Valeur affichée avec $fmonitor 60 0 1 2 3 4
Comment lire des fichiers
Lecture d'une ligne
La fonction système $fgets lit les caractères depuis le fichier spécifié par fd dans la variable str jusqu'à ce que str soit remplie, qu'un caractère de nouvelle ligne soit lu et transféré dans str, ou qu'une condition EOF soit rencontrée.
Si une erreur survient pendant la lecture, elle retourne le code zéro ; sinon, elle retourne le nombre de caractères lus.
Détection de la fin de fichier (EOF)
La fonction système $feof retourne une valeur non nulle lorsque EOF est trouvé, et zéro sinon, pour un descripteur de fichier donné en argument.
module tb;
reg[8*45:1] str;
integer fd;
initial begin
fd = $fopen("my_file.txt", "r");
// Continue à lire les lignes jusqu'à ce que EOF soit trouvé
while (! $feof(fd)) begin
// Récupère la ligne courante dans la variable 'str'
$fgets(str, fd);
// Affiche le contenu de la variable
$display("%0s", str);
end
$fclose(fd);
end
endmodule
Arguments multiples pour $fdisplay
Lorsque plusieurs variables sont données à $fdisplay, il affiche simplement toutes les variables dans l'ordre donné, les unes après les autres, sans espace.
module tb;
reg [3:0] a, b, c, d;
reg [8*30:0] str;
integer fd;
initial begin
a = 4'ha;
b = 4'hb;
c = 4'hc;
d = 4'hd;
fd = $fopen("my_file.txt", "w");
$fdisplay(fd, a, b, c, d);
$fclose(fd);
end
endmodule
Journal de simulation
10111213
Formatage de données dans une chaîne
Le premier argument de la fonction système $sformat est le nom de la variable dans laquelle le résultat est placé. Le second argument est la chaîne de format qui indique comment les arguments suivants doivent être formatés dans une chaîne.
module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Formate 'a' et 'b' dans une chaîne selon le format donné,
// et stocke le résultat dans la variable 'str'
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule
Journal de simulation
xcelium> run a=10 b=0xb xmsim: *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
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage