Чтение длины текста в Vivado

Мне нужно получить длину текстового файла в Vivado во время моделирования. Я попробовал ниже фрагмент кода, но получил ошибку.

file my_input : TEXT open READ_MODE is "/home/sukru/MD5.dat";
variable my_line : LINE;
variable input_line : LINE;
variable length : integer;

readline(my_input, input_line);
read(input_line, length);
writeline(output, input_line);  -- optional, write to std out
write(input_line, integer'(length));
writeline(output, input_line);

Сообщение об ошибке такое.

Error: TEXTIO function READ: read a non-integer, an integer is expected
a
-2147483648

Я могу читать индекс текста, но длина не имеет смысла. Кто-то направит меня, как я могу получить длину любого текстового файла.


person Sukru    schedule 04.07.2018    source источник
comment
Как насчет предоставления минимально воспроизводимого примера? (включая по крайней мере строку для MD5.dat, демонстрирующую проблему. Попытка построения на показывает, что ваша LINE input_line, из которой вы ЧИТАЕТЕ, не содержит текстовую строку, распознаваемую как представляющую целое число.   -  person    schedule 04.07.2018
comment
.dat звучит так, как будто это может быть даже двоичный файл (т.е. вам нужно открыть его в шестнадцатеричном редакторе)? Можете ли вы показать образец содержимого MD5.dat?   -  person Pam    schedule 04.07.2018
comment
У меня такое чувство, что у нас здесь проблема X-Y. Зачем вам размер файла? Я писал Verilog много лет и никогда не нуждался в этом.   -  person Oldfart    schedule 04.07.2018
comment
Это дублирующий вопрос. См. Можно ли проверить длину входного текстового файла? также подозревается проблема X-Y, и это принятый ответ.   -  person    schedule 05.07.2018
comment
Отвечает ли это на ваш вопрос? Можно ли проверить длину входной текстовый файл?   -  person    schedule 21.05.2020


Ответы (2)


В настоящее время VHDL не имеет возможности взаимодействия с операционной системой хоста для определения длины файла.

Существует эквивалентность между байтами и символом типа VHDL (см. IEEE Std 1076-2008).

  1. Нормативные ссылки

...
ISO/IEC 8859-1:1998, Информационные технологии. 8-битные однобайтовые кодированные наборы графических символов. Часть 1. Латинский алфавит № 1.

Также см. 16.3 Стандарт пакета, тип символа, в который включены все 256 значений перечисления для однобайтового символа.

Это означает, что мы можем считать символы в файле:

use std.textio.all;

entity length_in_bytes is
end entity;

architecture foo of length_in_bytes is
    impure function file_length (file_name: string) return integer is
        type char_file is file of character;
        file file_in: char_file open read_mode is file_name;
        variable char_buffer:   character;
        variable length:        integer := 0;
    begin
        while not ENDFILE(file_in) loop
            read(file_in, char_buffer);
            length := length + 1;
        end loop;
        file_close(file_in);
        -- report file_name & " length = " & integer'image(length);
        return length;
    end function;
        signal filelength:  natural;
begin
    filelength <= file_length("md5.dat");

    process
    begin
        wait for 0 ns; -- skip default signal value;
        report "file md5.dat length = " & integer'image(filelength);
        wait;
    end process;
end architecture;

Длина, возвращаемая вызовом функции, будет соответствовать длине, предоставляемой основной операционной системой.

File_close оставляет файл незаблокированным для дальнейшего использования, а чтение открытого файла происходит последовательно с момента открытия файла.

person Community    schedule 05.07.2018

Эта строка читает строку из файла:

readline(my_input, input_line);

Эта строка пытается прочитать целое число (деструктивно) из строки:

read(input_line, length);

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

Если вы хотите получить длину любого текстового файла, вам нужно прочитать каждую строку в файле, найти длину каждой и добавить их. Длину каждой строки легко найти, потому что тип line имеет атрибут 'length, поэтому длина каждой строки будет:

input_line'length

(Хотя обратите внимание, что атрибут 'length не включает символ конца строки.) Кстати, эта строка не будет отображать то, что вы только что прочитали, потому что чтение (в случае успеха) деструктивно:

writeline(output, input_line);  -- optional, write to std out

(«Деструктивное чтение» — это чтение, которое не только считывает, но и удаляет данные.)

person Matthew Taylor    schedule 04.07.2018
comment
Я не понимаю смысла деструктивного. Можете ли вы поделиться некоторыми ссылками об атрибуте 'length? - person Sukru; 04.07.2018
comment
@Sukru Я добавил к своему ответу определение деструктивного чтения. Множество ссылок об атрибутах VHDL можно найти, погуглив атрибут длины VHDL. - person Matthew Taylor; 04.07.2018
comment
Спасибо большое. Пожалуйста, простите мои глупые вопросы, я просто новичок во всем этом - person Sukru; 05.07.2018
comment
Заметил при поиске дубликатов. Вы не можете просто добавить длину input_line.all. IEEE Std 1076-2008 16.4 Пакет TEXTIO Представление строки не содержит представление конца строки. Язык не определяет представление конца строки. Реализация должна позволять записывать в файл все возможные значения типов CHARACTER и STRING. Однако, поскольку реализации разрешено использовать определенные значения типов CHARACTER и STRING в качестве разделителей строк, чтение этих значений из TEXT-файла может оказаться невозможным. - person ; 21.05.2020