请教一个UVM中关于report的问题
在UVM中我们可以使用set_report_*_action和set_report_*_file对report的行为和输出进行设置,现在我在测试平台中我希望能够对测试平台中的report进行统一设置,但我发现如果我在environment中进行设置那只能对environment中的report起作用。我想问如何能够在一个地方对整个测试平台的所有report进行设置?
比如使用set_report_verbosity_level_hier就可以进行全局设置,不知道set_report_*_action和set_report_*_file有没有类似的
UVM的设计者已经考虑到这个问题了...
UVM中一共可以通过如下方式来实现输出信息的控制:
1.通过控制ID来实现不同的输出控制。
2.通过设置不同ID的信息报告冗余级别。
3.通过设置不同ID的action。
4.从uvm_report_catcher派生一个类,然后将这个callback加入到callback池中。
UVM能够实现下面的动作:
1.设置一个全局的属性来决定该testbench所属的消息是否输出。两种方法。
2.设置一个组件(compoment)的属性来决定该组件所属的消息是否输出。用uvm_compoment组件的成员函数set_report_ verbosity_level_hier ()来定义该组件的冗余属性。
3.设置一个消息的属性来决定该消息是否输出。
4.设置一个组件中不同属性和不同ID的消息出现之后testbench的行为。
在UVM中的消息有三种属性,分别是:严重度(severity)、冗余度(verbosity)、以及消息的关联行为,此外还有消息的标签ID。UVM的消息机制基于该三种属性和标签ID,实现对消息的处理。
冗余控制主要通过设置全局的冗余度、组件的冗余度来调整消息的输出。
全局控制
为了能够给testbench全局的设置一个冗余等级,函数set_report_verbosity_ level_hier()可以实现该功能。
方法1:
function void set_report_verbosity_level_hier(int verbosity);
当一个testbench模型调用该函数时,能够设置整个UVM testbench的冗余等级。
方法2:
一个更简单的不需要重新编译代码的方法是使用UVM命令行处理器处理 +UVM_VERBOSITY plusarg参数,如下所示:
vsim testbench +UVM_VERBOSITY=UVM_HIGH
细粒度控制
除了全局控制之外,UVM允许在组件层面甚至在ID的层面单独设置冗余水平。
方法1:
函数set_report_verbosity_level()能够实现设置个别组件的最大冗余水平。
function void set_report_verbosity_level (int verbosity_level);
uvm_report_object类和uvm_component类的成员函数包括该函数,用于设置该组件中消息的冗余等级的最大值。
这个函数还有一个分等级的版本,用来设置一个组件和其子组件的冗余等级。
function void set_report_verbosity_level_hier ( int verbosity );
该函数为继承自uvm_report_object类的uvm_component子类下的一个函数,该函数递归的设置了自身和其之下的组件的报告的最大冗余等级。从该组件发出的超出该冗余度的消息都将被忽略。
方法2:
通过+uvm_set_verbosity plusarg,UVM命令行处理器也提供了更多细粒度的控制,该plusarg也用于组件层面和ID等级冗余控制。
+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>
+uvm_set_verbosity=<comp>,<id>,<verbosity>,time,<time>
这两个参数允许用户在仿真阶段巧妙的设置特定组件在特定时间段(在run期间的时间)的冗余情况。参数id可以是ALL(对应所有ID)或者一个特定消息的ID。因为性能的原因,对于ID不支持通配符。在非“run”期间的设置是在命令行中按次序执行,在run期间的设置是按照事件排序,然后按照在同一时间的设置执行。(这里存在一个问题没有搞明白:在run期间如何设置?难道是暂停仿真之后再设置?)
方法3:
function void set_report_severity_id_verbosity (uvm_severity severity,string id,int verbosity)
函数set_report_severity_id_verbosity可以将给定严重度(severity)和给定ID的消息报告和指定的冗余度关联起来,和severity/id都关联的优先级高于仅和id关联的优先级,其又高于仅和severity关联的优先级。
uvm_report_object类和uvm_component类的成员函数包括该函数,因此在继承自这两个类的的component和transaction中都可以使用。
来自我写的一个文档,希望能帮助到你.......
是这样,我知道可以通过你提到的种种设置来设定report是否输出,我现在想问的是,是否能够通过某种方法设置测试平台全局的report的行为(action)和输出位置(file)
全局的action可以设置的,上文中有提到,至于输出的file的话,我没有见到UVM中提到这一点...我建议如果要用到这个的话,可以用宏来解决...不知道能否解决你的问题...
每个report都有自己的ID,因此可以根据不同的ID设置不同的action....
目前看来宏是唯一可以想到的解决方法了