uvm 工厂机制3问

发布时间 2023-09-25 10:43:44作者: 下夕阳

UVM工厂机制3问

1、注册在干啥

注册时添加的uvm_object_utils(class_name)或者uvm_component_utils(class_name)展开后有一条m_uvm_object_registry_internal的宏,这个宏定义了一个uvm_object_registry #(T,Tname)的类型type_id。

img

定义了这个类型,那么在代码编译的时候就要编译uvm_object_registry#(T,Tname)这个类,在执行的时候,会提给static类型的变量赋值,由于this_type me这个变量是static的,所以程序运行的时候一上来就会执行后面的get()函数,get函数里边通过单例模式,对uvm_object_registery#(T,Tname)类型进行了注册。

img

uvm_component_registry和uvm_object_registry都是继承至uvm_object_wrapper。

img

在调用factory.register(uvm_object_wrapper obj)时,会把uvm_component_registry #(T,Tname)实例,添加到m_type_name[string]的关联数组表中。

img
img

当然这个过程中还添加了其他表,但主要是把uvm_component_register #(T,Tname),uvm_object_registry #(T,Tame)以父类uvm_object_wrapper的形式添加到了m_type_names表中。

2、run_test()/run_test("xxx")/xxx::type_id::create()是如何例化的

run_test

run_test()与run_test("xxx")的区别就是run_test()需要使用$value$plusargs()系统函数来获取命令行中UVM_TESTNAME的值作为test_name。

有了test_name,就调用create_component_by_name例化test_name对应的类型。

img

在create_component_by_name中调用find_override_by_name函数,通过test_name的名字查表(注册的时候将uvm_component_registry#(T,Tname)以uvm_object_wrapper[class_name]的形式存在m_type_names表中)得到uvm_object_wrapper的对象。

img

有了uvm_object_wrapper对象(其实子类是uvm_object_register#(T,Tname)或者uvm_component_register#(T,Tname))就可以调用uvm_object_wrapper #(T,Tname)的create_object()或者create_componet()产生需要的实例。因为uvm_object_register#(T,Tname)或者uvm_component_register#(T,Tname)类保存了注册类的类型T,所以可以通过new的方式例化注册类T。
img

create()

与2类似,都是查表得到uvm_object_wrapper对象,然后调用uvm_object_wrapper对象的create_component函数,生成实例

img

3、override是如何生效的

set_type_overrride_by_name()
set_type_override_by_type()
set_inst_override_by_name()
set_inst_override_by_type()

都是修改了uvm_factory中的表,然后在根据名字或者类型例化的对象的时候,通过find_override_by_type函数查表,选择最后override的uvm_object_wrapper对象返回,最后调用返回的uvm_object_wrapper对象例化对象。

注意:调用这4个overrider函数都是在build_phase或者build_phase之前调用否则,要overrride的类型对象都例化出来了再override就没有用了,如果在build_phase中override必须要注意,只能在树的高节点往低节点override,应为build_phase是自上而下执行的,由于test_case是最高的节点,在test_case中override下面任何一个类型都能生效,当然如果要override test_case中要例化的类型,要在例化之前override。