3
我有一个模拟助手保护类型,它是在包中声明的。该类型的实例在相同的包中定义。代码由GHDL提供,但不由ModelSim提供。为什么我不能在保护类型的同一个包中声明一个共享变量?
它是否符合标准?
和
如何写一个解决方法?
**错误(抑制性):d:\ ... \ simulation.v08.vhdl(143):(VCOM-1257)共享变量 “globalSimStatus” 受保护类型 “T_SIM” 不能被之前声明受保护的类型主体。
我的(降低的)封装例如:
package simulation is
type T_SIM is protected
procedure stop;
end protected;
shared variable globalSimStatus : T_SIM;
-- QuestaSim 10.4c complains that a shared variable can not be declared, before the type's body was parsed.
end package;
package body simulation is
type T_SIM is protected body
variable IsStopped : BOOLEAN := FALSE;
procedure stop is
begin
IsStopped := TRUE;
end procedure;
end protected body;
-- This is OK but not global
shared variable localSimStatus : T_SIM;
end package body;
一种解决方案可以是定义2包:一个在它的类型和一个与该共享变量。
缺点是找到第二包名和导入(使用)2包在测试平台...
有没有更好的办法呢?
我认为QuestaSim想知道是什么类型的大小,直到所有成员都分析这是个未知数。
你犯了一个基本罪,没有提供mcve或实际的(和完整的)错误信息。例如IEEE Std 1076-2008 4.7软件包声明,第8段“对于出现在子程序主体,进程语句或受保护类型主体中的软件包声明,如果软件包声明部分的变量声明是错误的包声明会声明一个共享变量,而且,如果信号声明,断开连接规范或PSL声明显示为这种包声明的包声明项,则是错误的。“这个软件包在哪里申报? – user1155120
为此我在一个单独的包中使用受保护的类型。这不值得与之战斗。也许一个允许获取和设置对象的通用包会很方便 - 但是,我避免了OSVVM中的通用包,因为它们处于工具支持的最前沿。也许一个单独的标量和向量作为向量需要使用指针而不是固定大小的对象。在OSVVM中,我仍然使用常规软件包。请参阅NamePkg。另请参阅其中PT和共享变量位于程序包主体中的AlertLogPkg。 –
我应该补充说,我在包中使用的大部分共享变量都是本地包(在包体中声明)。 –