Verilog File IO-bewerkingen
Verilog heeft systeemtaken en -functies die bestanden kunnen openen, waarden in bestanden kunnen uitvoeren, waarden uit bestanden kunnen lezen en in andere variabelen kunnen laden en bestanden kunnen sluiten.
Bestanden openen en sluiten
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
Bestandsmodi openen
Argument | Beschrijving |
---|---|
"r" of "rb" | Open om te lezen |
"w" of "wb" | Maak een nieuw bestand om te schrijven. Als het bestand bestaat, kap het dan af tot een lengte van nul en overschrijf het |
"a" of "ab" | Als bestand bestaat, voeg toe (open voor schrijven bij EOF), maak anders een nieuw bestand |
"r+", "r+b" of "rb+" | Open voor zowel lezen als schrijven |
"w+", "w+b" of "wb+" | Afkappen of maken voor update |
"a+", "a+b" of "ab+" | Voeg toe of maak een nieuw bestand voor update bij EOF |
Hoe bestanden te schrijven
Functie | Beschrijving |
---|---|
$fdisplay | Vergelijkbaar met $display, schrijft in plaats daarvan naar bestand |
$fwrite | Vergelijkbaar met $write, schrijft in plaats daarvan naar bestand |
$fstrobe | Vergelijkbaar met $strobe, schrijft in plaats daarvan naar bestand |
$fmonitor | Vergelijkbaar met $monitor, schrijft in plaats daarvan naar bestand |
Elk van de bovenstaande systeemfuncties drukt waarden af in radix decimaal. Ze hebben ook drie andere versies om waarden in binair, octaal en hexadecimaal af te drukken.
Functie | Beschrijving |
---|---|
$fdisplay() | Drukt standaard in decimalen af |
$fdisplayb() | Print in binair |
$fdisplayo() | Afdrukken in octaal |
$fdisplayh() | Print in hexadecimaal |
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
Simulatielogboek 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
Hoe lees ik bestanden
Een regel lezen
De systeemfunctie $fgets
leest tekens uit het bestand gespecificeerd door [hl]fd[/hd] in de variabele str totdat str is gevuld, of een nieuwe regel wordt gelezen en overgebracht naar str, of een EOF-voorwaarde wordt aangetroffen.
Als er een fout optreedt tijdens het lezen, wordt code nul geretourneerd. anders wordt het aantal gelezen tekens geretourneerd.
EOF detecteren
De systeemfunctie $feof
retourneert een waarde die niet nul is wanneer EOF wordt gevonden, en geeft anders nul terug voor een gegeven bestandsdescriptor als 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
Meerdere argumenten om weer te geven
Als er meerdere variabelen worden gegeven aan $fdisplay
, het drukt gewoon alle variabelen in de gegeven volgorde een voor een af zonder spatie.
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
Simulatielogboek 10111213
Gegevens opmaken naar een string
Eerste argument in de $sformat
systeemfunctie is de variabelenaam waarin het resultaat wordt geplaatst. Het tweede argument is de format_string die vertelt hoe de volgende argumenten moeten worden opgemaakt in een string.
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
Simulatielogboek xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
Verilog