Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Работа с файлами в 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

  1. Освоение Verilog: полное руководство по проектированию цифровых схем
  2. Освоение конкатенации в Verilog: практическое руководство
  3. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  4. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  5. Мастерство функций в Verilog для эффективного RTL дизайна
  6. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  7. Генератор тактового сигнала в Verilog: проектирование и реализация
  8. Мастерство математических функций Verilog для эффективного аппаратного дизайна
  9. Мастерство $timeformat в Verilog: точность и контроль отображения времени
  10. Понимание и печать timescale в Verilog в любой области видимости