2016-01-20 18 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

這是變通,我使用。

相關問題