• 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多次(两次以上)操作的时候,是用下一次的覆盖掉还是不覆盖
  • 相关阅读:
    cnpm与npm指定有什么区别?
    Node.js与VUE安装及环境配置之Windows篇
    kafka和rabbitmq对比
    .NET笔记题库(一)
    API网关的用处
    C#问答题与附解收集(三)
    Error Code: 1175
    有时间测试dism
    sublime 3103liense
    weblogic 安装和部署项目(原创)
  • 原文地址:https://www.cnblogs.com/xuqing125/p/16088108.html
Copyright © 2020-2023  润新知