Почему я не могу вызвать функцию в объявлении константы, которая определена в том же пакете в ModelSim?

У меня есть пакет VHDL, который определяет функцию (упреждающее объявление) и константу. Значение константы вычисляется той функцией, тело которой находится в теле пакета.

На данный момент ModelSim/QuestaSim — единственный инструмент, которому не нравится этот код. Ему нужно 2 пакета, чтобы тело было проанализировано до объявления константы.

package test is
  function mytest(param : boolean ) return boolean;

  constant value : boolean := mytest(TRUE);
end package;

package body test is
  function mytest(param : boolean ) return boolean is
  begin
    return not param;
  end function;
end package body;

Разве это не разрешено в VHDL и других инструментах, использующих упрощенные правила синтаксического анализа, или это проблема ModelSim?


person Paebbels    schedule 21.04.2015    source источник


Ответы (2)


С отложенной константой и назначением в теле пакета после разработки функции mytest это возможно даже в ModelSim:

package test is
  function mytest(param : boolean ) return boolean;
  constant value : boolean;
end package;

package body test is
  function mytest(param : boolean ) return boolean is
  begin
    return not param;
  end function;
  constant value : boolean := mytest(TRUE);
end package body;

Обработка в разных инструментах кажется непоследовательной, поскольку, как вы заметили, ModelSim требует отложенной константы, но Altera Quartus II позволяет назначать константу до разработки функции, то есть без отложенной константы.

Стандарты VHDL-2008 охватывают разработку подпрограмм в:

14.4.2.1 Общие положения: ... недопустимо вызывать подпрограмму до того, как будет разработано ее соответствующее тело.

Эффект от уточнения тела подпрограммы описан в:

14.4.2.2 Объявления, тела и экземпляры подпрограмм: ... Разработка тела подпрограммы, кроме тела подпрограммы неэкземплярной подпрограммы, не имеет никакого эффекта, кроме как установить, что тело может с этого момента использоваться для выполнение вызовов подпрограммы.

person Morten Zilmer    schedule 21.04.2015
comment
Таким образом, значение по-прежнему глобально доступно другим объектам или пакетам с помощью use mylib.test.value; ? - person Paebbels; 21.04.2015
comment
Да, после уточнения package и package body константа value может использоваться как любая другая константа из пакета. - person Morten Zilmer; 21.04.2015

Альтернативный способ — подавить это предупреждение, вставив следующие строки в файл modelsim.ini:

[msg_system]
; Downgrade the following error:
; Error (suppressible): (vcom-1594) Cannot call subprogram before it is elaborated.
; See more on: https://stackoverflow.com/a/29764446/2506522
warning = 1594
person betontalpfa    schedule 26.02.2019