UVM入门进阶1
创建对象的四种方法
class trans extends uvm_object
...
endclass
class top extends uvm_test//uvm_test继承于uvm_component
...
endclass
class object_create extends top;
trans t1,t2,t3,t4;
`uvm_component_utils(object_create)
function new(string = "objecte_create",uvm_component_parent = this);//一般用this,如果是null,则表示uvm_top
super.new(name,parent);
endfunction
function void build_phase(uvm_phase phase);
uvm_factory f = uvm_factory::get();//get singleton factory,如果后面需要用工厂来创建对象就要写这句代码
super.build_phase(phase);
t1 = new("t1");//sv中的方式
t2 = trans::type_id::create("t2",this); //以后经常用的
void'($cast(t3,f.create_object_by_type(trans::get_type(),get_full_name(),"t3")));//利用factory创建
void'($cast(t4,create_object("trans","t4")));//利用uvm_component创建
endfunction
endclass
1.使用new函数进行创建
t1 = new();
2.使用type_id进行创建
创建uvm_component对象
comp_type::type_id::create(string name, uvm_component parent)
创建uvm_object对象
object_type::type_id::create(string name)
3.使用factory创建
uvm1.2中提供的原型
pure virtual function
uvm_object create_object_by_type (uvm_object_wrapper requested_type,
string parent_inst_path="",
string name="");
pure virtual function
uvm_component create_component_by_type (uvm_object_wrapper requested_type,
string parent_inst_path="",
string name,
uvm_component parent);
pure virtual function
uvm_object create_object_by_name (string requested_type_name,
string parent_inst_path="",
string name="");
uvm_object_wrapper requested_type:用于表示对象类型
string parent_inst_path:父节点路径(object不需要)
string name:表示对象的句柄名
uvm_component parent:表示父节点句柄
string requested_type_name:表示类名
直接使用factory方法创建,注意要用全局唯一uvm_factory类对象factory调用上述方法,并且上述方法返回类型不是uvm_object就是uvm_component,所以要用$cast作类型转换。(t3为使用范例)
4.使用uvm_component方法创建
uvm1.2中提供的原型
extern function uvm_component create_component (string requested_type_name,string name);
extern function uvm_object create_object (string requested_type_name,string name="");
使用方法如t4,注意返回的函数类型是object类还是component类
一些常见的函数含义:
在工厂注册机制下,get_type_name(),get_name()
在component组件类和object基类中的返回值是一样的,而get_full_name()
在不同类型的类中,会有不同的返回值。
get_type():
返回类型是uvm_object_wrapper
,其为某一个类在工厂中注册时的句柄
uvm_object_wrapper requested_type
其为某一个类在工厂中注册时的句柄
get_type_name():
返回对象的class名,字符串类型
get_name():
返回创建对象时,传入的字符串
get_full_name():
在component类会返回当前component组件的完整路径,从uvm_test_top开始。在object类的返回值与get_name()一样,因为object类不是作为UVM树节点的,所以路径没有别的层次。
static function void set_type_override(uvm_object_wrapper override_type,bit replace=1);
代码中uvm_object_wrapper override_type
并不是某一个具体实例的句柄,实际上是注册过后某一个类在工厂中注册时的句柄。使用new_type::get_type()
可以找到
实验中遇到的一些函数
do_compare
virtual function bit do_compare (uvm_object rhs,uvm_comparer comparer)
A derived class should override this method to include its fields in a compare operation.
do_compare
是用户自定义的compare的回调函数。如果比较成功返回1,比较失败返回0.
典型用法:
class mytype extends uvm_object;
...
int f1;
virtual function bit do_compare (uvm_object rhs,uvm_comparer comparer);
mytype rhs_;
do_compare = super.do_compare(rhs,comparer);
$cast(rhs_,rhs);
do_compare &= comparer.compare_field_int("f1", f1, rhs_.f1);
endfunction
endclass
uvm_default_comparer.show_max=num
设置显示比较时的最大错误数
function bit do_compare(uvm_object rhs,uvm_comparer comparer);
uvm_object rhs:
右侧的,指的是在使用compare函数进行比较时右边的那个
uvm_comparer comparer:
表示比较时采用的比较器
注:在使用回调函数时,一般要添加void'($cast(rhs_,rhs))来对句柄类型进行转换
消息打印函数
uvm_info("MYINFO1", $sformatf("val: %0d", val), UVM_LOW)
uvm_warning("MYWARN1", "This is a warning")
uvm_error("MYERR", "This is an error")
uvm_fatal("MYFATAL", "A fatal error has occurred")
phase机制
config机制
消息管理
set_report_id_verbosity_hier("ID",verbosity);//可以指定ID进行余度过滤
uvm_root::get().set_report_id_verbosity_hier("ID",verbosity);/可以从顶层对ID进行过滤
标签:UVM,入门,object,component,name,uvm,type,string,进阶
From: https://www.cnblogs.com/jssblog/p/17556176.html