report机制 — UVM

一、打印消息

UVM提供的几种不同严重等级的消息报告方法,如下:

  • function void uvm_report_info(string id,string message,int verbosity = UVM_DEDIUM,string filename = “”,int line = 0) ;
  • function void uvm_report_worning(string id,string message,int verbosity = UVM_DEDIUM,string filename = “”,int line = 0) ;
  • function void uvm_report_error(string id,string message,int verbosity = UVM_LOW,string filename = “”,int line = 0) ;
  • function void uvm_report_fatal(string id,string message,int verbosity = UVM_NONE,string filename = “”,int line = 0) ;

对应的消息宏,如下:

方法调用宏调用
uvm_report_info()`uvm_info( ID,MESSAGE,VERBOSITY )
uvm_report_warning()`uvm_warning( ID,MESSAGE )
uvm_report_error()`uvm_error( ID,MESSAGE )
uvm_report_fatal()`uvm_fatal( ID,MESSAGE )

例如:

`uvm_info("drv","print info!",UVM_LOW)
`uvm_warning("drv","$cast fail!")
`uvm_error("drv","send item error!")
`uvm_fatal("drv","cannot get vif!")

注意:

  • 严重级别:UVM_INFO、UVM_WARNING、UVM_ERROR、UVM_FATAL(默认情况下会停止仿真)

  • 消息ID:用任意字符串来标记该信息,会同消息本身被打印出来。

  • 冗余度:冗余度与消息处理中的过滤直接相关。冗余度的设置如果低于过滤的开关,那么该消息不会被打印 分为UVM_NONE、UVM_LOW、UVM_DEDIUM、UVM_HIGH、UVM_FULL、UVM_DEBUG

二、消息控制

2.1 消息过滤

冗余度等级:数值越大,越冗余

	type_def enum{
		UVM_NONE   = 0 ,
		UVM_LOW    = 100,
		UVM_MEDIUM = 200,
		UVM_HIGH   = 300,
		UVM_FULL   = 400,
		UVM_DEBUG  = 500
	} uvm_verbosity

可以在环境中设置消息过滤等级,也可以在仿真时加入命令参数设置。如下:

1、代码中:
较常用的方法:

  • set_report_verbosity_level( ) , 直接设置过滤等级;
  • set_report_verbosity_level_hier( ) ,直接设置过滤等级,递归调用;
  • uvm_report_id_veberbosity , 根据消息id设置过滤等级;
  • uvm_report_id_veberbosity_hier ,根据消息id设置过滤等级,递归调用;

在哪个层级设置,就作用到哪个层级。如果是递归调用,会作用到该层次及其以下层次,如在agent 设置,那么从该 agent 层以下的driver 和 monitor 就会都会相应设置过滤等级。如下:

function void top_env::connect_phase(uvm_phase phase);
	env.agt.set_report_verbosity_level_hier(UVM_LOW) //根据层次设置,且递归调用
endfunction

function void top_env::connect_phase(uvm_phase phase);
	env.agt.set_report_verbosity_level_hier("ID1",UVM_LOW) //根据id设置
endfunction

2、命令行中:

<~> + UVM_VERBOSITY = UVM_HIGH   或者  + UVM_VERBOSITY = HIGH

命令行中相当于在TEST下设置冗余度,也就是对整个环境作用。

2.2 重载打印信息

UVM中四种严重级别(UVM_INFO、UVM_WARNING、UVM_ERROR、UVM_FATAL)的消息是可以相互重载的。与设置冗余度类似,重载消息既可以在代码中添加,又可以在命令行中设置。但是UVM不支持递归重载(只会争对调用的component,不会争对该component 以下的层次)。

1、代码中:
具有的方法如下:

  • set_report_severity_override( ) , 重载相应层次消息严重性,不递归调用;
  • set_report_severity_id_override( ) ,重载相应层次对应id的严重性,不递归调用

如下代码:在base_test中使用

function void base_test::connect_phase(uvm_phase phase);
	//将Driver中的 ERROR 等级变成 WARNING 等级
	env.agt.drv.set_report_severity_override( UVM_ERROR,UVM_WARNING ) 
	
	//将Driver中ID为 drv1 的 ERROR 等级的信息,变成 WARNING 等级的信息
	env.agt.drv.set_report_severity_id_override( UVM_ERROR,"drv1",UVM_WARNING ) 
	
endfunction

2、命令行中:
设置当前component 下所有ID的重载,如下

 + uvm_set_severity = "uvm_test_top.env.agt.drv,_ALL_,UVM_ERROR.UVM_WARNING"

设置当前component 下指定ID的重载,如下

 + uvm_set_severity = "uvm_test_top.env.agt.drv,drv1,UVM_ERROR.UVM_WARNING"

2.3 控制打印信息行为

每一条消息对应不同的处理方式,通常不同严重级别对应不同的处理方式。

处理方式说明
NO ACTION不做任何处理
UVM_DISPLAY将消息输出到标准输出端口
UVM_LOG将消息写入到文件中
UVM_COUNT增加退出计数变量quit_count。当quit_count达到一定的数值时,停止仿真
UVM_EXIT立即退出仿真
UVM_CALL_HOOK调用对应的回调函数
UVM_STOP停止仿真 ,进入命令行交互模式

不同严重级别的消息,默认的消息处理方式,如下:

严重级别默认处理方式描述
UVM_INFOUVM_DISPLAY打印在终端上
UVM_WARNINGUVM_DISPLAY打印在终端上
UVM_ERRORUVM_DISPLAY | UVM_COUNT打印在终端上,并会作为仿真退出计数器的计数目标
UVM_FATALUVM_DISPLAY | UVM_EXIT打印在终端上,并 会自动退出仿真

我们也可以自己定义不同严重等级的信息控制行为,如下:让driver中的INFO消息不打印出来

function void base_test::connect_phase(uvm_phase phase);	
	env.agt.drv.set_report_severity_action( UVM_INFO,UVM_NO_ACTION ) 
endfunction

2.4 回调函数

在处理信息时还希望做出额外的处理, uvm_report_object 提供的回调函数:

function bit report_hook(string id,string message,int verbosity,string filename,int line);
//子一级的回调函数
//当report_hook 返回为1 ,才会调用一下的分类hook
function bit report_info_hook(string id,string message,int verbosity,string filename,int line);
function bit report_wairning_hook(string id,string message,int verbosity,string filename,int line);
function bit report_error_hook(string id,string message,int verbosity,string filename,int line);
function bit report_fatal_hook(string id,string message,int verbosity,string filename,int line);

例子:

class test1 extends uvm_test;
    integer f;
    `uvm_component_utils(test1);
    ...
    function void build_phase(uvm_phase phase);
        set_report_serverity_action(UVM_ERROR,UVM_DISPLAY | UVM_CALL_HOOK);//表示如果是”ERROR“,不仅会打印出来,还会调用的它的回调函数
        set_report_veribosity_level(UVM_LOW);//表示只打印UVM_LOW和比它等级低的,如UVM_NONE
    endfunction
    
    taks run(uvm_phase phase);
        uvm_report_info("RUN","info1",UVM_MEDIUM);
        uvm_report_info("RUN","info2",UVM_LOW);
        uvm_report_warning("RUN","error1",UVM_LOW)//会先调用report_hook
    uvm_report_warning("RUN","error2",UVM_HIGH);//这条消息别过滤掉了
    endtask
    
    function void report_phase(uvm_phase phase);
        $fclose(f);
    endfunction
    
    function bit report_hook(string id,string message,int verbosity,string filename,int line);
        uvm_report_info("RPTHOOK",$sformatf("%s : %s",id,message),UVM_LOW);
        return 1;//返回值是1的话,会紧接着调用report_error_hook
    endfunction
     
    function bit report_error_hook(string id,string message,int verbosity,string filename,int line);
        uvm_report_info("ERRHOOK",$sformatf("%s : %s",id,message),UVM_LOW);
        return 1;
    endfunction  
endclass
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UVM工厂机制是一种用于创建和管理UVM组件和对象的机制。它通过使用UVM工厂类(uvm_factory)来实现。\[1\]该工厂类是一个独特的对象,用于注册和创建UVM组件和对象。在UVM中,组件和对象的注册是通过使用宏来实现的,分别是uvm_component_utils和`uvm_object_utils。\[2\]这些宏将组件和对象注册到工厂中,以便在需要时可以通过工厂来创建它们。 使用UVM工厂机制创建组件和对象有两种方法。一种是通过继承uvm_component类或uvm_object类,并在类内重载方法来实现。这种方法本质上是借用工厂对象来创建组件和对象。\[1\]另一种方法是直接使用工厂方法来创建组件和对象。这需要使用全局唯一的uvm_factory类对象factory来调用工厂方法,并使用$cast进行类型转换。\[3\] 总之,UVM工厂机制提供了一种方便的方式来注册和创建UVM组件和对象,使得它们可以在需要时动态地创建和使用。 #### 引用[.reference_title] - *1* *3* [UVM:factory 机制](https://blog.csdn.net/Starry__/article/details/122930959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [UVM-工厂机制(factory)](https://blog.csdn.net/sinat_41774721/article/details/121763596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值