我有一个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问题?
使用延迟常量,并在详细说明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子程序声明,实体和实例:......除了未经实例化的子程序的子程序主体之外,制定子程序主体除了确定机构从那时起可以用于执行子程序的调用。
另一种方法是通过将以下行插入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