如何导入SystemVerilog宏?

时间:2012-02-29 16:44:35

标签: verilog system-verilog

我正在开发一个扩展 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 个答案:

答案 0 :(得分:2)

使用*导入实际上是最佳做法。

使用*导入会使所有包内容可见,但在使用之前不会执行实际导入。按名称导入函数会立即导入函数,无论是否使用(这是次要的做法)。

OVM或UVM的用户被指示永远不要使用“ovm_”前缀定义任何用户定义的类或宏,因为未来版本的OVM可能会添加更多ovm_classes或`ovm_macros,因此使用*导入OVM包是安全的。

如果要使用*导入两个包,并且如果两个包都定义了相同的函数名,那么如果您的代码不使用该函数,则没有问题。如果您的代码确实需要该函数,请在函数前加上pkg2 :: function_name,这也是最佳做法。

问候 - Cliff Cummings - Verilog& SystemVerilog Guru

答案 1 :(得分: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

答案 2 :(得分:1)

这应该是对Adam12的回复的评论,但我无法添加评论。

@Victor Lyuboslavsky,如果您不想使用import ovm_pkg::*,则必须查看宏扩展或宏生成的扩展代码,以及import必要的标识符,例如ovm_component_registryovm_objectOVM_CHECK_FIELDS(根据Adam12的回答)。

但是,将来ovm_component_utils_*ovm_field_*宏可能会更改为包含更多OVM标识符,您必须修改代码,然后再import这些附加标识符。

答案 3 :(得分:0)

不幸的是,做导入ovm_pkg :: *没有太多选择。 OVM没有完全限定其内部包名的所有名称,因此几乎不可能在没有它的情况下编译代码。