Dskpimc? · 2023年06月28日 · 香港

有趣的UVM_LOG用法

前言

在项目中,一个TB通常是很多人一起开发的,大家或多或少都会往log中打印一些信息(message),方便自己debug。但是如果log里信息太多,会造成自己感兴趣的信息被淹没了,只能通过关键字搜索的方式去查找。因此,本文推荐可以使用UVM提供的UVM_LOG功能,只需要增加少量的代码,就可以根据ID或uvm_severity类别,把自己感兴趣的信息单独提取到指定的文件。

UVM_LOG机制

为了使用UVM_LOG功能,需要在打印message之前打开指定的文件,仿真结束时再关闭这个文件,并且需要把打开文件的句柄传递给UVM的message管理系统。可以将打开的文件设置为默认文件指向、或关联到指定的uvm_severity或id,或两者都关联。

在uvm_report_object和uvm_component类里提供了接口函数给用户去配置UVM_LOG功能,注意uvm_report_object是uvm_component的父类,因此大家只需要在uvm_component层次上调用这些接口函数就好了,而且可以控制UVM hierarchy上任何节点的消息打印行为。

具体的接口函数(API)分为两类。

第一类是只适用于当前uvm_component层次的,也就是这些接口函数的配置不会影响到UVM hierarchy的其它任何节点,有这些函数:

set_report_default_file(UVM_FILE file); //设置默认输出定向文件,如果id, severity都没有关联到输出定
                                        //向文件的话,那么就默认采用这里设置的文件。
set_report_id_file(string id, UVM_FILE file); //将id关联到参数指定的输出定向文件。
set_report_severity_file(uvm_severity severity, UVM_FILE file);  //将severity关联到参数指定的输出
                                                                 // 定向文件。
set_report_severity_id_file(uvm_severity severity, string id, UVM_FILE file);  // 将severity
                                                          // 和id一起关联到参数指定的输出定向文件。
get_report_file_handle(uvm_severity severity, string id); // 返回指定severity和id的输出定向文件句柄

这些函数参数中传递的文件句柄必须是multi-channel描述符(mcd)或与$fdisplay兼容的文件id。UVM_FILE类型其实就是int类型。如果上述接口函数对id或severity重复指定输出定向文件句柄,那么它们优先级是set_report_severity_id_file() > set_report_id_file() > set_report_severity_file() > set_report_default_file()。

第二类是除了适用于当前uvm_component层次,它的子uvm_component也都全部适用,有这些函数:

set_report_default_file_hier(UVM_FILE file);
set_report_id_file_hier(string id, UVM_FILE file);
set_report_severity_file_hier(uvm_severity severity, UVM_FILE file);
set_report_severity_id_file_hier(uvm_severity severity, string id, UVM_FILE file);

可以看出,第二类接口函数的命令是在第一类接口函数命名后面加上”_hier”,对应的功能是类似,只是作用的uvm_component范围不一样。

例子

说了这么多,来几个例子。

第一个例子,在uvm_component子类里加入以下代码:

UVM_FILE log_fh = $fopen("cpu.log");  // 打印cpu.log的文件,并把句柄传给log_fh
this.set_report_id_action("cpu", (UVM_DISPLAY | UVM_LOG)); // 将”cpu”的id加上UVM_LOG功能
this.set_report_id_file("cpu", log_fh); // 将“cpu”的id管理到log_fh文件句柄
`uvm_info("cpu", "The message will be logged in log file", UVM_LOW);
`uvm_info("cpu0", "The message will not be logged in log file", UVM_LOW);
$fclose(log_fh);  // 关闭log_fh文件句柄

上述代码执行完之后,将会在仿真目录下生成1个名为cpu.log的文件,里面包含代码里第一个uvm_info打印的消息” The message will be logged in log file”。代码里第二个uvm_info的打印消息不会定向到cpu.log里,因为它的id是”cpu0”。

第二个例子,在uvm_component子类里加入以下代码:

UVM_FILE log_fh = $fopen("cpu.log");
UVM_FILE default_fh = $fopen("default.log");
this.set_report_id_action("cpu" , (UVM_DISPLAY | UVM_LOG));
this.set_report_id_action("cpu0", (UVM_DISPLAY | UVM_LOG));
this.set_report_id_file("cpu", log_fh);
this.set_report_default_file(default_fh);
`uvm_info("cpu", "The message will be logged in cpu.log file", UVM_LOW);
`uvm_info("cpu0", "The message will be logged in default.log file", UVM_LOW);
$fclose(log_fh);
$fclose(default_fh);

上述代码执行完之后,将会在仿真目录下生成cpu.log和default.log两个文件,第一个uvm_info的id为”cpu”,它只会定向到cpu.log,而不会定向到default.log,因为set_report_id_file()设置的文件句柄优先级高于set_report_default_file()设置的。第二个uvm_info的id为”cpu0”,它会定向到defualt.log,因为没有显示关联到它的文件句柄,UVM会使用默认的文件句柄,也就是set_report_default_file()设置的defualt_fh(default.log)。

友情提示:

UVM_LOG功能需要用户自己创建文件句柄并关联到对应的id或severity上,因此用户需要维护文件句柄的打开和关闭,建议可以在report_phase()里去统一关闭它们,如果提前关闭的话。

有趣的功能衍生

读者可以考虑将id与UVM的uvm_cmdline_processor或SV自带的$value$plusargs (user_string, variable)功能联系起来,这样通过Command Line可以很方便地控制要将哪些id定向到特定的log文件里,这个功能很有用,也不需要重复编译就可以去定向提取各式各样的ID,大家可以自己先去试试,需要源代码的话在微信公众号聊天窗口里输入”id代码”,两种版本的代码都有提供。

作者:谷公子
文章来源:CSDN

推荐阅读

更多Arm AMBA 协议集技术干货请关注Arm AMBA 协议集技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
19598
内容数
1303
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息