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

问题描述 投票:3回答:2

我有一个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问题?

vhdl modelsim
2个回答
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
投票

另一种方法是通过将以下行插入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
© www.soinside.com 2019 - 2024. All rights reserved.