Может ли атрибут изображения VHDL вызываться для типа generi c? - PullRequest
1 голос
/ 01 февраля 2020

Если у меня есть VHDL package или function, который принимает универсальный тип c, есть ли способ вызвать атрибут image для универсального типа c (или достичь той же функциональности каким-либо другим way)?

Например, если я пытаюсь скомпилировать этот пакет с помощью Modelsim:

package dummy_pkg is
    generic (type pkg_t);

end package;

package body dummy_pkg is

    procedure do_something(x : pkg_t) is
        constant s  : string := pkg_t'image(x);
    begin

    end procedure;

end package body;

, то происходит сбой со следующей ошибкой:

dummy_pkg. vhd (9): Атрибут «image» требует префикса метки скалярного типа.

В моем случае я только когда-либо планировал, что pkg_t будет скалярного типа. Может быть, есть какой-нибудь способ сообщить компилятору об этом?

Мне интересно, что если image была бы функцией (с типом generi c) вместо атрибута, то компилятор выглядит счастливым. Например, этот пакет по крайней мере компилируется без ошибок:

package dummy_pkg is
    generic (type pkg_t);

end package;

package body dummy_pkg is

    -- If "image" were a function...
    function image
        generic (type fun_t)
        parameter(x : fun_t) return string is
    begin
        return "A string representing x";
    end function;

    -- Then I could do this...
    procedure do_something(x : pkg_t) is

        function pkg_t_image is new image
            generic map(fun_t => pkg_t);

        constant s  : string := pkg_t_image(x);
    begin

    end procedure;

end package body;

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

dummy_pkg.vhd (10): (vcom-1600) Нет возможных записей для подпрограммы "нанизывать". Видимые подпрограммы: (неявно) STANDARD.to_string [BIT_VECTOR возвращает std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (79) (неявно) STANDARD.to_string [BOOLEAN возвращает std.STANDARD.ST ] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [BIT return std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявное) STANDARD.to_string [std.STANDARD.CHARACTER возвращает std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявное) STANDARD.to_string [std.STANDARD.SEVERITY_LEVEL return .STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [universal_integer возвращает std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard. vhd (93) (неявный) STANDARD.to_string [universal_real return std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [INTEGER возвращает std.STANDARD.STRING ] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) S TANDARD.to_string [std.STANDARD.REAL возвращает std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [std.STANDARD.TIME возвращает std.STANDARD. STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [std.STANDARD.FILE_OPEN_KIND вернуть std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src std .vhd (93) (неявный) STANDARD.to_string [std.STANDARD.FILE_OPEN_STATUS возвращает std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [std. STANDARD.REAL, INTEGER возвращают std.STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [std.STANDARD.REAL, std.STANDARD.STRING возвращают std. STANDARD.STRING] в $ MODEL_TECH /../ vhdl_src / std / standard.vhd (93) (неявный) STANDARD.to_string [std.STANDARD.TIME, std.STANDARD.TIME возвращает std.STANDARD.STRING] в $ MODEL_TECH / ../vhdl_src/std/standard.vhd(93)

1 Ответ

3 голосов
/ 01 февраля 2020

Поскольку изображение может использоваться только для скалярного типа, компилятор не может знать, что pkg_t может быть только скаляром. Следовательно, изображение не может быть использовано напрямую. Опять же, с to_string, компилятор не знает, где его получить, поэтому его нельзя использовать.

Единственный способ сделать это - передать функцию to_string (p: pkg_t) в качестве обобщенного c. Если вы добавите значение <>, компилятор будет искать сигнатуру функции, которая соответствует функции, когда создается экземпляр пакета:

generic (
  type pkg_t;
  function to_string(p : pkg_t) return string is <>;
);

, поэтому теперь пакет может быть создан следующим образом:

library ieee;
use ieee.std_logic_1164.all;

package my_pkg is new dummy_pkg generic map ( pkg_t => std_logic );
-- to_string is already declared in std_logic_1164, hence is connected automatically because of <>
...