我正在开发一个扩展 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::*
答案 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_registry
,ovm_object
,OVM_CHECK_FIELDS
(根据Adam12的回答)。
但是,将来ovm_component_utils_*
或ovm_field_*
宏可能会更改为包含更多OVM标识符,您必须修改代码,然后再import
这些附加标识符。
答案 3 :(得分:0)
不幸的是,做导入ovm_pkg :: *没有太多选择。 OVM没有完全限定其内部包名的所有名称,因此几乎不可能在没有它的情况下编译代码。