Если у меня есть 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)