【发布时间】: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