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 宏,它不调用 getuvm_component_registry 方法。此外,在 get 阶段之前没有 build 方法调用,在此期间我们使用工厂创建必要的类对象。它确实有效,这意味着我们的班级已经注册。问题是——如何?是否有一些隐式的 get 方法调用

解决方法

相反,因为 `uvm_component_utils 宏添加了

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

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

local static this_type me = get();

这无需构造 get() 类即可调用 uvm_component_registry,因为它是该类的特化。您可能想阅读我的 DVCon 论文:Using Parameterized Classes and Factories: The Yin and Yang of Object-Oriented Verification,或观看我关于 SystemVerilog OOP for UVM Verification 的短期课程。在

中详细介绍 UVM 如何实现工厂设计模式