首页 > 解决方案 > uvm_component 是如何在 uvm_factory 中注册的?

问题描述

我最近开始研究 UVM,并且在理解工厂的组件/对象注册过程时遇到了一些困难。具体来说,我找不到实际注册的代码行。


这是我的思考/搜索过程:

  1. 我发现uvm_factory该类有一个register注册给定类型的代理对象的方法

  2. 此代理对象属于uvm_component_registry使用最初所需组件/对象的类型参数化的类

  3. 类内部uvm_component_registry有一个get方法,它创建代理对象并通过调用me将其注册到工厂factory.register(me)

  4. 在 UVM Cookbook 中,它说每个 uvm_component 都应该使用uvm_component_utils宏向工厂注册,该宏扩展为以下代码片段:

    typedef uvm_component_registry #(T,`"S`") type_id;
    
    static function type_id get_type();
      return type_id::get();
    endfunction
    
    virtual function uvm_object_wrapper get_object_type();
      return type_id::get();
    endfunction
    
    virtual function string get_type_name ();
      return type_name;
    endfunction 
    

所以,在这里我找到了问题的根源。在从类扩展的用户类中,uvm_component我们只有uvm_component_utils宏,它不get调用uvm_component_registry. 在我们使用工厂创建必要的类对象的阶段之前,也没有get方法调用。build它确实有效,这意味着我们的班级已经注册。问题是——如何?是否有一些隐式get方法调用?

标签: system-veriloguvm

解决方案


相反,因为`uvm_component_utils宏添加

typedef uvm_component_registry #(T,`"S`") type_id;

该参数化类有一个带有声明初始化的静态变量

local static this_type me = get();

这个调用get()不需要构造uvm_component_registry类,因为它是类的特化。您可能想阅读我的 DVCon 论文:使用参数化的类和工厂:面向对象验证的阴阳,或观看我的SystemVerilog OOP for UVM 验证短期课程。中实现工厂设计模式


推荐阅读