相比传统的SV使用$display函数打印消息,UVM通过冗余度级别的设置提高了仿真日志的可读性。在打印之前,UVM会比较要显示信息的冗余度级别和默认的阈值,若小于阈值则显示;反之不显示。默认的冗余度阈值是UVM_MEDIUM,所有低于其的信息都会显示出来,如UVM_LOW.
1.打印信息冗余度阈值的设置
UVM中通过get_report_verbosity_level函数得到某个component的冗余度阈值。这个函数将得到一个整数,它代表的含义如下:
typedef enum
{
UVM_NONE = 0,
UVM_LOW = 100,
UVM_MEDIUM = 200,
UVM_HIGH = 300,
UVM_FULL = 400,
UVM_DEBUG = 500
}uvm_verbosity;
可使用set_report_verbosity_level函数来设置某个特定component的默认冗余度阈值,如在base_test中将driver的冗余度阈值设置为UVM_HIGH,代码为:
virtual function void connect_phase(uvm_phase phase);
env.i_agt.drv.set_report_verbosity_level(UVM_HIGH);
endfunction
当涉及到层次引用时,需要在connect phase及之后才能对其调用,如果不牵扯层次引用时,可在connect phase之前调用。
set_report_verbosity_level只对具体的一个component起作用,如果想把该component及其下所有的component冗余度进行设置,则使用set_report_verbosity_level_hier。
env.i_agt.drv.set_report_verbosity_level_hier(UVM_HIGH);
除此之外,还可以在命令行中设置冗余度阈值:+UVM_VERBOSITY=UVM_HIGH或者+UVM_VERBOSITY=HIGH,它会把整个验证平台的冗余度阈值设置为UVM_HIGH。
在芯片验证中,可以根据习惯和需要对不同component设置不同的冗余度阈值。
2.重载打印信息的严重性
UVM有四种信息严重性从小到大:UVM_INFO、UVM_WARNING、UVM_ERROR、UVM_FATAL。这四种严重性可以互相重载:
virtual function void connect_phase(uvm_phase phase);
env.i_agt.drv.set_report_severity_override(UVM_WARNING,UVM_ERROR);
endfunction
当然也可以在命令行中实现,代码为:
+uvm_set_severity=<comp>,<id>,<current severity>,<new severity>
+uvm_set_severity="uvm_test_top.env.i_agt.drv,my_driver,UVM_WARNING,UVM_ERROR"
3.结束仿真的机制
有两种情况会结束仿真:
UVM_FATAL一出现表示有重大错误,会立即终止仿真。
UVM_ERROR达到一定数量后结束仿真。对于某个测试用例,出现了大量error后就不需要再继续仿真等待drop objection了,可以根据错误定位bug所在。
具体实现方法为:
function void base_test::build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env",this);
set_report_max_quit_count(5);
endfunction
set_report_max_quit_count()函数用以设置退出的阈值,此时当出现5个uvm_error后会自动退出仿真并打印信息。当测试用例与base_test都设置了退出阈值时,以base_test设置为准。对应的可以用get_report_max_quit_count函数查询当前的退出阈值。
还可以通过设置set_report_severity_action函数来把UVM_WARNING加入计数目标:
env.i_agt.drv.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_COUNT);
函数的第一个参数也可以是UVM_INFO。
如果想将ERROR从计数目标中移除:
env.i_agt.drv.set_report_severity_action(UVM_ERROR,UVM_DISPLAY);
4.设置断点功能
UVM支持断点功能,当执行到断点时可以自动停止仿真,以uvm_warning为例使用方法为:
env.i_agt.drv.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_STOP);
实际上就是将set_report_max_quit_count函数中的UVM_COUNT替换为UVM_STOP即可实现断点功能。
5.打印信息的控制
上述描述了set_report_severity_action函数的一系列典型应用,无论是UVM_LOG、UVM_DISPLAY、UVM_COUNT都是UVM内部的一种行为:
typedef enum
{
UVM_NO_ACTION = 'b000000,
UVM_DISPLAY = 'b000001,
UVM_LOG = 'b000010,
UVM_COUNT = 'b000100,
UVM_EXIT = 'b001000,
UVM_CALL_HOOK = 'b010000,
UVM_STOP = 'b100000
} uvm_action_type;
其中NO_ACTION是不做任何操作;UVM_DISPLAY是输出到标准输出上;UVM_LOG是输出到日志文件中,前提是设置好了日志文件;UVM_COUNT是作为计数目标;UVM_EXIT是退出仿真;UVM_CALL_HOOK是调用回调函数,UVM_STOP停止仿真。
默认情况下,UVM的设置如下:
set_severity_action(UVM_INFO,UVM_DISPLAY);
set_severity_action(UVM_WARNING,UVM_DISPLAY);
set_severity_action(UVM_ERROR,UVM_DISPLAY|UVM_COUNT);
set_severity_action(UVM_FATAL,UVM_DISPLAY|UVM_EXIT);
在前文中通过设置默认冗余度级别可以关闭默写信息的输出,同样也可以通过UVM_NO_ACTION实现这个功能:
env.i_agt.drv.set_report_severity_action(UVM_INFO,UVM_NO_ACTION);
声明了UVM_NO_ACTION后,无论原先冗余度是什么级别,该drv中的UVM_INFO信息都不会再输出。