|
发表于 2014-7-20 15:15:34
|
显示全部楼层
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中都可以使用。
来自我写的一个文档,希望能帮助到你....... |
|