Работа с файлами в Verilog: открытие, чтение, запись и закрытие
Verilog предоставляет системные задачи и функции для работы с файлами: открытия, записи значений, чтения данных в переменные и закрытия файлов.
Открытие и закрытие файлов
module tb;
// Переменная для хранения дескриптора файла
integer fd;
initial begin
// Открываем файл "my_file.txt" для записи
// Дескриптор сохраняется в переменную fd
fd = $fopen("my_file.txt", "w");
// Закрываем файл по дескриптору
$fclose(fd);
end
endmodule
Режимы открытия файлов
| Аргумент | Описание |
|---|---|
| "r" или "rb" | Открытие для чтения |
| "w" или "wb" | Создание нового файла для записи. Если файл существует — обнуляется и перезаписывается |
| "a" или "ab" | Дописывание в конец файла (EOF), если существует; иначе создание нового |
| "r+", "r+b" или "rb+" | Открытие для чтения и записи |
| "w+", "w+b" или "wb+" | Обнуление или создание для обновления |
| "a+", "a+b" или "ab+" | Дописывание или создание нового файла для обновления в конце |
Запись в файлы
| Функция | Описание |
|---|---|
| $fdisplay | Аналог $display, вывод в файл |
| $fwrite | Аналог $write, вывод в файл |
| $fstrobe | Аналог $strobe, вывод в файл |
| $fmonitor | Аналог $monitor, вывод в файл |
Все перечисленные функции по умолчанию выводят значения в десятичном формате. Существуют также варианты для двоичного, восьмеричного и шестнадцатеричного представления.
| Функция | Описание |
|---|---|
| $fdisplay() | Десятичный формат (по умолчанию) |
| $fdisplayb() | Двоичный формат |
| $fdisplayo() | Восьмеричный формат |
| $fdisplayh() | Шестнадцатеричный формат |
module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
fd = $fopen("my_file.txt", "w");
my_var = 0;
$fdisplay(fd, "Value displayed with \$fdisplay");
#10 my_var = 8'h1A;
$fdisplay(fd, my_var); // Десятичный
$fdisplayb(fd, my_var); // Двоичный
$fdisplayo(fd, my_var); // Восьмеричный
$fdisplayh(fd, my_var); // Шестнадцатеричный
$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);
$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
Результат симуляции
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
Чтение из файлов
Чтение строки
Системная функция $fgets читает символы из файла, заданного дескриптором fd, в переменную str до заполнения переменной, встречи символа новой строки (который также записывается в str) или условия EOF.
При ошибке возвращает 0, иначе — количество прочитанных символов.
Определение конца файла
Функция $feof возвращает ненулевое значение при достижении EOF для заданного дескриптора, и 0 — в противном случае.
module tb;
reg [8*45:1] str;
integer fd;
initial begin
fd = $fopen("my_file.txt", "r");
while (! $feof(fd)) begin
$fgets(str, fd);
$display("%0s", str);
end
$fclose(fd);
end
endmodule
Множественные аргументы в $fdisplay
При передаче нескольких переменных в $fdisplay они выводятся последовательно без пробелов.
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
Результат симуляции
10111213
Форматирование данных в строку
Системная функция $sformat помещает отформатированную строку в первую переменную-аргумент. Второй аргумент — форматная строка, определяющая представление последующих аргументов.
module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA; b = 4'hB;
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule
Результат симуляции
a=10 b=0xb
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости