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

时间:2015-04-21 05:59:29

标签: 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;

VHDL和其他工具是否允许使用宽松的解析规则,或者是ModelSim问题?

2 个答案:

答案 0 :(得分:7)

使用延迟常量,并在详细阐述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子程序声明,实体和实例:......除了未经实例化的子程序的子程序主体之外,制定一个子程序主体除了确定该机构从那时起可以用于执行调用   子程序。

答案 1 :(得分:-1)

另一种方法是通过将以下几行插入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