首页 > 解决方案 > 在 VHDL 元编程中强制字符串作为集合的成员

问题描述

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

我的理解是,为了从单个通用实体进行有符号和无符号乘法的所有 4 种组合,并且因为没有数据类型/端口可以同时接受有符号和无符号值(无多态性),我需要将这两个因子作为 std_logic_vectors 传递,并根据它们的符号性将它们重铸为有符号或无符号。

为了给我的 generic_multiplier 提供我的因子的符号,因为符号是静态的,我决定将字符串“signed”或“unsigned”作为通用参数传递。根据这些语句,生成语句将负责从 std_logic 到可乘因子的必要类型转换和符号扩展。

如果用户在通用模板实例化期间将“签名”或“无符号”以外的任何字符串传递给我的签名参数,我希望我的模块抛出错误。我可以想到一种使用 if 语句的特殊方法来执行此操作,但是我有什么方法可以定义一组对所有乘法器模块通用的字符串(即 {"signed", "unsigned"}),以及如果我的输入字符串未能位于该集合内,则引发编译器错误?

我知道这可以通过 SystemVerilog 容器或元编程库实现,但我认为我无法说服我的团队使用这些工具,并且想知道是否有任何此类构造可以帮助在基本 VHDL 中进行元编程。

标签: vhdlmetaprogramming

解决方案


声明一个有符号*无符号函数可能更容易,因为数字标准中已经存在有符号*有符号和无符号*无符号。然后将类型和函数作为泛型传递给实体(使用 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
);

推荐阅读