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

后面的例子我会继续补充:

1. 因为uvm默认定义的message格式比较长,非常不利于debug过程中的分析使用,一般情况下,开始使用uvm,都要利用uvm_report_server重新定义message输出的格式。下面给出一个例子:用于将name和ID限定在同一个width。

class my_report_server extends uvm_report_server;

int name_width = 20;

int id_width   = 20;

function string pad(string s, int width);

if ( s.len() == width )

return s;

// s is short. Pad at the end.

if ( s.len() < width )

return {s, {(width - s.len()){" "}}};

else

// s is too long. truncate.

return s.substr(s.len()-width, s.len()-1);

endfunction

function string compose_message(

uvm_severity severity,

string name,

string id,

string message,

string filename,

int    line

);

// Make the width be exactly name_width

// and id_width.

name = pad(name, name_width);

id   = pad(id,     id_width);

return super.compose_message(

severity, name, id, message, filename, line);

endfunction

endclass

前面文章中讲过,uvm_report_server类在整个环境中是一个单态类,所以在uvm_test层用set_server将继承的类替换原来的uvm_report_server类就可以了

class test extends uvm_test;

// Make my report server.

begin

my_report_server my_report_server_inst;

my_report_server_inst = new();

// Configure.

my_report_server_inst.name_width = 28;

my_report_server_inst.id_width   = 20;

// Set.

uvm_report_server::set_server(

my_report_server_inst);

end

2. 使用catcher对一些message执行CATCH或者THROW的操作:

class my_report_catcher

extends uvm_report_catcher;

string            id;

string            filename;

string            name;

string            message;

int               line;

int               verbosity;

uvm_severity      severity;

uvm_report_object client;

function new(string name = "my_report_catcher");

super.new(name);

endfunction

function action_e catch();

uvm_severity_type usv;

id              = get_id();

filename        = get_fname();

line            = get_line();

severity        = get_severity();

verbosity       = get_verbosity();

message         = get_message();

client          = get_client();

name            = client.get_full_name();

usv = uvm_severity_type‘(severity);

// Process this message.

// Decide THROW or CATCH.

...

return THROW;

endfunction

endclass

class test extends uvm_test;

...

my_report_catcher my_report_catcher_inst;

my_report_catcher_inst =

new("my_report_catcher_inst");

uvm_report_cb::add(null,

my_report_catcher_inst, UVM_APPEND);

3. 通过ID实现对message的精细控制,这部分内容在前面代码中有介绍,这里不展开在说的还有另一方面原因,我们在debug的时候通常希望log尽量的完全,因此不推荐使用ID去过滤message,也不推荐将log根据ID打印到不同的file当中,因为这两种做法,一种限制的log的完整性,有可能缺失我们需要的关键的信息,而另一种则是因为message的打印一般是按照时间顺序进行,将log打印到不同的file,将破坏这种前后时间关系,不利于进行debug。因此比较推荐的方式是,尽量将所有的message打印到一个文件,然后通过脚本,从这个文件中根据ID提取你需要debug信息。

这里面有个原则,是别人跟我说的,我觉得非常有道理:当你在debug一个问题的时候,trace的很长世间才找到问题发生的点(TB 或者DUT的原因),你要在这个问题发生点加上一行打印,帮助你以后去debug。这就是message的意义所在。

4. 由于使用在环境中使用的uvc越来越多,不可避免的就是log的数量将打印的非常多,如何使用uvm控制和管理log的输出,这也是一个比较值得研究的问题。

来自为知笔记(Wiz)

UVM基础之-------uvm report机制的使用,布布扣,bubuko.com

时间: 2024-09-28 09:23:31

UVM基础之-------uvm report机制的使用的相关文章

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

uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_report_hander来实现: 主要涉及到的方法有get_report_verbosity_level(severity, id)/get_report_action(severity,id) == uvm_action'(UVM_NO_ACTION) 第二是对message进行格式化的输出,这部分工作主

UVM基础之---------uvm factory机制register

factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在. UVM 中有两大关键类,uvm_object 和 uvm_component.一个 uvm_object 在定义时一般要调用 uvm_object_utils 宏,而一个 uvm_component 在定义时要调用uvm_component_utils宏.factory所有的操作都通过这两个宏来

UVM基础之---------uvm factory机制base

从名字上面就知道,uvm_factory用来制造uvm_objects和component.在一个仿真过程中,只有一个factory的例化存在. 用户定义的object和component types通过typedef或者宏在factory中注册,factory产生和保存轻量级的代理(proxy): 1.  uvm_object_registry #(T,Tname) for objects 2.  uvm_component_registry #(T,Tname) for components

UVM基础之---------Reporting Classes

Reporting 类提供了一组工具用于格式化报告输出 report机制大概包括四个主要的类uvm_report_object,uvm_report_handler, uvm_report_server,uvm_report_catcher,UVM reporting主要的接口是uvm_report_object(这是一个接口类),这是uvm_components的父类.uvm_report_object通过内部的function调用uvm_report_handler的function来执行大

UVM基础之---Command-line Processor

提供一个厂商独立的通用接口命令行参数,支持分类:   1. 基本参数和值:get_args,get_args_matches 2. 工具信息:get_tool_name(),get_tool_version() 3. 支持从命令行设置各种UVM变量如冗长和配置设置积分和字符串类型:  +uvm_set_config_int, +uvm_set_config_string 类:uvm_cmdline_processor: 这个类在模拟过程中提供一个命令参数接口,这个类应该是当成一个单例类使用,但这

UVM基础之----uvm_object

uvm_void The uvm_void class is the base class for all UVM classes. uvm_object: The uvm_object class is the base class for all UVM data and hierarchical classes. uvm_object是一个uvm中data和component共同的基类,里边集成了很多东西如recorder,reporter等,还定义了许多公用的接口.该类继承自uvm_vo

UVM基础之--------uvm_root

uvm_root 是uvm的顶层实例扮演了一个top-level and phase controller 的作用,对于component来说.该类不需要用户实例化,他是一个自动实例化了的类,用户直接通过uvm_top调用.任何component,只要没有指定其parent,那么他将作为top的一个child.top管理所有component的phase: 1. The UVM automatically creates a single instance of uvm_root that us

UVM基础之------uvm_transaction

uvm_transaction继承自uvm_object,添加了timing和recording接口,该类是uvm_sequence_item的基类.下边将做剖析 1. 这个类提供了时间戳属性(timestamp properties),通知事件(notification events),和交易记录(transaction recording)支持. 2. 使用这个类作为用户定义的基础交易是弃用.其子类uvm_sequence_item应当作为基类为所有用户定义的事务类型. 3. 这个API的使

UVM基础之------uvm_port_base

Port Base Classes uvm_port_component_base    This class defines an interface for obtaining a port's connectivity lists after or during the end_of_elaboration phase.主要用来在end_of_elaboration phase后返回某个接口的连接列表 uvm_port_component #(PORT)    See descriptio