UVM factory机制相关的源码解析

伪代码框架可以参考: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多次(两次以上)操作的时候,是用下一次的覆盖掉还是不覆盖
posted on 2022-04-01 17:34  猪肉白菜_125  阅读(371)  评论(0编辑  收藏  举报