UVM打印信息管理

UVM共定义了如下几种行为:

typedef enum
    {
    UVM_NO_ACTION = 'b000000,
    UVM_DISPLAY = 'b000001,
    UVM_LOG = 'b000010,
    UVM_COUNT = 'b000100,
    UVM_EXIT = 'b001000,
    UVM_CALL_HOOK = 'b010000,
    UVM_STOP = 'b100000
    } uvm_action_type;

与field automation机制中定义UVM_ALL_ON类似,这里也把UVM_DISPLAY等定义为一个整数。不同的行为有不同的位偏移,所以不同的行为可以使用“或”的方式组合在一起。

其中UVM_NO_ACTION是不做任何操作;UVM_DISPLAY是输出到标准输出上;UVM_LOG是输出到日志文件中,它能工作 的前提是设置好了日志文件;UVM_COUNT是作为计数目标;UVM_EXIT是直接退出仿真;UVM_CALL_HOOK是调用一个回调函数;UVM_STOP是停止仿真,进入命令行交互模式。

默认情况下,UVM会将UVM_INFO等信息显示在标准输出(终端屏幕)上。各个仿真器提供将显示在标准输出的信息同时输 出到一个日志文件中的功能。但是这个日志文件混杂了所有的UVM_INFO、UVM_WARNING、UVM_ERROR及UVM_FATAL。

UVM提供将特定信息输出到特定日志文件的功能:1)首先使用UVM_FILE 宏,编译器预编译文件的时候,会把__FILE__替换为当前文件名。简单理解为使用UVM宏按照不同的严重成都声明了4个文件。2)使用$fopen打开文件。函数原型为FILE * fopen(const char * path,const char * mode)参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:r:只读,必须存在。w:只写,存在清空。+:可读写,b:二进制文件,a:附加只写,x:创建文件,t:文本文件。写入结束后要使用$fclose函数关闭文件。3)使用set_report_severity_file函数,第一个参数是严重程度,第二个函数是文件。4)使用set_report_severity_action函数将不同严重等级的信息,通过UVM_LOG函数输出到文件。UVM_LOG是输出到日志文件中,它能工作的前提是设置好了日志文件。

除了根据严重性设置不同的日志文件外,UVM中还可以根据不同的ID来设置不同的日志文件:这里用到了set_report_id_file函数,前一个参数是要打印的component,后一个参数是文件。env.i_agt.set_report_id_file_hier("my_driver", driver_log);

16 UVM_FILE info_log;
17 UVM_FILE warning_log;
18 UVM_FILE error_log;
19 UVM_FILE fatal_log;

20 virtual function void connect_phase(uvm_phase phase);
21     info_log = $fopen("info.log", "w");
22     warning_log = $fopen("warning.log", "w");
23     error_log = $fopen("error.log", "w");
24     fatal_log = $fopen("fatal.log", "w");
25     env.i_agt.drv.set_report_severity_file(UVM_INFO, info_log);
26     env.i_agt.drv.set_report_severity_file(UVM_WARNING, warning_log);
27     env.i_agt.drv.set_report_severity_file(UVM_ERROR, error_log);
28     env.i_agt.drv.set_report_severity_file(UVM_FATAL, fatal_log);
29     env.i_agt.drv.set_report_severity_action(UVM_INFO, UVM_DISPLAY| UVM_LOG);
30     env.i_agt.drv.set_report_severity_action(UVM_WARNING, UVM_DISPLAY|UVM_LOG);
31     env.i_agt.drv.set_report_severity_action(UVM_ERROR, UVM_DISPLAY| UVM_COUNT | UVM_LOG);
32     env.i_agt.drv.set_report_severity_action(UVM_FATAL, UVM_DISPLAY|UVM_EXIT | UVM_LOG);
…
42 endfunction

打印信息也可以计数,UVM_COUNT是用来计数的行为。其中UVM_ERROR默认计数。进而可以通过计数来结束仿真。

结束仿真:当uvm_fatal出现时,表示出现了致命错误,仿真会马上停止。UVM同样支持UVM_ERROR达到一定数量时结束仿真。实现这个功能的是set_report_max_quit_count函数,其调用方式为:

function void base_test::build_phase(uvm_phase phase);
 super.build_phase(phase);
 env = my_env::type_id::create("env", this);
 set_report_max_quit_count(5);
 endfunction

除了在代码中使用set_max_quit_count设置外,还可以在命令行中设置退出阈值:

+UVM_MAX_QUIT_COUNT=6,NO。其中第一个参数6表示退出阈值,而第二个参数NO表示此值是不可以被后面的设置语句重载,其值还可以是YES。

还可以通过UVM_EXIT退出仿真。若要停止仿真进行断点调试,则使用UVM_STOP。这些行为都通过UVM_REPORT_SEVERITY_ACTION中的参数来设置。

打印信息严重性也可以重载,如果要将driver中所有的UVM_WARNING显示为UVM_ERROR,可以使用如下的函数:drv.set_report_severity_override(UVM_WARNING, UVM_ERROR); 

本文章参考《UVM实战》、《芯片验证漫游指南》等资料整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值