Vhdl 为什么可以';我是否在与受保护类型相同的包中声明共享变量?

Vhdl 为什么可以';我是否在与受保护类型相同的包中声明共享变量?,vhdl,modelsim,Vhdl,Modelsim,我有一个simulation helper保护的类型,它在包中声明。该类型的实例在同一个包中定义。GHDL接受该代码,但ModelSim不接受该代码 符合标准吗? 和 如何编写解决方案? **错误(可抑制):D:\…\simulation.v08.vhdl(143):(vcom-1257)无法在受保护类型正文之前声明受保护类型“T\U SIM”的共享变量“globalSimStatus” 我的(简化)包示例: package simulation is type T_SIM is prote

我有一个simulation helper保护的类型,它在包中声明。该类型的实例在同一个包中定义。GHDL接受该代码,但ModelSim不接受该代码

符合标准吗?

如何编写解决方案?

**错误(可抑制):D:\…\simulation.v08.vhdl(143):(vcom-1257)无法在受保护类型正文之前声明受保护类型“T\U SIM”的共享变量“globalSimStatus”

我的(简化)包示例:

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个包

有更好的解决方案吗



我假设QuestaSim想知道类型的大小,在解析所有成员之前是未知的。

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

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

另一种解决方案是使用modelsim开关将错误抑制为警告:

-allowProtectedBeforeBody


这是我使用的工作环境

您犯了一个大罪,没有提供mcve或实际(和完整)错误消息。例如,IEEE Std 1076-2008 4.7包声明,第8段对于出现在子程序体、流程语句或受保护类型体中的包声明,如果包声明的包声明性部分中的变量声明声明了共享变量,则为错误。此外,如果信号声明、断开规范或PSL声明作为此类包声明的包声明项出现,则是错误的。“此包在哪里声明?我在单独的包中为此使用受保护类型。不值得与之战斗。也许一个允许获取和设置对象的通用包会很方便——但是,我在OSVVM中避免使用通用包,因为它们处于工具支持的前沿。也许标量和向量需要单独的一个,因为向量需要使用指针,而不是固定大小的对象。在OSVVM中,我仍然使用常规软件包。见NamePkg。另请参阅AlertLogPkg,其中PT和共享变量位于包体中。我应该补充一点,我在包中使用的大多数共享变量都是包本地的(在包体中声明)。此包在包中声明。QuestaSim在执行时投诉
vcom
。我的手机上没有完整的错误信息,但我会在明天插入。这个软件包在我的测试台上使用。我已经做了部分分析。范围和可见性规则说它是合法的,详细说明也是如此。