我们已经在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_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)
|