Verilog-Datei-IO-Operationen
Verilog hat Systemaufgaben und Funktionen, die Dateien öffnen, Werte in Dateien ausgeben, Werte aus Dateien lesen und in andere Variablen laden und Dateien schließen können.
Öffnen und Schließen von Dateien
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
Öffnen von Dateimodi
Argument | Beschreibung |
---|---|
"r" oder "rb" | Zum Lesen geöffnet |
"w" oder "wb" | Erstellen Sie eine neue Datei zum Schreiben. Wenn die Datei vorhanden ist, kürzen Sie sie auf die Länge Null und überschreiben Sie sie |
"a" oder "ab" | Wenn die Datei existiert, anhängen (zum Schreiben am EOF öffnen), andernfalls eine neue Datei erstellen |
"r+", "r+b" oder "rb+" | Offen zum Lesen und Schreiben |
"w+", "w+b" oder "wb+" | Zur Aktualisierung kürzen oder erstellen |
"a+", "a+b" oder "ab+" | Anhängen oder neue Datei zur Aktualisierung bei EOF erstellen |
Wie man Dateien schreibt
Funktion | Beschreibung |
---|---|
$fdisplay | Ähnlich wie $display, schreibt stattdessen in eine Datei |
$fwrite | Ähnlich wie $write, schreibt stattdessen in eine Datei |
$fstrobe | Ähnlich wie $strobe, schreibt stattdessen in eine Datei |
$fmonitor | Ähnlich wie $monitor, schreibt stattdessen in eine Datei |
Jede der oben genannten Systemfunktionen gibt Werte in Radix-Dezimalzahlen aus. Sie haben auch drei andere Versionen, um Werte in binärer, oktaler und hexadezimaler Form auszugeben.
Funktion | Beschreibung |
---|---|
$fdisplay() | Druckt standardmäßig dezimal |
$fdisplayb() | Druckt im Binärformat |
$fdisplayo() | Druckt in Oktal |
$fdisplayh() | Druckt im Hexadezimalformat |
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
Simulationsprotokoll 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
Wie man Dateien liest
Eine Zeile lesen
Die Systemfunktion $fgets
liest Zeichen aus der durch [hl]fd[/hd] angegebenen Datei in die Variable str, bis str gefüllt ist, oder ein Newline-Zeichen gelesen und an str übertragen wird, oder eine EOF-Bedingung auftritt.
Wenn während des Lesens ein Fehler auftritt, wird der Code Null zurückgegeben. andernfalls wird die Anzahl der gelesenen Zeichen zurückgegeben.
EOF erkennen
Die Systemfunktion $feof
gibt einen Wert ungleich Null zurück, wenn EOF gefunden wird, und gibt sonst Null für einen gegebenen Dateideskriptor als Argument zurück.
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
Mehrere Argumente für fdisplay
Wenn mehrere Variablen an $fdisplay
übergeben werden , es gibt einfach alle Variablen in der angegebenen Reihenfolge nacheinander ohne Leerzeichen aus.
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
Simulationsprotokoll 10111213
Daten in einen String formatieren
Erstes Argument im $sformat
Systemfunktion ist der Variablenname, in den das Ergebnis eingefügt wird. Das zweite Argument ist der format_string die angibt, wie die folgenden Argumente in einen String formatiert werden sollen.
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
Simulationsprotokoll xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
Verilog