1

ovm_monitorを拡張するSystemVerilogモニターを開発していますが、使用しているovmマクロをインポートする方法を知りたいです。使ってます:

`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::*
4

4 に答える 4

3

*を使用したインポートは、実際にはベストプラクティスです。

*を使用してインポートすると、すべてのパッケージコンテンツが表示されますが、使用されるまで実際のインポートは行われません。関数を名前でインポートすると、使用されているかどうかに関係なく、関数がすぐにインポートされます(これは劣った方法です)。

OVMまたはUVMのユーザーは、「ovm_」プレフィックスを使用してユーザー定義のクラスまたはマクロを定義しないように指示されます。これは、OVMの将来のバージョンでovm_classesまたは `ovm_macrosが追加される可能性があるため、*を使用してOVMパッケージをインポートするのが安全です。

*を使用して2つのパッケージをインポートし、両方のパッケージに同じ関数名が定義されている場合、コードで関数を使用していなくても問題はありません。コードで関数が必要な場合は、関数の前にpkg2::function_nameを付けます。これもベストプラクティスです。

よろしく-CliffCummings-Verilog&SystemVerilog Guru

于 2012-06-27T21:40:17.657 に答える
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
于 2012-03-02T18:25:21.457 に答える
1

これはAdam12の応答に対するコメントであるはずですが、コメントを追加することはできません。

@Victor Lyuboslavsky、使用したくない場合はimport ovm_pkg::*、マクロ展開、またはマクロによって生成された展開コード、およびimport必要な識別子(Adam12ovm_component_registryの回答ovm_objectOVM_CHECK_FIELDS基づく)を確認する必要があります。

ただし、将来的には、ovm_component_utils_*またはovm_field_*マクロが変更されてより多くのOVM識別子が含まれる可能性があり、コードを変更してからimportこれらの追加の識別子に変更する必要があります。

于 2013-05-17T10:03:25.427 に答える
0

残念ながら、インポートovm_pkg::*を実行することについては多くの選択肢がありません。OVMは、内部ですべての名前をパッケージ名で完全に修飾するわけではないため、OVMなしでコードをコンパイルすることはほとんど不可能です。

于 2012-03-01T02:28:39.990 に答える