Я работаю над общим пакетом (списком) в VHDL-2008. Этот пакет имеет универсальный тип для типа элемента. Если я объявлю тип массива этого типа элемента в пакете, это будет новый тип. Так, например. integer, мой новый integer_array будет несовместим с integer_vector из библиотеки ieee.
Поэтому мне также нужно передать тип массива (например, 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 ;