为什么我不能在与受保护类型相同的包中声明共享变量?

Why can't I declare a shared variable in the same package as the protected type?

我有一个模拟助手保护类型,它是在包中声明的。该类型的实例在同一个包中定义。该代码被 GHDL 接受,但不被 ModelSim 接受。

是否符合标准?

如何编写解决方法?

** Error (suppressible): D:\...\simulation.v08.vhdl(143): (vcom-1257) Shared variable "globalSimStatus" of protected type "T_SIM" cannot be declared before the protected type body.

我的(简化的)包示例:

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 想知道类型的大小,在解析所有成员之前这是未知的。

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

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

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

-allowProtectedBeforeBody

这是我用的work-around。