uvm_report实现中的类图,如下:

      

  1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fatal等方法接口;

  2)uvm_report_message和uvm_report_handle,是一个中介者的角色,实现调用接口和实现的分离;将report信息,

    打包成一个message的对象;并处理各种severity的override;

  3)uvm_report_server,实现该message具体的uvm_action;

  4)uvm_report_catcher,作为访问者,在tb top对某个id,serverity,verbosity的message进行处理,catch或throw;

uvm_report_object中实现了report的调用接口,以及report_handle的变量;

      

    report_object和report_handle是绑定的关系,两者是互相composite的,object_report提供给用户的有两

类function:

    1)info,warning等调用function,其中verbosity在report_object中是被固定住的。

        error----uvm_low;

        fatal-----uvm_none;

           info、warning----uvm_medium;

      report是否被调用,还是要根据handle中的max_verbosity信息来确认的;

    2)对handle中变量的配置;每个report_object中的handle中的信息是不同的,所以区分调用report的component是

      很有必要的,

        所以sequence,默认使用m-sequencer来调用;

        port_base使用port_component来调用;

        其他默认使用uvm_root来调用;

其他的三个function:

    1)report_header,调用uvm_root的function,打印copyright信息;(uvm-root new的时候调用)

    2)report_summary,调用report_server的function,打印统计信息;

    3)die,当UVM_COUNT计数到一定值时,调用finish;

uvm_report_object:最终将report打包为message的格式,并将对象传递给handle;

handle拿到report对象,根据自己内部的override信息,将相应的信息,更新到message中;(就是severity的override信息)

handle中最重要的两个function:

    1)initial,在new的时候,调用,初始化severity对应的默认action,设置默认输出file为0,STDOUT;

      初始化max_verbosity_level为UVM_MEDIUM;

      

    2)process_report_message,将message override处理后,交给server来处理;

几个重要的变量,数组或哈希:

    1)verbosity类;id_verbosities,severity_id_verbosities;

    2)actions类,id_actions,severity_actions,severity_id_actions;

    3)override类,sev_id_override,sev_overrid;

    4)file类;

report_server是一个virtual class,并且定义了pure function,默认使用的都是default_server,并且是singleton实例;

default_report_server,对信息执行相应的action,只有一个最重要的function:

    process_report_message:

      1)首选拿到目前的callback pool,uvm_report_cb中变量;uvm_report_catcher的对象;

      2)对于uvm_action为uvm_log或uvm_display的message,调用compose_message,打包格式;

      3)同一调用execute_report_message 的function;

          1)自加id和severity个数;

          2)uvm_display的message,调用$display function;

          3)uvm_log的message,调用fdisplay函数,需要除去STDOUT;

          4)uvm_count的message,自加quit_counter;

          5)uvm-exit的message,调用die function;

          6)uvm-stop的message,直接调用$stop;(该action,用的比较少)

三个主要的counter和一个变量:

      1)m_quit_counter;

      2)m_severity_counter;

      3)m_id_counter;

      4)m_max_quit_count;

还有一个general的function,report_summarize,打印各个counter的值;先调用catcher的summary;

以上的class中,在实现时,都是没有使用field_automation的,都是自己实现do_copy,do_print函数;

uvm_report_catcher,实现report的callback机制,uvm_pool被定义为uvm_report_cb,uvm_callback被extend为uvm_report_catcher;

核心处理函数,procee_report_catcher,提供接口catch() function来供用户extend,

        返回action_e类型enum------caught,throw,unknow_action;

        在返回值为throw的情况下,report会继续被server处理;

             caught的情况下,report不会继续被server处理;

catcher提供了足够的函数来进行message的删选;

      1)get_client,拿到调用的report_object;

      2)get_severity,拿到message的severity;

      3)get_verbosity,拿到message verbosity信息;

      4)get_id,拿到message id值;

      5)get_action,拿到message对应的action;

      6)get_filename,get_line,拿到对应的文件以及行号;

      相应的函数来进行message属性的修改;

      1)set_client,调用的report_object;

      2)set_severity,message的severity;

      3)set_verbosity,message verbosity信息;

      4)set_id,message id值;

      5)set_action,message对应的action;

在catcher的过程中,统计caught和throw的fatal,error,warning的个数,供summary调用;

相关的macros:

1)分别定义uvm_file和uvm_line是否打印;REPORT_DISBALE_FILE、LINE;

2)`uvm_info、warning、error、fatal;

3)`uvm_info_context、warning、error、fatal,指定了object,不使用当前的object进行调用;

4)`uvm_message_begin,end,不建议直接使用,severity,verbosity需要自己设置;

5)`uvm_message_context_begin,end,同上,区别只是显示调用object的enable_report函数,

6)`uvm_info_begin,end,warning_begin,end,error_begin,end,fatal_begin,end,只是不需要指明severity;

7)指明obejct的info_context_begin等macros;

相应的使用;

1)在vcs或者ius的命令行加+UVM_VERBOSITY=***,通过uvm_root,递归的设置所有comp的verbosity,

      

2)在相应的comp内部直接调用相应的设置verbosity或者其他属性的函数;

      

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

  1. uvm设计分析——field automation

    uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...

  2. uvm设计分析——tlm

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

  3. uvm设计分析——reg

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

  4. uvm设计分析——factory

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

  5. uvm设计分析——callback

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

  6. report源码分析——report_object和report_message

    uvm的report机制,主要涉及uvm_report_object,uvm_report_handle,uvm_report_server这三个类: uvm_report_object主要是提供uv ...

  7. UVM基础之---------Reporting Classes

    Reporting 类提供了一组工具用于格式化报告输出 report机制大概包括四个主要的类uvm_report_object,uvm_report_handler, uvm_report_serve ...

  8. UVM基础之-------uvm report机制的使用

    后面的例子我会继续补充: 1. 因为uvm默认定义的message格式比较长,非常不利于debug过程中的分析使用,一般情况下,开始使用uvm,都要利用uvm_report_server重新定义mes ...

  9. UVM基础之---------uvm report 机制分析

    uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_repor ...

随机推荐

  1. 关于struts中的表单元素- Form bean not specified on mapping for action: "helloa.do"报错

    今天测试struts时仿照书上写了一个小的表单提交代码 <html:form action="helloa.do" method="post"> & ...

  2. js的序列化和反序列化

    (1)序列化 即js中的Object转化为字符串  1.使用toJSONString var last=obj.toJSONString(); //将JSON对象转化为JSON字符 2.使用strin ...

  3. mysql-5.7免安装版本设置

    mysql-5.7.22 免安装版本设置(Windows7) 一.在Mysql官网下载Mysql-5.7.22的ZIP文件  下载链接为:https://dev.mysql.com/downloads ...

  4. kafka相关命令

    查看kafka消费组对应的信息:./kafka-consumer-groups.sh --bootstrap-server 172.17.6.10:9092 --describe --group fr ...

  5. 三、Spring Boot 日志

    1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...

  6. 运行python文件时出错SyntaxError: Non-UTF-8 code starting with '\xb5' in file, but no encoding declared;

    今天ytkah在运行python文件时出现错误,提示如下,很明显这是没有定义python文件编码引起的问题,那么要怎么解决呢?很简单,在文件头部定义一下就可以了. File "hello.p ...

  7. Python递归优化方法

    递归栈溢出 Python的递归调用栈的深度有限制,默认深度为998,可以通过sys.getrecursionlimit()查看. 针对递归栈溢出,我们可以将默认深度设置为大一些,这样不会报错,但是再大 ...

  8. 【CART与GBDT】

    一.CART(分类回归树)    1.思想:     一种采用基尼信息增益作为划分属性的二叉决策树.基尼指数越小,表示纯度越高.  2.回归: 每个节点都有一个预测值,预测值等于属于该节点的所有样例的 ...

  9. 后台返回路由的数组,然后根事先写好的路由比对如果相等就放到一个数组中https://www.cnblogs.com/zhengrunlin/p/8981017.html

    https://www.cnblogs.com/zhengrunlin/p/8981017.html 首先,await fetchPermission()获取后台给的权限数组,格式大概如下 { &qu ...

  10. linux下禁止root远程登录和添加新用户

    https://www.cnblogs.com/jianz/p/7979250.html 一.添加和root权限一样的用户 1. adduser admin passwd  admin (修改密码) ...