Opérations Verilog File IO
Verilog a des tâches et des fonctions système qui peuvent ouvrir des fichiers, générer des valeurs dans des fichiers, lire des valeurs à partir de fichiers et charger dans d'autres variables et fermer des fichiers.
Ouvrir et fermer des fichiers
module tb;
// Declare a variable to store the file handler
integer fd;
initial begin
// Open a new file by the name "my_file.txt"
// with "write" permissions, and store the file
// handler pointer in variable "fd"
fd = $fopen("my_file.txt", "w");
// Close the file handle pointed to by "fd"
$fclose(fd);
end
endmodule
Ouvrir les modes de fichiers
Argument | Description |
---|---|
"r" ou "rb" | Ouvert à la lecture |
"w" ou "wb" | Créer un nouveau fichier pour l'écriture. Si le fichier existe, tronquez-le à zéro et écrasez-le |
"a" ou "ab" | Si le fichier existe, ajoutez-le (ouvert en écriture à EOF), sinon créez un nouveau fichier |
"r+", "r+b" ou "rb+" | Ouvert pour la lecture et l'écriture |
"w+", "w+b" ou "wb+" | Tronquer ou créer pour mise à jour |
"a+", "a+b" ou "ab+" | Ajouter ou créer un nouveau fichier pour mise à jour à EOF |
Comment écrire des fichiers
Fonction | Description |
---|---|
$fdisplay | Similaire à $display, écrit plutôt dans un fichier |
$fwrite | Similaire à $write, écrit plutôt dans un fichier |
$fstrobe | Similaire à $strobe, écrit plutôt dans un fichier |
$fmonitor | Similaire à $monitor, écrit plutôt dans un fichier |
Chacune des fonctions système ci-dessus imprime des valeurs en décimal de base. Ils ont également trois autres versions pour imprimer les valeurs en binaire, octal et hexadécimal.
Fonction | Description |
---|---|
$fdisplay() | Imprime en décimal par défaut |
$fdisplayb() | Imprime en binaire |
$fdisplayo() | Imprime en octal |
$fdisplayh() | Imprime en hexadécimal |
module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
// Create a new file
fd = $fopen("my_file.txt", "w");
my_var = 0;
$fdisplay(fd, "Value displayed with $fdisplay");
#10 my_var = 8'h1A;
$fdisplay(fd, my_var); // Displays in decimal
$fdisplayb(fd, my_var); // Displays in binary
$fdisplayo(fd, my_var); // Displays in octal
$fdisplayh(fd, my_var); // Displays in hex
// $fwrite does not print the newline char '
' automatically at
// the end of each line; So we can predict all the values printed
// below to appear on the same line
$fdisplay(fd, "Value displayed with $fwrite");
#10 my_var = 8'h2B;
$fwrite(fd, my_var);
$fwriteb(fd, my_var);
$fwriteo(fd, my_var);
$fwriteh(fd, my_var);
// Jump to new line with '
', and print with strobe which takes
// the final value of the variable after non-blocking assignments
// are done
$fdisplay(fd, "
Value displayed with $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, "Value displayed with $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 Value displayed with $fdisplay 26 00011010 032 1a Value displayed with $fwrite 43001010110532b Value displayed with $fstrobe 60 00111100 074 3c Value displayed with $fmonitor 60 0 1 2 3 4
Comment lire les fichiers
Lire une ligne
La fonction système $fgets
lit les caractères du fichier spécifié par [hl]fd[/hd] dans la variable str jusqu'à ce que str soit rempli, ou qu'un caractère de saut de ligne soit lu et transféré vers str, ou qu'une condition EOF soit rencontrée.
Si une erreur survient lors de la lecture, il renvoie le code zéro. sinon elle renvoie le nombre de caractères lus.
Détection EOF
La fonction système $feof
renvoie une valeur différente de zéro lorsque EOF est trouvé, et renvoie zéro sinon pour un descripteur de fichier donné comme argument.
module tb;
reg[8*45:1] str;
integer fd;
initial begin
fd = $fopen("my_file.txt", "r");
// Keep reading lines until EOF is found
while (! $feof(fd)) begin
// Get current line into the variable 'str'
$fgets(str, fd);
// Display contents of the variable
$display("%0s", str);
end
$fclose(fd);
end
endmodule
Plusieurs arguments pour fdisplay
Lorsque plusieurs variables sont données à $fdisplay
, il imprime 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
Formater les données en une chaîne
Premier argument dans le $sformat
fonction système est le nom de la variable dans laquelle le résultat est placé. Le deuxième argument est le format_string qui indique comment les arguments suivants doivent être formatés en une chaîne.
module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Format 'a' and 'b' into a string given
// by the format, and store into 'str' variable
$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