如何将数组类型作为泛型类型参数传递给VHDL包?

时间:2016-11-14 18:32:59

标签: generics package vhdl modelsim questasim

我正在使用VHDL-2008中的通用包(列表)。此包具有元素类型的通用类型。如果我在包中声明了这个元素类型的数组类型,那么它就是一个新类型。因此对于例如整数,我的新integer_array与库ieee中的integer_vector不兼容。

所以我还需要传入数组类型(例如integer_vector)。当该数组类型的数组实例与'range属性一起使用时,它会在QuestaSim中给出警告:

  

属性“range”的前缀必须适合数组对象,或者必须表示数组子类型。

a如何表示泛型类型参数是数组?

通用套餐:

package SortListGenericPkg is
  generic (
    type ElementType;  -- e.g. integer
    type ArrayofElementType;  -- e.g. integer_vector
    function LessThan(L : ElementType; R : ElementType) return boolean;     -- e.g. "<"
    function LessEqual(L : ElementType; R : ElementType) return boolean     -- e.g. "<="
  );

  function inside (constant E : ElementType; constant A : in ArrayofElementType) return boolean;
end package;

package body SortListGenericPkg is
  function inside (constant E : ElementType; constant A : in ArrayofElementType) return boolean is
  begin
    for i in A'range loop  -- this line causes the error
      if E = A(i) then
        return TRUE ;
      end if ;
    end loop ;
    return FALSE ;
  end function inside ;
end package body;

实例化

package SortListPkg is
  package SortListPkg_int is new work.SortListGenericPkg
    generic map (
      ElementType        => integer,
      ArrayofElementType => integer_vector,
      LessThan           => "<",
      LessEqual          => "<="
    );
  alias Integer_SortList is SortListPkg_int.SortListPType;
end package SortListPkg ;

1 个答案:

答案 0 :(得分:1)

ModelSim发出类似的错误/警告,因此它可能是VHDL标准问题。

解决方法是将ArrayofElementType声明为包的一部分,例如:

package SortListGenericPkg is
  generic (
    type ElementType  -- e.g. integer
  );
  type ArrayofElementType is array (integer range <>) of ElementType;
  function inside(constant E : ElementType; constant A : in ArrayofElementType) return boolean;
end package;

然后在调用inside时转换参数,如:

... inside(int, ArrayofElementType(int_vec));
在可能/可行的情况下声明参数时,

或简单地使用ArrayofElementType作为类型。