Поддерживает ли Quartus II line.all?

Я реализовал некоторый код VHDL для экспорта кодировок состояний FSM во время компиляции, которые могут быть прочитаны Xilinx ChipScope. Эта функциональность протестирована с Xilinx ISE 14.7, iSim 14.7 и QuestaSim 10.2c от Mentor Graphic. Мой проект может быть синтезирован с альтернативным верхним уровнем для ПЛИС Altera, но у Quartus II, похоже, есть проблема с return line.all;.

Сообщения об ошибках Quartus II (14.0):

  • Ошибка (10351): ошибка тела подпрограммы VHDL в sata_PhysicalLayer.vhdl (504): функция «dbg_GenerateEncodings» не всегда возвращает значение
  • Ошибка (10346): ошибка VHDL в debug.vhdl (47): формальный порт или параметр «кодировки» должны иметь фактическое значение или значение по умолчанию.
  • Ошибка (10657): Ошибка подпрограммы VHDL в sata_PhysicalLayer.vhdl (514): не удалось разработать вызов подпрограммы «dbg_ExportEncoding»

Далее я опишу свой код.


Код VHDL

В проекте используются 3 функции для экспорта кодировок состояний конечного автомата:

  1. кодировать текущее локальное состояние конечного автомата как двоичное значение -> dbg_EncodeState
    (результат этой функции подключается к портам ILA)
  2. преобразовать все состояния локального конечного автомата в строку, разделенную точкой с запятой -> dbg_GenerateEncodings
  3. отформатируйте эту строку и запишите ее элементы в файл-токен -> dbg_ExportEncoding
    (эта функция находится в пакете)

Объявление FSM:

TYPE T_STATE IS (
    ST_HOST_RESET,
    ST_HOST_SEND_COMRESET,
    ST_HOST_SEND_COMRESET_WAIT,
    [...]
    ST_HOST_SEND_ALIGN,
    ST_HOST_TIMEOUT,
    ST_HOST_LINK_OK
);

-- OOB-Statemachine
SIGNAL State                    : T_STATE       := ST_HOST_RESET;
SIGNAL NextState                : T_STATE;

локальные функции - функции для каждой сущности:

function dbg_EncodeState(st : T_STATE) return STD_LOGIC_VECTOR is
begin
    return to_slv(T_STATE'pos(st), log2ceilnz(T_STATE'pos(T_STATE'high) + 1));
end function;

function dbg_GenerateEncodings return string is
  variable l : STD.TextIO.line;
begin
    for i in T_STATE loop
        STD.TextIO.write(l, str_replace(T_STATE'image(i), "st_host_", ""));
        STD.TextIO.write(l, ';');
    end loop;
    return  l.all;
end function;

глобальная функция - определена в debug.pkg.vhdl:

impure function dbg_ExportEncoding(Name : STRING; encodings : string; tokenFileName : STRING) return BOOLEAN is
    file        tokenFile : TEXT open WRITE_MODE is tokenFileName;

    variable cnt, base : integer;
    variable l : line;
begin
    report "Exporting encoding of '" & Name & "' to '" & tokenFileName & "'..." severity note;
    report "dbg_ExportEncoding: '" & encodings & "'" severity note;

    -- write file header
    write(l, "# Encoding file for '" & Name & "'"); writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# ChipScope Token File Version");     writeline(tokenFile, l);
    write(l, "@FILE_VERSION=1.0.0");                writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# Default token value");              writeline(tokenFile, l);
    write(l, "@DEFAULT_TOKEN=");                    writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);

    -- write state entires
    cnt  := 0;
    base := encodings'left;
    for i in encodings'range loop
        if encodings(i) = ';' then
            -- Leave the str_trim call in!
            -- Otherwise, the new parser of ISE 14.7 fails to slice properly.
            write(l, str_trim(encodings(base to i-1)));
            write(l, character'('='));
          write(l, raw_format_nat_hex(cnt));
            writeline(tokenFile, l);
            cnt  := cnt + 1;
            base := i+1;
        end if;
    end loop;

    file_close(tokenFile);
    return true;
end function;

Последняя часть кода - это фиктивная константа в сущности, которая вызывает функцию экспорта:

CONSTANT test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");

используемые вспомогательные функции:

  • log2ceilnz (x) вычисляет необходимые биты для кодирования символов x в двоичном формате
  • to_slv конвертирует все в std_logic_vector; в этом случае целое число для slv
  • str_replace заменяет строку строкой
  • str_trim возвращает строку от str'low до первого вхождения NUL
  • raw_format_nat_hex форматирует натуральное число в шестнадцатеричную строку

Дополнительные примечания:
Все файлы vhdl помечены как VHDL-2008.


Мои вопросы:

  1. Есть ли у кого-нибудь опыт работы с line.all в среде Quartus?
  2. Есть ли обходной путь?
  3. Есть ли лучшее решение для выполнения задачи экспорта без использования строк постоянной длины?

Обойти:

Я заключил свою функцию dbg_GenerateEncodings в оператор генерации:

genXilinx : if (VENDOR = VENDOR_XILINX) generate
  function dbg_GenerateEncodings return string is
  [...]

  constant test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");
begin
end generate;

В отличие от XST, Quartus не проверяет функции внутри блока генерации.


person Paebbels    schedule 20.11.2014    source источник


Ответы (1)


См. Поддержка VHDL Quartus II, раздел 14 Предопределенная языковая среда, запись таблицы 14.3, Construct TEXTIO, крайний правый столбец Поддержка VHDL 1993:

Поддерживается. Файловый ввод-вывод не может быть синтезирован; поэтому вызовы функций TEXTIO игнорируются.

Если вы не можете использовать TEXTIO для синтеза, вы можете представить себе, что указатель на строковый буфер также бесполезен.

Это проблема того, как вы могли бы писать в ФАЙЛ с FPGA. без каких-либо знаний об операционной системе хоста или указания физического интерфейса.

Вы можете синтезировать оставшуюся часть вашего дизайна, окружив неподдерживаемые конструкции директивами translate off и translate on. См. Атрибуты и директивы синтеза VHDL.

person Community    schedule 20.11.2014
comment
Спасибо за эту справочную страницу. Я также изучил улучшения VHDL-2008, но TEXTIO все еще не поддерживается в синтезе :( - person Paebbels; 21.11.2014
comment
translate on/off не позволит Quartus жаловаться, но также не позволит XST записывать перечисления и другие данные на диск. Одним из вариантов использования TEXTIO в среде синтеза является экспорт кодировок перечисления в виде файлов токенов, поэтому ChipScope может отображать конечные автоматы и другие значения шины в качестве токена. Второй вариант использования этого метода - экспорт сопоставления адресов моей SoC на базе PicoBlaze. Поэтому, если я хочу изменить адрес устройства, мне нужно изменить только одну точку - ›мой код VHDL. - person Paebbels; 21.11.2014
comment
У Altera есть нечто, называемое SignalTap. В целом, чем более необычны функции, тем менее портативны дизайны между поставщиками. Вы можете разработать свою собственную стороннюю систему и использовать ее среди поставщиков. В общем, это подразумевает механизм интерфейса, совместимый между целями для хоста, и драйвер устройства для хоста. - person ; 21.11.2014