如果我有一个采用泛型类型的 VHDL package
或 function
,是否有某种方法可以调用泛型上的 image
属性类型(或以其他方式实现相同的功能)?
例如,如果我尝试使用 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): Attribute "image" requires a scalar type mark prefix.
就我而言,我只打算将 pkg_t
设为标量类型。是否有某种方法可以告诉编译器这一点?
我发现有趣的是,如果 image
是一个函数(具有泛型类型)而不是一个属性,那么编译器似乎会很高兴。例如,这个包至少编译不会出错:
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) No feasible entries for subprogram "to_string". Visible subprograms are: (implicit) STANDARD.to_string[BIT_VECTOR return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(79) (implicit) STANDARD.to_string[BOOLEAN return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[BIT return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.CHARACTER return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.SEVERITY_LEVEL return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[universal_integer return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[universal_real return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[INTEGER return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.REAL return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.TIME return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.FILE_OPEN_KIND return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.FILE_OPEN_STATUS return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.REAL, INTEGER return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.REAL, std.STANDARD.STRING return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93) (implicit) STANDARD.to_string[std.STANDARD.TIME, std.STANDARD.TIME return std.STANDARD.STRING] at $MODEL_TECH/../vhdl_src/std/standard.vhd(93)
最佳答案
因为'image只能用于标量类型,所以编译器无法知道pkg_t只能是标量。因此'图像不能直接使用。再次使用 to_string,编译器不知道从哪里获取它,因此无法使用。
执行此操作的唯一方法是将 to_string(p : pkg_t) 函数作为泛型传递。如果添加 <> 值,编译器将在实例化包时搜索与该函数匹配的函数签名:
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 <>
关于function - 可以在通用类型上调用 VHDL 图像属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60016078/