2012-02-29 58 views
1

我正在開發SystemVerilog監視器,擴展ovm_monitor我想知道如何導入我正在使用的ovm宏。我使用:如何導入SystemVerilog宏?

`ovm_component_utils_begin 
`ovm_field_string 
`ovm_component_utils_end 

我想在我的文件的頂部以下,這兩者並不編譯:

import ovm_pkg::ovm_monitor; 
import ovm_pkg::ovm_macros; 

import ovm_pkg::ovm_monitor; 
`include "ovm_macros.svh" 

VCS編譯錯誤:

Error-[SE] Syntax error 
    Following verilog source has syntax error : 
    "my_monitor.svh", 58 (expanding macro): token is '#' 
    `ovm_component_utils_begin(my_monitor) 
             ^

以下工作,但我認爲它不好的做法,使用*在import語句:

import ovm_pkg::* 
+0

你的編譯錯誤是什麼?導入語句不影響預處理器指令。該工具只需在源代碼之前遇到它們即可。 – 2012-03-01 02:35:32

+1

編譯錯誤發生在編譯器遇到我正在使用的一個ovm宏時,除非我使用'import ovm_pkg :: *' – 2012-03-01 16:36:34

+0

是的,但是編譯錯誤是什麼?你應該在你的問題中包含確切的信息。 – 2012-03-01 20:35:01

回答

2

用*導入實際上是最佳實踐。

使用*導入會使所有包內容可見,但在使用前不會執行實際導入。按名稱導入函數會立即導入無論是否使用的函數(這是次要做法)。

指示OVM或UVM的用戶永遠不要使用「ovm_」前綴定義任何用戶定義的類或宏,因爲未來版本的OVM可能會添加更多的ovm_classes或ovm_macros,因此使用*導入OVM包是安全的。

如果您要導入兩個帶有*的軟件包,並且這兩個軟件包具有相同的函數名稱定義,如果您的代碼不使用該函數,則沒有問題。如果您的代碼確實需要該函數,則使用pkg2 :: function_name作爲函數的前綴,這也是最佳做法。

問候 - 克里夫卡明斯 - Verilog的& SystemVerilog的大師

+0

用*導入是SV的最佳實踐。通常我們應該避免命名空間污染,並且使用*違反這個規則。 SV + UVM有點壞 - 應該使用命名空間區分或命名約定(即'ovm_pkg :: function()'或'ovm_function()')的軟件包,但使用它們只是醜陋! – Chiggs 2013-12-11 12:53:31

+0

噢,對於正確的層次化命名空間,就像我們在Python中一樣! 我提交了一個[VHDL提議](http://www.eda.org/twiki/bin/view.cgi/P1076/HierarchicalNamespaces),或許我們可以更好地理解下一個SystemVerilog標準? – Chiggs 2013-12-11 13:00:24

0

不幸的是,還沒有一個關於做進口ovm_pkg :: *很大的選擇餘地。 OVM並沒有完​​全限定其內部包名的所有名稱,所以如果沒有它,幾乎不可能獲得代碼編譯。

+0

我假設你的意思是這些宏不符合他們的名字。如果包中的代碼沒有,那應該沒關係。我從來沒有注意到,但沒有使用完全合格的名字是相當低劣的。我想知道UVM是否更好。 – 2012-03-02 11:17:53

1

看起來像ovm_component_registry的類定義缺失等等。我不是OVM的真正用戶,但它是廣泛的使用嵌套包含和宏意味着您可能需要查看預處理輸出。

class top extends blah; 



    typedef ovm_component_registry #(top,"top") type_id; 
     ^
    static function type_id get_type(); 
    return type_id::get(); 
    endfunction 

    const static string type_name = "top"; 
    virtual function string get_type_name(); 
    return type_name; 
    endfunction 

    static bit m_fields_checked = 0; 
    function void m_field_automation (ovm_object tmp_data__=null, 
            int what__=0, 
            string str__=""); 
    begin 
    top local_data__; /* Used for copy and compare */ 
    string string_aa_key; /* Used for associative array lookups */ 
    /* Check the fields if not already checked */ 
    if(what__ == OVM_CHECK_FIELDS) begin 
     if(! top::m_fields_checked) 
     top::m_fields_checked=1; 
     else 
     return; 
    end 
    /* Type is verified by ovm_object::compare() */ 
    super.m_field_automation(tmp_data__, what__, str__); 
    if(tmp_data__ != null) 
     /* Allow objects in same hierarchy to be copied/compared */ 
     if(!$cast(local_data__, tmp_data__)) return; 
    if(what__ == OVM_CHECK_FIELDS) begin 
     m_field_array.delete(); 
    end 

    end 
    endfunction(top) 


endclass 
1

這應該是對ADAM12的迴應評論,但我不能添加註釋。

@Victor Lyuboslavsky,如果你不想使用import ovm_pkg::*,你將不得不看宏擴展,或由宏生成的擴展代碼,import必要的標識,例如ovm_component_registry,ovm_object, OVM_CHECK_FIELDS(基於Adam12的回答)。

但是在未來ovm_component_utils_*ovm_field_*宏可能會改變以包括更多的OVM標識符和你將不得不修改代碼然後import這些額外的標識符。