1. 前言
在随机验证环境中,如果出现回归错误,那么这个错误是否可以复现是非常关键的。在回归时,我们通常利用UVM的+UVM_VERBOSITY参数来设置验证环境的全局打印等级为UVM_NONE,这样减少打印log,进而加快仿真速度。另一方面,回归通常也默认不dump波形,减少内存占用和加快仿真速度。但是如果出现验证用例挂掉了,我们通常需要借助于仿真log和波形来定位问题,因此+UVM_VERBOSITY参数会设置更高打印等级,来打印更多的信息。
有些人遇到使用+UVM_VERBOSITY传递不同打印等级时,问题会无法复现。这可能和验证环境中用户直接使用了uvm_report_enabled()函数有关系,它可能会导致验证环境的随机状态发生改变,进而影响仿真结果。
2. 问题解释
uvm_report_enabled()函数定义如下:
function int uvm_report_enabled(int verbosity, uvm_severity severity = UVM_INFO, string id = "");
if (get_report_verbosity_level(severity, id) < verbosity)
return 0;
return 1;
endfunction
uvm_report_enabled()函数比较关键的参数是verbosity,如果当前组件配置的打印等级大于等于verbosity的值,那么uvm_report_enabled()函数返回1;反之,则返回0。
根据uvm_report_enabled()函数返回1还是0,有些用户把uvm_report_enabled()函数用作判断条件,例如:
if ( uvm_report_enabled(UVM_MEDIUM) ) begin
// execute randomization block_A
end
else begin
// execute randomization block_B
end
代码解释:如果组件的打印等级大于等于UVM_MEDIUM,则执行randomization block_A;反之,则执行randomization block_B。
这里就涉及到不同打印等级情况下,仿真会执行不同的语句,一旦这些不同的语句所产生的随机状态不一致,就会破坏原先的随机状态,进而影响后续所有代码的随机状态,所以仿真可能会无法复现问题。