2013-02-28 81 views
2

我是SystemVerilog的相對新手。SystemVerilog:使用包與類和虛擬接口

我有一個定義在其中的類A的包。這個類使用虛擬接口,因爲它是測試臺中的驅動程序(BFM),因爲它是 。我正在使用一個包,因此我可以在其他設計中使用相同的BFM。

在我的測試平臺中,我導入A類並傳遞給它一個虛擬接口的實例。 但是,當類中的任務嘗試爲接口中的信號賦值時,我收到編譯錯誤。

我在做什麼錯? 如何使用虛擬接口封裝BFM?

感謝, 冉

+0

這將有助於查看您的代碼和錯誤消息的文本。 – 2013-03-16 01:03:42

回答

5

SystemVerilog的包不能包括實際包內的接口。所以你的界面需要和你一起編譯包源代碼。您定義的類將駐留在包中,而接口定義駐留在模塊所在的全局範圍內。

包內的類可以引用虛擬接口,但除了包源之外,您需要確保接口已編譯並可見。

+0

謝謝,dwikle!所以這意味着在頂層模塊中,我需要在包導入之前放置接口聲明? – 2013-03-01 21:14:14

+0

不客氣。如果這回答了你的問題,你應該通過點擊複選標記來接受它。 – dwikle 2013-03-01 21:15:20

0

嚴格按照規範,我不認爲這是可能的,因爲它增加了一個隱含的外部依賴:包內

項目一般類型定義,任務和 功能。包內的項目不應具有等級 對標識符的引用,除了那些在包內創建的標識或 通過導入其他包可見。軟件包不應將 指向編譯單元範圍中定義的項目。

它沒有提到關於設計元素命名空間的任何內容,這是接口聲明的存在位置,但訪問接口的任何成員都需要分層引用。

除了預處理器指令和import之外,您應該考慮將軟件包完全自包含。

+0

軟件包可能包含通過虛擬接口變量對接口的引用。這正是虛擬接口存在的原因。 – 2013-11-14 04:23:21

+0

@ dave_59,很明顯,它的工作原理可能是有用的,但我無法將其與LRM語句進行協調:「一個包不應引用在編譯單元範圍中定義的項目」。不是在編譯單元範圍中定義的接口嗎? – ScottJ 2015-04-02 05:09:10

+1

否;接口,模塊和包聲明存在於單獨的全局名稱空間中。參見3.13名稱空間。 – 2015-04-02 06:29:17

-1

通常,類聲明在它的使用之前不存在,這可以通過systemverilog typedef定義來解決。例如「A類使用B類」和「B類使用A類」,則使用typedef來解決僵局。

現在,當您帶上述方案的包時,需要確保A類和B類都必須在同一個包中。如果他們不是那麼編譯將不會通過。

作爲SystemVerilog解析器的原因將需要在包解析結束時使用typedef指示的類的定義。這失敗了。

此問題需要注意「typedef不適用於整個包」。

+0

這個問題與一個班級和另一個班級之間的關係無關。它在一個類和一個接口之間。 – 2013-11-14 04:25:43