2016-01-20 86 views
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想知道是什么类型的大小,直到所有成员都分析这是个未知数。

+0

你犯了一个基本罪,没有提供mcve或实际的(和完整的)错误信息。例如IEEE Std 1076-2008 4.7软件包声明,第8段“对于出现在子程序主体,进程语句或受保护类型主体中的软件包声明,如果软件包声明部分的变量声明是错误的包声明会声明一个共享变量,而且,如果信号声明,断开连接规范或PSL声明显示为这种包声明的包声明项,则是错误的。“这个软件包在哪里申报? – user1155120

+0

为此我在一个单独的包中使用受保护的类型。这不值得与之战斗。也许一个允许获取和设置对象的通用包会很方便 - 但是,我避免了OSVVM中的通用包,因为它们处于工具支持的最前沿。也许一个单独的标量和向量作为向量需要使用指针而不是固定大小的对象。在OSVVM中,我仍然使用常规软件包。请参阅NamePkg。另请参阅其中PT和共享变量位于程序包主体中的AlertLogPkg。 –

+0

我应该补充说,我在包中使用的大部分共享变量都是本地包(在包体中声明)。 –

回答

2

Modelsim 6.3b或更高版本不再允许在受保护主体之前声明受保护类型的共享变量。

您的解决方法和Jim建议的解决方法是一种选择:为您的共享变量创建另一个包。

另一种解决方案是将误差抑制到使用的ModelSim开关警告:

-allowProtectedBeforeBody

这是变通,我使用。

相关问题