чтение n байтов из двоичного файла до конца файла в verilog - PullRequest
1 голос
/ 24 января 2020

У меня есть бинарный файл. Мне нужно читать 512 бит каждый раз, пока файл не закончится, и передать его в качестве входных данных для моего проекта. Я использую readmemh / readmemb для чтения из файла. но мы должны указать размер массива памяти перед readmemh, чтобы передать в качестве аргумента. поэтому, если мы не знаем глубину регистра, как мы можем прочитать полный двоичный файл.

reg [511:0]packet[1:0]; 
$readmemh("abc.bin",packet); //this abc.bin has 237kb size

какой должна быть глубина «пакета» памяти?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

У вас есть несколько опций

  • Если для файла существует максимально возможный размер, просто объявите массив с максимально необходимым размером. Остальные элементы останутся неинициализированными (X) на $readmemh.
  • Передача определения параметра или макроса в командной строке с размером массива при компиляции проекта. Команды будут зависеть от используемого вами инструмента.
  • Вместо чтения всего файла в массив, читайте его по одной строке за раз, используя $fscanf(fd,"%h", value). value может применяться к вашим входам по мере необходимости.

do begin
  repeat (64) begin
    code = $fscanf(fd,"%h", value); // get byte
    pattern = {pattern,value};      // shift into pattern
  end
  send_to_dut(pattern);
end while (code == 1);
0 голосов
/ 24 января 2020

Метод $ readmemh не идеален для этого типа непрерывной обработки данных.

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

fd = $fopen(filename,"rb");
if (fd==0)
begin
   $display("%m @%0t: Could not open file '%s'",$time,filename);
   $stop;     
end
else
begin
   $display("%m @%0t: Opened %s for reading",$time,filename);
   file_is_open = 1'b1;
end

if (file_is_open)
  value= $fgetc(fd);

ПРЕДУПРЕЖДЕНИЕ:
Используется двоичный файл. Ваш $ readmemh использует файл ASCII. Вы можете, если хотите, прочитать файл ASCII, но затем вы должны выполнить преобразование ASCII в шестнадцатеричный код самостоятельно, написав небольшую функцию Verilog.

...