Operaciones de E/S de archivos de Verilog
Verilog tiene tareas y funciones del sistema que pueden abrir archivos, generar valores en archivos, leer valores de archivos y cargar en otras variables y cerrar archivos.
Abrir y cerrar archivos
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
Modos de apertura de archivos
Argumento | Descripción |
---|---|
"r" o "rb" | Abierto para lectura |
"w" o "wb" | Cree un nuevo archivo para escribir. Si el archivo existe, truncarlo a cero y sobrescribirlo |
"a" o "ab" | Si el archivo existe, añádalo (abrir para escribir en EOF), de lo contrario, cree un nuevo archivo |
"r+", "r+b" o "rb+" | Abierto tanto para lectura como para escritura |
"w+", "w+b" o "wb+" | Truncar o crear para actualizar |
"a+", "a+b" o "ab+" | Agregar o crear un nuevo archivo para actualizar en EOF |
Cómo escribir archivos
Función | Descripción |
---|---|
$fdisplay | Similar a $display, escribe en archivo en su lugar |
$fwrite | Similar a $write, escribe en un archivo en su lugar |
$fstrobe | Similar a $strobe, escribe en archivo en su lugar |
$fmonitor | Similar a $monitor, escribe en archivo en su lugar |
Cada una de las funciones del sistema anteriores imprime valores en base decimal. También tienen otras tres versiones para imprimir valores en binario, octal y hexadecimal.
Función | Descripción |
---|---|
$fdisplay() | Imprime en decimal por defecto |
$fdisplayb() | Imprime en binario |
$fdisplayo() | Imprime en octal |
$fdisplayh() | Imprime en hexadecimal |
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
Registro de simulación 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
Cómo leer archivos
Leyendo una línea
La función del sistema $fgets
lee los caracteres del archivo especificado por [hl]fd[/hd] en la variable str hasta que se llena str, o se lee un carácter de nueva línea y se transfiere a str, o se encuentra una condición EOF.
Si ocurre un error durante la lectura, devuelve el código cero. de lo contrario, devuelve el número de caracteres leídos.
Detección de EOF
La función del sistema $feof
devuelve un valor distinto de cero cuando se encuentra EOF y, de lo contrario, devuelve cero para un descriptor de archivo dado como argumento.
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
Múltiples argumentos para fdisplay
Cuando se dan múltiples variables a $fdisplay
, simplemente imprime todas las variables en el orden dado una tras otra sin espacios.
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
Registro de simulación 10111213
Dar formato a los datos en una cadena
Primer argumento en el $sformat
La función del sistema es el nombre de la variable en la que se coloca el resultado. El segundo argumento es format_string que indica cómo deben formatearse los siguientes argumentos en una cadena.
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
Registro de simulación xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
Verilog