【问题标题】:How to pass an array type as generic type parameter to a VHDL package?如何将数组类型作为泛型类型参数传递给 VHDL 包?
【发布时间】:2016-11-14 18:32:58
【问题描述】:

我正在开发 VHDL-2008 中的通用包(列表)。此包具有元素类型的泛型类型。如果我在包中声明了这个元素类型的数组类型,它就是一个新类型。所以例如integer,我的新 integer_array 将与库 ieee 中的 integer_vector 不兼容。

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

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

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

通用包:

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 ;

【问题讨论】:

  • IEEE Std 1076-2008 16.2.3 数组的预定义属性,A'RANGE,前缀:适用于数组对象的任何前缀 A,或其别名,或表示其索引范围由约束定义的数组子类型。 ArrayofElementType 类和子类型在详细说明之前是未知的。 6.5.3 接口类型声明 接口类型的值集和适用的操作可以由环境中的关联子类型确定。, ...未定义的基类型和子类型基本类型。未定义基类型的类(见 5.1)。

标签: generics package vhdl modelsim questasim


【解决方案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 作为类型。

【讨论】:

  • 我可以转换两个数组吗?他们不认为是不同的不兼容类型吗?如何进行反向转换?
  • QuestaSim 显示此错误:** Error: (vcom-1583) Illegal type converson from 'work.SortListGenericPkg.ArrayofElementType' to 'work.SortListGenericPkg.ArrayofElementType_Internal' (non-numeric to array). 第一个参数未知为数组。 编辑:哦,它在调用方...
  • 据我所知它有效。但至少我们注意到——在新的VHDL Gitter channel 中讨论这个问题时——VHDL 需要一个概念来指定包通用列表中的类型参数的种类。
  • 可以双向转换,因为两种类型都可用。我简要阅读了 VHDL Gitter 频道。也许隐式类型转换为目标类型可能是另一种选择。
猜你喜欢
  • 2022-11-28
  • 2019-02-27
  • 1970-01-01
  • 2019-03-05
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多