伪代码框架可以参考:https://www.processon.com/view/link/6246bd177d9c080724722a9e
其实UVM factory机制的基本原理非常简单,可以参考之前的一个高级精简的例子来做说明:https://www.cnblogs.com/xuqing125/p/16087807.html
我们以object为例子,进行分析,component其实是完全相似的。
uvm_object_utils(T)对应的宏定义,这其实是我们用户能看到的接口。
- 在从uvm_object类型的class里面扩展一个类(比如说是A)的时候,我们通常会调用uvm_object_utils(T)这个宏。
- 重要的就是uvm_object_registry_internal(T)的实现。
- type_id其实相当于在class A里面又声明了一个class type_id,所以调用uvm_object_registry中的static函数create的时候要用A::type_id::create
- A::get_type()实际上是调用的A::type_id::get()的函数。
class uvm_object_registry
- 两个参数的类型,一个是class的类型,一个是string name;
- local static this_type me=get(),static修饰的变量会在initial之前进行准备好,也就是说只要调用了uvm_object_utils(T)这个宏,uvm_object_registry(T,"T")就会调用get然后register到factory中去。
- 通常my_agent::type_id::creat("i_agent",this),从用户角度来看的话,create函数就是调用的这里的函数。
- 重点的实例化都是在factory里面。
uvm_factory.svh
- 所谓的register到factory中,其实就是对两个关联数据进行赋值。
- 然后后续的create_object_by_type/create_object_by_name都是依据这个关联数组进行查找创建实例的。
- find_override_by_type()是实现override的操作
- create_object(name)其实就是对应实例化的操作。
- m_type_overrides[]这个关联数组至关重要,它存储了override的数据类型。
- find_override_by_type会进行依次迭代寻找。
- set_type_override_by_type()将会对m_type_overrides这个关联数组进行赋值。
- 参数replace的作用是用在对同一个class多次(两次以上)操作的时候,是用下一次的覆盖掉还是不覆盖