一、打印消息
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_INFO | UVM_DISPLAY | 打印在终端上 |
UVM_WARNING | UVM_DISPLAY | 打印在终端上 |
UVM_ERROR | UVM_DISPLAY | UVM_COUNT | 打印在终端上,并会作为仿真退出计数器的计数目标 |
UVM_FATAL | UVM_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