uvm_primer ch19 reporting
最初使用
$display $error $fatal做打印,不能有一些控制;
uvm 打印
`uvm_info(<Message ID string>,<msg string>,<verbosity>)
`uvm_warning(<Message ID string>,<msg string>)
`uvm_error(<Message ID string>,<msg string>)
`uvm_fatal(<Message ID string>,<msg string>)
可以有多种设置UVM_VERBOSITY的方式
vsim top_optim -coverage +UVM_NAME=random_test +UVM_VERBOSITY=UVM_HIGH
- default 的UVM_VERBOSITY是MEDIUM;
class env extends uvm_env;
`uvm_component_utils(env);
...
function void end_of_elaboration_phase(uvm_phase phase);
scoreboard_h.set_report_severity_action_hier(UVM_ERROR, UVM_NO_ACTION);
endfunction : end_of_elaboration_phase
...
endclass
_hier 代表这个对象及其内部包含的所有
也可以使用
set_report_severity_action(UVM_HIGH);
UVM_NO_ACTION 用来控制warning /error/fatal
uvm_report_info
uvm_report_info这个和uvm_info 之间关系??
uvm_report_info(get_type_name(),$psprintf("rq_attr = %0h",rq_attr));
REPORT_TAG = $sformatf("RST_AGENT_DRV[%0s]",cfg.id);
uvm_report_fatal(REPORT_TAG,"Unsupported cmd_type in sequence item");
uvm_report_fatal(REPORT_TAG, {"rst_agent_cfg must be set for: ", get_full_name(), ".cfg"});
if (cfg.use_rst_in) begin
uvm_report_error(REPORT_TAG,$sformatf(
"Reset %s is configured to use rst_in as its control, so it should not receive a sequence item, but one was just sent. Ignoring sequence item.\n",cfg.id));
%m
if (TRACE_ON) $display("[TRACE]%t %s:%m", $realtime, this.name);
上句%s,表示打印字符串, %m表示打印层次名字
这句常用于debug
`uvm_info( get_name(), $sformatf("HIERARCHY: %m"), UVM_HIGH);
UVM_INFO my_driver.sv(23) @ 2900000: uvm_test_top.env.i_agt.drv [my_driver] HIERARCHY: top_tb_sv_unit.my_driver.main_phase
打印信息应该让我们可以看出是谁打印的这个信息(代码风格)
psprintf/req.sprint()
`uvm_info( get_name(), $psprintf("Wishbone Transaction: \n%0s", req.sprint()), UVM_HIGH)
- psprintf返回一个字符串
- $sformat是SystemVerilog标准中的系统函数
《SystemVerilog验证测试平台编写指南中文 第二版》49页 中提到了 $psprintf 和 $sformat ,看着意思是$psprintf 较好一些。原文如下: “稍加留意便可发现动态字符串的用处有多大。在别的语言如C里,你必须不停地创建临时字符串来接收函数返回的结果。在例2.53中,函数$psprintf()替代了Verilog-2001中的函数$sformat()。这个新函数返回一个格式化的临时字符串,并且可以直接传递给其他子程序。这样你就可以不用定义新的临时字符串并在格式化语句与函数调用过程中传递这个字符串。”$sformat是SystemVerilog标准中的系统函数
$psprintf是由VCS添加的SV扩展(源自Vera),暂未被SystemVerilog标准收录,$psprintf最近也被Questa支持。
总结起来就是:$psprintf 和 $sformat 的功能基本相同,都是返回一个格式化的字符串,并且可以直接传递给其他子程序。其中,$sformat属于SV标准支持的函数,而$psprintf目前被VCS工具和Questa工具支持 。
sformat/sformatf
- 首先$sformatf()/$sformat()这两个函数是不做打印的事儿的,不要以为这两个函数是做打印的!
- $sformat()比$sformatf()多了第一个参数,这个第一个参数就是放最终整理好的字符串的容器。
string jerry_string;
string jerry_string_r;
$sformat(jerry_string , “jerry_face_score==%0d” , 100); //
$display(“1.%0s”, jerry_string);
jerry_string_r=$sformatf(“jerry_cool_score==%0d” , 100);
$display(“2.%0s”, jerry_string_r);