上一个文章中讲解了uvm_report_enable。当enable了,就会执行真正的message的执行方法,还是以`uvm_error宏讲解
`define uvm_error(ID, MSG) \
begin \
if (uvm_report_enabled(UVM_NONE,UVM_ERROR,ID)) \
uvm_report_error (ID, MSG, UVM_NONE, `uvm_file, `uvm_line, "", 1); \
end
核心是方法uvm_report_error,下面是调用方法的执行顺序
uvm_report_object.uvm_report_error(*)和方法uvm_report_object.uvm_report(*)仅仅是参数的传递
uvm_report_message.set_message(*)在uvm_report方法中例化一个uvm_report_message句柄,然后设置这个对象的一些属性,主要是uvm_report传递的一些参数
uvm_report_handle.process_report_messaged(*)调用组件中uvm_report_handle类型的句柄m_rh的方法,主要是设置message别的属性
uvm_report_server.process_report_message(*)如果action是UVM_LOG|UVM_DOSPLAY,执行下面的compose_repost_message,如果是UVM_NO_ACTION,直接返回
uvm_report_server.compose_report_message(*)(如果message的action是LOG/DISPLAY),构造真正的要打印的message string
uvm_report_server.excute_report_message()(真正的取执行这个message,根据每个message不同的action去执行不同的操作)
所以说一个message主要和3个核心类有关
uvm_report_message
uvm_report_handle
uvm_report_server
uvm_report_message:这个类的主要作用有两处
(1)这个类存放了一条message的所有组成部分,比如一条message是这样的
UVM_INFO tb_report.sv(11) @0: uvm-test_top [ID] string
注:
UVM_INFO表示severity
tb_report.sv:这条信息所在的文件
(11) : line
@0:time
uvm-test_top :这个信息所在TB的位置
[ID] :ID值
string:实际打印的值
这些message的元素组成了message的field,uvm_report_message就是管理这些message field的。
(2)uvm_report_object,uvm_report_handle,uvm_report_server3个类的句柄,
其中uvm_report_object句柄表示在哪个组件中调用了打印机制,
uvm_report_handle主要用来处理这个message是否enable 打印。
uvm_report_server全局的句柄,最终由uvm_report_server完成打印
uvm_report_handle:这个class主要处理将message按照 id/severity/verbosity分类,判断message是否enable打印
(1)存储每个ID/severity的verbosity。
(2)同时这个class中存放了message应该被打印到什么地方的文件句柄(按照id/severity分)。
(3)同时存放了是否存在message severity属性override现象以及不同id/severity的action。
总结一下就是这个类主要是对message进行打印前的处理工作,包括enable/file_handle/action等信息,然后交给uvm_report_message。
每个组件在例化的时候均要例化一个uvm_report_handle(与组件同名)。(是在父类uvm_report_object中的new中完成的,
因此知道uvm_report_handle的路径其实就是知道了组件的路径),uvm_report_handle相当于预先设置好了message所要遵从的一些属性规则。
uvm_report_server:真正去执行message的class,会根据message不同的action,去执行不同的操作
在uvm_report_handle中设置了messgae的一些属性,下面讲解一下
上图是设置不同的serverity不同的默认action以及默认的FILE,我么可以根据需求修改severity的action以及FILE,具体的方法在uvm_report_handle中,因为在server执行了是根据不同的action来执行不同的行为的,所以说有需要的时候不仅仅要修改FILE,同时要修改action
上图是不同action代表的不同含义
注:使用宏的话会先判断,enable的话再调用uvm_report_*。当然也可以直接调用uvm_report_*,这个时候再这个方法内部也会做判断。但是宏的方法更方便,因此推荐使用report 宏
来源:CSDN
作者:硅码农
链接:https://blog.csdn.net/liuwei848/article/details/103240322