Operações de E/S de arquivo Verilog
O Verilog possui tarefas e funções do sistema que podem abrir arquivos, gerar valores em arquivos, ler valores de arquivos e carregar em outras variáveis e fechar arquivos.
Abrindo e fechando arquivos
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 abertura de arquivo
Argumento | Descrição |
---|---|
"r" ou "rb" | Aberto para leitura |
"w" ou "wb" | Cria um novo arquivo para escrita. Se o arquivo existir, trunque-o para tamanho zero e sobrescreva-o |
"a" ou "ab" | Se o arquivo existir, anexe (abra para escrita em EOF), senão crie um novo arquivo |
"r+", "r+b" ou "rb+" | Aberto para leitura e escrita |
"w+", "w+b" ou "wb+" | Truncar ou criar para atualização |
"a+", "a+b" ou "ab+" | Anexar ou criar um novo arquivo para atualização no EOF |
Como escrever arquivos
Função | Descrição |
---|---|
$fdisplay | Semelhante ao $display, grava em arquivo |
$fwrite | Semelhante a $write, grava no arquivo em vez disso |
$fstrobe | Semelhante ao $strobe, grava em arquivo |
$fmonitor | Semelhante ao $monitor, grava em arquivo |
Cada uma das funções do sistema acima imprime valores em decimal de base. Eles também têm três outras versões para imprimir valores em binário, octal e hexadecimal.
Função | Descrição |
---|---|
$fdisplay() | Imprime em decimal por padrão |
$fdisplayb() | Imprime em binário |
$fdisplayo() | Imprime em octal |
$fdisplayh() | Imprime em 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 simulação 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
Como ler arquivos
Ler uma linha
A função do sistema
$fgets
lê caracteres do arquivo especificado por [hl]fd[/hd] na variável str até que str seja preenchido, ou um caractere de nova linha seja lido e transferido para str, ou uma condição EOF seja encontrada. Se ocorrer um erro durante a leitura, ele retornará o código zero. caso contrário, retorna o número de caracteres lidos.
Detectando EOF
A função do sistema
$feof
retorna um valor diferente de zero quando EOF é encontrado e retorna zero caso contrário para um determinado descritor de arquivo 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
Vários argumentos para fdisplay
Quando várias variáveis são fornecidas a
$fdisplay
, ele simplesmente imprime todas as variáveis na ordem especificada, uma após a outra, sem espaço.
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 simulação 10111213
Formatando dados para uma string
Primeiro argumento no
$sformat
função do sistema é o nome da variável na qual o resultado é colocado. O segundo argumento é o format_string que informa como os argumentos a seguir devem ser formatados em uma 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
Registro de simulação xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
Verilog