function - 可以在通用类型上调用 VHDL 图像属性吗?

标签 function generics types attributes vhdl

如果我有一个采用泛型类型的 VHDL packagefunction,是否有某种方法可以调用泛型上的 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/

相关文章:

python将字符串转换为运算符

function - 如何在没有宏的情况下评估Excel中的函数?

javascript - 如何使用 javascript 拆分字符串 - 将名字和姓氏与文本框分开

java - 了解java泛型中通配符的使用?

c# - 使用 `String` 而不是 `Date` 类型时如何验证日期?

r - 在 R 函数中调用 data.frame 列?

c# - 如果使用无效的泛型类型,我应该抛出异常吗?如果是,抛出哪个异常?

java - 用于泛型类扩展的 Mockito/Powermock 类构造

包含不确定性/误差线的Python数据类型?

Haskell:通用 IORef、MVar?