Использование целых чисел из большого однострочного текстового файла для testbench

У меня есть файл с большим количеством целых чисел, он выглядит так:

123 254 360 700 800 900 1000 354 778 897 663 554 888 776 654 655 231 900 777 666 667 776 887 991 555 888 778 666 111 2232 444 545 667 ...  

Я написал VHDL-код (алгоритм) для анализа этого файла, который хранит несколько характеристик этого файла. Я хочу написать тестовый стенд для этого алгоритма, который принимает значение (целое число) за раз, передает его моему алгоритму в качестве входных данных и переходит к следующему значению.

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

Предостережение заключается в том, что это большой однострочный файл, разделенный пробелами. Я пробовал такие решения, как чтение текстового файла в VHDL testbench, но они не подходят для однострочного файла.

2 ответа

Если вы не ограничены в памяти, вы можете просто прочитать всю строку сразу, а затем проанализировать ее по одному целому числу за раз до последнего целого числа. Пример:

use std.textio.all;

entity foo is
end entity foo;

architecture arc of foo is
begin
  process
    variable l: line;
    file f: text is "foo.txt";
    variable i: integer;
    variable good: boolean;
  begin
    readline(f, l); 
    loop
      read(l, i, good);
      exit when not good;
      report integer'image(i);
    end loop;
    wait;
  end process;
end architecture arc;

Если размер вашего файла превышает объем доступной памяти, вам придется разделить readline небольшими порциями, но здесь std.textio не поможет, и вам придется использовать процедуры чтения более низкого уровня и пользовательский тип файлов символов. Но лично я, вероятно, использовал бы некоторые утилиты оболочки, чтобы разбить супер-длинную линию на более короткие. Программирование на VHDL забавно, но когда решаемая проблема слишком далека от аппаратного обеспечения, веселье становится менее значительным.

Процедура read(l, int) считывает следующее целое число из строки l, разделенной пробелом. Таким образом, вы можете выполнить одну readline(f, l) с несколькими вызовами read(l, int), пока строка не станет пустой.

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