uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数,

    实现方式分为两种:1)用户注册,field系列宏;uvm内部调用static status container中的function;

                2)用户自己实现do_copy,do_print等函数,调用static printer内的函数;

      

uvm_object中实现了print,sprint等函数,实现调度接口,调度status_container和do_function;

            status_container中的function在进行filed注册的时候,被实现出来;

            do_print等函数,留下对用户的hook;

            不调用filed macros的class,需要在自己内部实现;

这样所有的extend的class,都包含这些general的一些function;

comparer等class中具体实现了针对不同类型的filed的操作;int,string,object,time等;

status_container,在object内部是一个static变量,内部包含comparer,printer等class的变量,所以可以在prj 任何class调用;

          从而可以在用户进行filed macros register的时候,实现filed function;

总之,print等函数,实现都在相应的printer实现,但是调用分为了两种,用户自己实现do_function,或者调用field macros;

printer的实现:

    内部实现了cfg与function的颗粒度分解,knobs中定义了很多打印选型,mcd表示打印输出STDOUT等;

                                     object depths,是否打印所有的children,默认都是打开的;

                                     object callback,打印object之前对header或者footer调用自定义函数;

                                     type_name,prefix,field_size,决定是否打印这些附加信息;

                      function中,定义了各个类型的print实现;      

        

knobs并没有被extend,printer被extend了三个,基本的print function不变,只是更新了omit函数,规定了自己的格式;

    默认的printer,为table_printer,在uvm内部被显示的new之后,typedef为default printer;

    三种printer,之间可以相互重载,单独封装,相互替代,这种在设计模式中,也被称为strategy,或policy;

一个最重要的变量:

    1)uvm_printer_row_info  m_rows[$],结构体类型,内部包含:level,name,type_name,size,value信息;

      每次调用各个print_int等函数,都会将信息,push_back到该queue中;

一个最重要的function:

    2)emit函数,返回值string,首先打印格式,其次遍历m_row,更新自己的返回值

      被uvm_object的print函数调用;

comparer的实现:

    comparer更加简单一些,config的变量更少,所以直接做在一个class中,比较之后,主要需要选择性打印信息;

    config:policy,默认都是default的,reference,表示只比较指针;

                     uvm_deep,表示uvm的deep_copy的方式进行比较;

                     uvm_shallow,表示sv默认的copy方式进行比较,class内的class直接copy指针;

         show_max,verbosity,severity,表示report时的配置;默认使用uvm_root的report调用;

         check_type,在compare object的时候,来表示是否要比较object的类型,还是只需要值相同,默认打开;

      

record和pack不在描述;

copy更加简单,没有相应的控制器来实现,直接调用field_automation和do_copy函数;

    field_automation实现时,会区分UVM_COPY和UVM_REFERENCE,reference,直接指针赋值;

                                     no_reference,进行clone操作;

        其中的clone函数,调用的是create函数,做创建;所有的object都必须重载该函数;

还有set_xx_local的操作,可以直接调用相应函数,set local var的值;函数定义在uvm_object,调用在field_automation;

相应的macros:

    uvm_field_utils_begin(T):function __M_uvm_field_automation的定义;

    uvm_field_utils_end:endfunction __m_uvm_field_automation的结束定义;

    uvm_field_xx_xx(ARG,FLAG):根据uvm_action,定义case...endcase来实现copy,print,compare等函数,调用相应comparer等;

  uvm automation的action包括:

      

应用:在class中不做field的宏调用,显示定义自己的do_function:

      

uvm设计分析——field automation的更多相关文章

  1. uvm设计分析——reg

    项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...

  2. uvm设计分析——factory

    uvm的factory机制,通过实例一个static类型default factory,并且通过宏将所有例化extend出来的object,component register到该factory的内部 ...

  3. uvm设计分析——tlm

    tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...

  4. uvm设计分析——callback

    uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...

  5. uvm设计分析——report

    uvm_report实现中的类图,如下: 1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fata ...

  6. (转)UVM挑战及概述

    UVM的调度也具有其独特的挑战,尤其是在调试的领域.其中的一些挑战如下: 1. Phase的管理:objections and synchronization 2. 线程调试 3. Tracing i ...

  7. UVM挑战及概述

    UVM的调度也具有其独特的挑战,尤其是在调试的领域.其中的一些挑战如下: 1. Phase的管理:objections and synchronization 2. 线程调试 3. Tracing i ...

  8. (转)UVM内容梗概

    1. 类: 面向对象基础传统的面向对象编程与systemverilog类的特点,类的定义,成员与方法,构造函数,对象的复制和深/浅拷贝,父类/子类关系,类的继承,作用域的规则,对象的句柄以及赋值,方法 ...

  9. 深入浅出Automation Anywhere

    Automation Anywhere是基于CLIENT-SERVER架构(control room和客户端),客户端主要是Bot Creator 和 BotRunner 主要构成: 1.WEBCR: ...

随机推荐

  1. linux fix the superblock by dumpe2fs fsck

    It seems that you have a bad superblock. To fix this: Firstly, boot into a live CD or USB Find out y ...

  2. [development][vim] vim显示空白字符

    1. 作为一个严谨的程序员,你必须关心你敲下过的没一个字符.其中包括空白字符. 2. 有时候你需要review别人的代码,对于哪些肆意使用tab,space,enter的人.你怎么发现那些被他们留下的 ...

  3. AndroidStudio_Button

    这里回顾一下Button的使用方法: 1.在page1.xml文件中定义一个按钮控件 <Button android:id="@+id/btn_textview" andro ...

  4. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...

  5. 【PyQt5-Qt Designer】制作炫酷的启动界面+进度条

    QProgressBar 进度条+QSplashScreen 启动界面 知识点: 1.进度条 #将进度条的最大值.最小值设置为相同时,产生跑马灯效果 self.progressBar.setMinim ...

  6. django时间的时区问题(转)

    add by zhj: 使用django时,如果设置USE_TZ=True,那django在数据库中存储的是0时区的时间:如果USE_TZ=False,那存储的是本地时间 原文:https://www ...

  7. caffe matlab接口编译遇到的问题记录

    今天编译的过程中遇到的问题以及查阅到的资料,记录在这里,希望可以帮到其他人. BVLC的caffe源码,如果要编译matlab的接口时,首先需要将makefile.config文件中的matlab的安 ...

  8. Verilog如何从外部更改模块内参数

    例如有一个模块 module x(a,b,c); input a,b; output c; 'd0, h=9'd3; ...... endmodule 两种解决方法: 1.使用带有参数值的模块实例语句 ...

  9. Python3学习之路~4.4 软件目录结构规范

    为什么要设计好目录结构? 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织 ...

  10. vs2005新建项目中没有ASP.NET WEB应用程序

    今天正准备使用vs 2005,发现根本打不开老师发过来的源代码Portal_Article.csproj文件,上网查了一下,好多人都说是是因为没有给vs 2005打补丁.我的新建项目里根本没有ASP. ...