IC验证学霸笔记4——UVM--消息管理

消息管理

一个好的验证系统应该应该具有消息管理特性,它们是:

通过一种标准化的方式打印信息;

过滤(重要级别的)信息;

打印通道。

这些特性在UVM中均有支持,UVM提供了一系列丰富的类和方法来生成和过滤消息:

•    消息方法
•    消息处理
•    消息机制


在UVM环境中或者环境外,只要有引入uvm_pkg,均可以通过下面的方法来按照消息的严重级别和冗余度来打印消息

function void uvm_report_info(string id, string message, int verbosity = UVM_MEDIUM, string filename = "", int line = 0); 
function void uvm_report_warning(string id, string message, int verbosity = UVM_MEDIUM, 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); 

四个消息函数有若干共同的信息,它们是严重级别(severity)、冗余度(verbosity)、消息ID、消息、文件名和行号:
•    严重级别: 从函数名本身也可以得出, 这四个严重级别分别是UVM_INFO、
UVM_WARNING、UVM_ERROR、 UVM_FATAT,不同的严重级别在打印的消息中也会有不同的指示来区别, 同时仿真器对不同严重级别消息的处理方式也不一样。 例如对于UVM_FATAL的消息, 默认情况下仿真会停止。
•    消息ID: 如ID可以是任意的字符串, 用来标记该消息。 这个标记会同消息本身打印出来, 同时不同的标记也可以用来进行消息处理。
•    消息: 即消息文本的主体。
•   冗余度: 冗余度与消息处理中的过滤直接相关。 冗余度的设置如果低于过滤的开关, 那么该消息会打印出来, 否则不会被打印出来。 但是无论信息是否会被打印出夹, 这都与对消息采取的其它措施没有关系, 例如仿真停止。(UVM_NONE/LOW/MEDIUM/HIGH/FULL/DEBUG重要性逐渐降低)
•    文件名和行号: 这些信息用来提供消息发生时所存的文件和行号。 用户可以使用默认值, 而UVM后台会自动填补它们原本的文件名和行号, 同时也在打印时将文件名和行号输出。

与每一 条消息对应的是如何处理这些消息。通常情况下,消息处理的方式是同消息的严重级别对应的。如果用户有额外的需求,也可以修改对各个严重级别的消息处理方式。

而不同的严重级别消息,用户可以使用默认的消息处理方式:


如果要做自定义的消息处理方式,用户可以通过uvm_report_object类提供的方法进行配置。
uvm_report_object类是间于uvm_object类与uvm_component类之间的中间类,它的主要功能是完成消息打印和管理。


UVM也提供了一些宏来对应上面的消息方法,用户也可以使用这些宏来处理消息。


消息处理是由uvm_report_handler类来完成的,而每一个uvm_report_object类中都有一个uvm_report_handler实例。

•   上面的uvm_report_object消息处理方法或者uvm_component消息处理方法,都是针对于这些uvm_report_handler做出的配置。
•   除了上面的常见使用方法,用户还可以做出更高级的消息控制。例如, 当UVM_ERROR出现之后,仿真默认会停止,这是由于设置了UVM_ERROR的处理方式是UVM_COUNT数量达到上限(默认为1)'即停止仿真。可以通过set_max_quit_count来修改UVM_COUNT值。

回调函数

•    消息用户在处理信息时还希望做出额外的处理,这时回调函数就显得很有必要了, uvm_report_object类提供了下面的回调函数满足用户更多的需求:
•     function bit report_hook(string id, string message, int verbosity, string filename, int line);
•     function bit report_info_hook(string id, string message, int verbosity, string filename, int line); 
•     function bit report_warning_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); 

•    report_hook()函数通过结合消息管理时的UVM_CALL_HOOK参数,结合用户自定义的回调函数. 就可以实现更丰富的配置。
•    这样用户在调用回调函数时, 首先会调用report_hook()函数, 接下来才按照severity级别来选择更细致的回调函数report_SEVERITY_hook()。
•    默认情况下,report_hook()函数返回值为1, 进而再转入severity hook函数。
•    如果report_hook()函数由用户自定义且返回0的话, 那么后续report_SEVERITY _hook()函数不会执行。

除了每个uvm_report_object中都内置个uvm_report_handler实例之外,所有uvm_report_handler实例也都依赖于uvm_pkg中uvm_report_server的唯一实例, 但是该实例并没有作为全局变量, 直接暴露给用户,需要用户自行调用uvm_report_server::get_server()方法来获取。

uvm_report_server是一个全局的消息处理设备, 用来处理从所有uvm_report_hanlder中产生的消息。 这个唯一的report server之所以没有暴露在uvm_pkg中供用户使用, 一个原因在于对消息的处理方式。

以下案例涵盖本节的所有重点 




注:优秀验证学员随堂笔记,已经征求到学生的同意,会持续给牛友们分享!
大家看完记得 一键三连!多多支持
#深度学习##做项目##芯片IC验证工程师##你为什么选择硬件行业##你的秋招进展怎么样了#
全部评论
这图是芯片漫游指南书上的吧
1 回复 分享
发布于 2022-09-20 20:41 江苏

相关推荐

有气魄的马来熊在摸鱼:我爱vivo 马上换手机 vivo我爱你!!!
点赞 评论 收藏
分享
10-17 23:18
已编辑
西北农林科技大学 Web前端
独行m:给25可以试试,但他只能给12,那就是纯纯的事精
秋招,不懂就问
点赞 评论 收藏
分享
评论
4
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务