在VHDL元编程中强制字符串作为集合的成员

在VHDL元编程中强制字符串作为集合的成员,vhdl,metaprogramming,Vhdl,Metaprogramming,我正在用VHDL编写一个通用乘法器,它应该能够被实例化以处理有符号和无符号因子的任意组合 我的理解是,为了从单个泛型实体执行有符号和无符号乘法的所有4种组合,并且因为没有可以同时接受有符号和无符号值(无多态性)的数据类型/端口,我需要将这两个因子作为std_逻辑_向量传递,并根据它们的有符号性将它们重新编码为有符号或无符号 为了给泛型乘法器提供因子的符号性,因为符号性是静态的,所以我决定将字符串“signed”或“unsigned”作为泛型参数传入。根据这些语句,generate语句将负责必要的

我正在用VHDL编写一个通用乘法器,它应该能够被实例化以处理有符号和无符号因子的任意组合

我的理解是,为了从单个泛型实体执行有符号和无符号乘法的所有4种组合,并且因为没有可以同时接受有符号和无符号值(无多态性)的数据类型/端口,我需要将这两个因子作为std_逻辑_向量传递,并根据它们的有符号性将它们重新编码为有符号或无符号

为了给泛型乘法器提供因子的符号性,因为符号性是静态的,所以我决定将字符串“signed”或“unsigned”作为泛型参数传入。根据这些语句,generate语句将负责必要的类型转换和从std_逻辑到多因子的符号扩展

如果用户在泛型模板实例化期间将“signed”或“unsigned”以外的任何字符串传入我的signedness参数,我希望我的模块抛出一个错误。我可以想出一种特别的方法来处理if语句,但是有没有办法定义一组对所有乘法器模块通用的字符串(即,{“signed”,“unsigned”}),如果我的输入字符串不在该集合内,则抛出编译器错误


我知道这在SystemVerilog容器或元编程库中是可能的,但我不认为我能说服我的团队使用这些工具,我想知道是否有任何这样的构造可以帮助在基本VHDL中进行元编程。

声明有符号*无符号函数可能更容易些,as signed*signed和unsigned*unsigned已存在于numeric_std中。然后将类型和函数作为泛型传递给实体(使用VHDL 2008)?这样,它强制用户定义一个乘法函数。如果你已经有了这4个选项,那么你就有了所有的基础。如果用户想要使用其他古怪的类型,他们还必须为它定义一个“*”函数

function "*" (l :   signed; r : unsigned) return signed;
function "*" (l : unsigned; r :   signed) return signed;

entity mult_generic is
  generic (
    type op1_t;
    type op2_t;
    type mult_t;
    function "*" (l : op1_t; r: op2_t) return mult_t is <>;
  );

  port (
    clk : in std_logic;

    op1  : op1_t;
    op2  : op2_t;
    mult : mult_t;
  );
end entity mult_generic;

architecture rtl of mult_generic is
begin

  process(clk)
  begin
    if rising_edge(clk) then
      mult <= op1 * op2;
    end if;
  end process;

end architecture;

....

--example
mult_inst : entity work.mult_generic
generic map (
  op1_t => unsigned;
  op2_t => signed;
  mult_t => signed;
)
port map (
  --etc
);
函数“*”(l:已签名;r:未签名)返回已签名;
函数“*”(l:未签名;r:已签名)返回已签名;
实体mult_泛型是
一般的(
op1型;
op2型;
多类型;
函数“*”(l:op1;r:op2)返回多个is;
);
港口(
clk:标准逻辑中;
op1:op1_t;
op2:op2_t;
mult:mult;
);
多个通用终端实体;
mult_-generic的体系结构rtl是
开始
过程(clk)
开始
如果上升沿(clk),则
mult未签名;
op2_t=>已签名;
mult_t=>已签名;
)
港口地图(
--等
);

不是在编译时,但断言严重性失败将在精化过程中完成这项工作。我建议使用枚举(在包中)而不是字符串,这样可以消除无效值的可能性。公平地说,如果您已经拥有所有版本的函数,那么您可能根本不需要在实体中使用它!v2019.2中是否修复了接口子程序重载解析中的错误?Vivado Xsim-2008特性支持仍然落后于v2019.2。通用包和包实例化在ug901 v2019.2中,并提供了另一种方式。还有其他支持这些-2008特性的合成供应商吗?