UVM世界观之十一:消息管理(上)

本文转自:http://www.eetop.cn/blog/html/28/1561828-2331507.html

我们已经在SV部分的《测试环境的报告规范》中提出了关于一个好的验证系统应该具有的消息管理特性,它们分别是:

  • 通过一种标准化的方式打印信息
  • 过滤(重要级别)信息
  • 打印通道

而这些特性在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_FATAL。这些不同的严重级别在打印出的消息中也会有不同的指示来区别,同时仿真器对不同严重级别消息的处理方式也不一样。例如对于UVM_FATAL的消息,默认情况下仿真器会停止。

消息ID:该ID可以是任意的字符串,用来标记该消息。这个标记会同消息本身打印出来。同时,不同的标记也可以用来进行消息处理。

消息:即消息文本的主体。

冗余度:冗余度与消息处理中的过滤直接相关。冗余度的设置如果低于过滤的开关,那么该消息会打印出来,否则不会被打印出来。但是,无论信息是否会被打印出来,这都与对消息采取的其它措施没有任何关系,例如仿真停止。

文件名和行号:这些信息用来提供消息发生时所在的文件和行号。用户可以使用默认值,而UVM后台会自动填补它们原本的文件和行号,同时也在打印时将文件名和行号输出。

消息处理

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

处理方式 说明
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_FATAL

 

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

UVM世界观之十一:消息管理(上)

方法调用 宏调用
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)