Работа с файлами

Verilog поддерживает функционал по работе с файловым вводом и выводом. Файл может быть открыт для чтения или записи с помощью команды $fopen(), которая возвращает 32-разрядный целочисленный дескриптор, называемый файловым дескриптором. Этот дескриптор можно использовать для чтения и записи в этот файл до тех пор, пока он не будет закрыт. Дескриптор файла может быть закрыт с помощью $fclose(). После закрытия дальнейшее чтение или запись через этот файловый дескриптор не допускается.

По умолчанию файл открывается в режиме записи. Файл также можно открыть в других режимах, указав тип режима. Ниже приведена часть режимов, в которых может быть открыт файл:

  • "r" – открыть файл для чтения (файл должен существовать);

  • "w" – открыть пустой файл для записи; если файл существует, то его содержимое удаляется;

  • "a" – открыть файл для записи в конец (для добавления); файл создается, если он не существует

Для открытия в двоичном режиме используются "rb", "wb", "ab" и пр.

Системные команды $fdisplay() и $fwrite() могут использоваться для записи форматированной строки в файл. Первым их аргументом является дескриптор файла, а затем указываются данные, которые следует сохранить.

Чтобы прочитать файл, он должен быть открыт либо в режиме чтения r, либо в режиме чтения-записи r+. $fgets() считывает одну строку из файла.

$feof() возвращает значение true при достижении конца файла. Это может быть использовано в цикле для чтения всего содержимого файла.

$fscanf() работает по аналогии с функцией fscanf в языке C, считывая данные из файла, интерпретируя их согласно заданному формату и записывая значения в остальные аргументы.

Пример

module file_tb;
  integer fd, idx;
  string  str;

  initial begin
    fd = $fopen ("filename.ext", "w");
    for (int i = 0; i < 5; i++)
      $fdisplay (fd, "Iteration = %0d", i);
    $fclose(fd);

    fd = $fopen ("filename.ext", "r");
    $display("fd = %0d", fd);
    while ($fscanf (fd, "%s = %d", str, idx) == 2) begin
      $display("Line: %s = %0d", str, idx);
    end
    
    $fclose(fd);
  end
endmodule

Результат исполнения

fd = -2147483645
Line: Iteration = 0
Line: Iteration = 1
Line: Iteration = 2
Line: Iteration = 3
Line: Iteration = 4

Last updated