factory源码分析——宏定义分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了factory源码分析——宏定义分析相关的知识,希望对你有一定的参考价值。

factory实现的主要目标是可以按字符串创建一个class的实体,overide的功能相当于只是对内部字符串的override。

class的创建有两种方式:

1)在class可见的情况下,直接调用new函数:

      class A

        ........

      endclass

      class B

        A a;

        function new();

          a = new();

        endfunction

      endclass

2)使用参数化的class:

      class parameterized_class #(type T)

        T t;

        function new();

          t = new();

        endfunction

      endclass

      class B;

        parameterized_class#(A) pa;

        function new();

          pa =new();

        endfunction

      endclass

 

uvm_object_defines中提供的三种宏:

1)field类型的,主要实现auto_field的功能;

      技术分享

2)obejct类型的,主要实现factory注册和auto_field的添加;

      技术分享

3)component类型的,主要实现factory注册和auto_field的添加;

      技术分享

 

object_utils中,进行的操作:

1)object_registry_internal(T,T)——type_id的uvm_object_registry类型定义,get_type的static function,get_object_type的function;

2)object_create_func(T)——create function定义;

3)get_type_name_func(T)——type_name的static 类型定义,get_type_name function定义;

4)自动调用field_utils宏;

object_param_utils中,与object_utils类似,但是没有get_type_name_func的定义,因为还不知道type_name的值。

 

component_utils中,进行的操作:

1)component_registry_internal(T,T)——type_id的uvm_object_registry类型定义,get_type的static function,get_object_type的function;

2)get_type_name_func(T)——type_name的static 类型定义,get_type_name function定义;

3)自动调用field_utils宏;

component_param_utils中,与component_utils类似,但是没有get_type_name_func的定义,因为还不知道type_name的值。

 

component从uvm_report_object类型继承而来;

以上两个utils中都有相应type_id的参数class定义,可以直接调用其内部static的function;

 

field_utils中,主要实现对一些数据db的处理函数;这些函数定义在uvm_object中,所以object和component都可以调用。

      技术分享

field_utils包括两个参数,ARG和FLAG,ARG是class中的一个变量,FLAG是一些flag setting

ARG的类型,表示field_utils中的类型种类:

      uvm_field_int,uvm_field_enum,uvm_field_queue_int,object,string等

FLAG的类型,表示具体的操作:

      uvm_all_on,uvm_default,uvm_nocopy,nocompare,noprint

                    nopack,physical,abstract,reference

                    readonly

flag之间支持直接位逻辑运算。uvm_default目前与uvm_all_on等同;

               uvm_reference表示,不进行deep_copy,直接copy handle;

               uvm_readonly表示,不支持在build过程中的set操作,

               physical setting和abstract setting目前不清楚

               在print和record的时候,可以选择进制,直接进行或运算,UVM_BIN/DEC/OCT/HEX/STRING

component不允许使用field_object宏,如果要使用,只能使用uvm_reference,简而言之,component不支持deep copy

 

以上是关于factory源码分析——宏定义分析的主要内容,如果未能解决你的问题,请参考以下文章

factory源码分析——uvm_default_factory

#yyds干货盘点#自定义spring boot starter三部曲之三:源码分析spring.factories加载过程

wxWidgets源码分析 - App启动过程

SDK源码分析 2

spring boot 2.0 源码分析

5.2.3.最简单的模块源码分析2