为什么我不能在一个常量声明中调用一个函数,它在ModelSim的同一个包中定义?

Pae*_*els 3 vhdl 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;
Run Code Online (Sandbox Code Playgroud)

这在VHDL和其他工具中是不允许使用宽松的解析规则,还是ModelSim问题?

Mor*_*mer 8

使用延迟常量,并在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;
Run Code Online (Sandbox Code Playgroud)

处理不同工具似乎不一致,因为您注意到ModelSim需要延迟常量,但Altera Quartus II允许在函数详细说明之前分配常量,因此没有延迟常量.

VHDL-2008标准涵盖了以下方面的子程序阐述:

14.4.2.1概述:......,在制定相应的机构之前调用子程序是违法的.

子程序机构细化的效果描述如下:

14.4.2.2子程序声明,实体和实例:......除了未经实例化的子程序的子程序主体之外,制定子程序主体除了确定机构从那时起可以用于执行子程序的调用.