Использование Systemverilog для чтения и печати двоичного файла. Первые байты прочитаны и распечатаны нормально, проблема \w байт, содержащий 1 в битовой позиции ms, обнаружен

Приведенный ниже код Systemverilog представляет собой тестовую среду для одного файла, которая считывает двоичный файл в память с помощью $fread, а затем распечатывает содержимое памяти. Размер двоичного файла составляет 16 байт, и его представление приведено ниже (я ожидаю, что код Systemverilog будет напечатан).

Напечатанный вывод соответствует тому, что я ожидал для первых 6 (0-5) байтов. В этот момент ожидаемый результат - 0x80, однако напечатанный вывод представляет собой последовательность из 3 байтов, начинающихся с 0xef, которых нет в файле стимула. После этих 3 байтов результат снова соответствует стимулу. Кажется, что когда бит 7 прочитанного двоичного байта равен 1, возникает ошибка. Это почти так, как если бы данные обрабатывались как подписанные, но это не так, их двоичные данные печатаются как шестнадцатеричные. Память определяется как беззнаковая логика типа.

Это похоже на вопрос / ответ в этом сообщении: Чтение данных двоичного файла в Verilog в 2D-массив. Однако в моем коде нет такой же проблемы (я использую "rb") в операторе $fopen, поэтому это решение не применимо к этой проблеме.

В спецификации Systemverilog 1800-2012 говорится в разделе 21.3.4.4 "Чтение двоичных данных", что $fread можно использовать для чтения двоичного файла, и далее говорится, как это сделать. Я считаю, что этот пример соответствует тому, что указано в этом разделе.

Код размещен на площадке EDA Playground, чтобы пользователи могли его увидеть и запустить. https://www.edaplayground.com/x/5wzA Вам нужен логин, чтобы запустить и скачать. Логин бесплатный. Он обеспечивает доступ к полным облачным версиям стандартных инструментов для моделирования HDL.

Также попробовал запустить 3 разных симулятора на EDA Playground. Все они дают одинаковый результат.

Попробовали переупорядочить файл tim.bin так, чтобы значение 0x80 располагалось в начале файла, а не в середине. В этом случае ошибка также возникает в начале вывода на печать тестовой среды.

Может быть, код Systemverilog в порядке, а проблема в двоичном файле? Я предоставил скриншот того, что показывает режим emacs hexl для своего содержимого. Также посмотрел его другой зритель, и он выглядел так же. Вы можете загрузить его при запуске на EDA Playground, чтобы изучить его в другом редакторе. Бинарный файл был создан GNU Octave.

Предпочел бы иметь решение, которое использует Systemverilog $fread, а не что-то еще, чтобы отлаживать оригинал, а не обходить его (обучение). Это будет развито в тестовой среде Systemverilog, которая применяет чтение стимула из двоичного файла, созданного в Octave/Matlab, к Systemverilog DUT. Двоичный fileIO предпочтительнее из-за скорости доступа к файлу.

Почему тестовая среда Systemverilog выдает 0xef вместо 0x80 для mem[6]?

module tb();

  // file descriptors
  int       read_file_descriptor;
  // memory
  logic [7:0] mem [15:0];


  // ---------------------------------------------------------------------------
  // Open the file
  // ---------------------------------------------------------------------------
  task open_file();
    $display("Opening file");
    read_file_descriptor=$fopen("stim.bin","rb");
  endtask

  // ---------------------------------------------------------------------------
  // Read the contents of file descriptor
  // ---------------------------------------------------------------------------
  task readBinFile2Mem ();
    int n_Temp;
    n_Temp = $fread(mem, read_file_descriptor);
    $display("n_Temp = %0d",n_Temp);
  endtask
  
  // ---------------------------------------------------------------------------
  // Close the file
  // ---------------------------------------------------------------------------
  task close_file();
    $display("Closing the file");
    $fclose(read_file_descriptor);
  endtask

  // ---------------------------------------------------------------------------
  // Shut down testbench
  // ---------------------------------------------------------------------------
  task shut_down();
    $stop;
  endtask
  
  // ---------------------------------------------------------------------------
  // Print memory contents
  // ---------------------------------------------------------------------------  
  task printMem();
    foreach(mem[i])
      $display("mem[%0d] = %h",i,mem[i]);
  endtask
    
  // ---------------------------------------------------------------------------
  // Main execution loop
  // ---------------------------------------------------------------------------
  initial
    begin :initial_block
      open_file;
      readBinFile2Mem;
      close_file;
      printMem;
      shut_down;
    end :initial_block

endmodule

Двоичный файл стимула:

Фактический выход:

Opening file
n_Temp = 16
Closing the file
mem[15] = 01
mem[14] = 00
mem[13] = 50
mem[12] = 60
mem[11] = 71
mem[10] = 72
mem[9] = 73
mem[8] = bd
mem[7] = bf
mem[6] = ef
mem[5] = 73
mem[4] = 72
mem[3] = 71
mem[2] = 60
mem[1] = 50
mem[0] = 00

Обновление: был проведен эксперимент, чтобы проверить, может ли двоичный файл изменяться в процессе загрузки на площадку EDA. В этих шагах нет кода Systemverilog, это просто загрузка / скачивание файла.

Шаги: (Используется https://hexed.it/ для создания и просмотра двоичного файла)

  1. Создать / сохранить двоичный файл с шестнадцатеричным шаблоном 80 00 80 00 80 00 80 00
  2. Создать новую площадку
  3. Загрузите новый созданный двоичный файл на новую площадку
  4. Установите флажок "загружать файлы после запуска" на игровой площадке.
  5. Сохранить детскую площадку
  6. Беговая площадка
  7. Сохраните / разархивируйте результаты пробега на детской площадке
  8. Просмотрите двоичный файл, в моем случае он был изменен в процессе загрузки / выгрузки. Снимок экрана с результатом показан ниже:

Этот эксперимент проводился на двух разных рабочих станциях Windows. Основываясь на этих результатах и ​​комментариях, я собираюсь закрыть эту проблему с указанием, что это не проблема Systemverilog, а связана с загрузкой / загрузкой двоичных файлов на площадку EDA. Спасибо тем, кто прокомментировал.

1 ответ

Решение

Неожиданный результат, выдаваемый тестовой программой, вызван изменениями, которые происходят в двоичном файле стимула во время / после загрузки на площадку EDA. Средство тестирования Systemverilog работает так, как задумано, для печати содержимого двоичного файла.

Этот вывод основан на комментариях сообщества и экспериментальных результатах, которые приведены в конце обновленного вопроса. Дается подробная процедура, чтобы другие могли повторить эксперимент.

Другие вопросы по тегам