Как передать тип массива в качестве параметра универсального типа в пакет VHDL?

Я работаю над общим пакетом (списком) в 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 ;

person Paebbels    schedule 14.11.2016    source источник
comment
IEEE Std 1076-2008 16.2.3 Предопределенные атрибуты массивов, A'RANGE, префикс: Любой префикс A, подходящий для объекта массива или его псевдонима, или обозначающий подтип массива, диапазоны индексов которого определяются ограничение. Класс и подтип ArrayofElementType неизвестны до тех пор, пока они не будут уточнены. 6.5.3 Объявления типов интерфейса Набор значений и применимых операций для типа интерфейса может определяться соответствующим подтипом в среде., ... неопределенный базовый тип и подтип базовый тип. Класс (см. 5.1) базового типа не определен.   -  person    schedule 15.11.2016


Ответы (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 как тип при объявлении аргумента, если это возможно/выполнимо.

person Morten Zilmer    schedule 14.11.2016
comment
Могу ли я преобразовать оба массива? Разве они не считаются разными несовместимыми типами? Как я могу сделать обратное преобразование? - person Paebbels; 15.11.2016
comment
QuestaSim показывает эту ошибку: ** Error: (vcom-1583) Illegal type converson from 'work.SortListGenericPkg.ArrayofElementType' to 'work.SortListGenericPkg.ArrayofElementType_Internal' (non-numeric to array). Неизвестно, что первый параметр является массивом. Редактировать: о, это на стороне вызывающего абонента... - person Paebbels; 15.11.2016
comment
Насколько я могу судить, это работает. Но, по крайней мере, мы заметили — при обсуждении проблемы в новом канале VHDL Gitter — что VHDL нуждается в концепции чтобы указать тип параметра типа в универсальных списках пакетов. - person Paebbels; 15.11.2016
comment
Преобразование в обоих направлениях возможно, так как оба типа доступны. Я кратко прочитал канал VHDL Gitter. Возможно, альтернативой может быть неявное преобразование типа в целевой тип. - person Morten Zilmer; 15.11.2016