Generics 如何将数组类型作为泛型类型参数传递给VHDL包?
我正在用VHDL-2008编写一个通用包(列表)。此包具有元素类型的泛型类型。如果我在包中声明此元素类型的数组类型,则它是一个新类型。例如,对于integer,我的新integer_数组将与ieee库中的integer_向量不兼容 因此,我还需要传入数组类型(例如integer_vector)。当该数组类型的数组实例与Generics 如何将数组类型作为泛型类型参数传递给VHDL包?,generics,package,vhdl,modelsim,questasim,Generics,Package,Vhdl,Modelsim,Questasim,我正在用VHDL-2008编写一个通用包(列表)。此包具有元素类型的泛型类型。如果我在包中声明此元素类型的数组类型,则它是一个新类型。例如,对于integer,我的新integer_数组将与ieee库中的integer_向量不兼容 因此,我还需要传入数组类型(例如integer_vector)。当该数组类型的数组实例与'range属性一起使用时,它会在QuestaSim中发出警告: 属性“range”的前缀必须适用于数组对象,或者必须表示数组子类型 a如何表示泛型类型参数是数组 通用软件包: p
'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 ;
包SortListGenericPkg是
一般的(
type ElementType;--例如整数
类型ArrayofElementType;--例如整数向量
函数LessThan(L:ElementType;R:ElementType)返回布尔值;--例如“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;
或者,如果可能/可行,在声明参数时简单使用ArrayofElementType
作为类型。我可以转换两个数组吗?它们是否被视为不同的不兼容类型?如何进行反向转换?QuestaSim显示此错误:**错误:(vcom-1583)从“work.SortListGenericPkg.ArrayofElementType”到“work.SortListGenericPkg.ArrayofElementType_Internal”的非法类型转换(非数字到数组).
第一个参数不知道是数组。编辑:哦,就我所知,它在调用端……但至少我们注意到——在讨论新版本中的问题时——VHDL需要一个概念来指定包泛型列表中类型参数的种类。两个方向的转换都是可能的,因为两种类型都是available。我简要地阅读了VHDL Gitter通道。可能隐式类型转换为目标类型是一种替代方法。IEEE Std 1076-2008 16.2.3数组的预定义属性,A'RANGE,Prefix:适用于数组对象或其别名,或表示其索引范围已定义的数组子类型的任何前缀通过约束。ArrayofElementType类和子类型在细化后才知道。6.5.3接口类型声明接口类型的值集和适用操作可由环境中的关联子类型确定。,…未定义的基类型和基类型的子类型。该类(见5.1)未定义基类型的。
... inside(int, ArrayofElementType(int_vec));