如何设置UVM的消息属性
时间:2021-11-05 13:44:31
手机看文章
扫描二维码
随时随地手机看文章
[导读]a.输出方式和属性赋值UVM提供了四个函数来完成uvm框架内不同严重度消息的输出,同时通过函数定义了消息的冗余度、关联ID和关联行为。uvm_report_info(stringid,stringmessage,intverbosity=UVM_MEDIUM,stringfile...
a. 输出方式和属性赋值
UVM 提供了四个函数来完成uvm框架内不同严重度消息的输出,同时通过函数定义了消息的冗余度、关联 ID和关联行为。
b. 冗余控制
冗余控制主要通过设置全局的冗余度、组件的冗余度来调整消息的输出。
全局控制:为了能够给 testbench 全局的设置一个冗余等级,函数 set_report_verbosity_level_hier()可以实现该功能。
一个更简单的不需要重新编译代码的方法是使用 UVM 命令行处理器处理 UVM_VERBOSITY plusarg 参数,如下所示:
函数 set_report_verbosity_level()能够实现设置个别组件的最大冗余水平。
设置该组件中消息的冗余等级的最大值。这个函数还有一个分等级的版本,用来设置一个组件和其子组件的冗余等级。
通过 uvm_set_verbosity plusarg, UVM 命令行处理器也提供了更多细粒度的控制,该 plusarg 也用于组件层面和 ID 等级冗余控制。
期间的时间)的冗余情况。
c. 关联行为控制
UVM 中能够设置指定消息相关联的行为,即可以设置该消息出现后testbench 的动作。指定消息的类型有以下几类:同一组件下指定的 ID、同一组件下指定的严重度、同一组件下指定的严重度和 ID。
方法 1:
通过下面的函数来将某一类型的消息和特定的行为关联起来。
通过 uvm_set_action plusarg, UVM 命令行处理器也提供了更多细粒度的控
制,该 plusarg 也用于组件层面和 ID 等级冗余控制。用 uvm_set_action 也可以设置相应 component 的属性。
推荐使用`uvm_*()系列宏来处理报告的原因中最重要的是,当一个等级设置为消息无需被打印出来时,`uvm_info 宏在做任何字符串处理之前进行冗余等级检查,这样能够提高仿真效率。下面看一个简单的`uvm_info()语句:
不会执行该条语句,从而不会浪费时间去进入$sformat()生成结果字符串。
`uvm_info 宏下面用 uvm_report_object::uvm_report_enabled() API来做一个冗余等级的检查,然后在调用和该宏使用同样的参数的uvm_report_info()之前决定一个消息是否被打印。
UVM 提供了四个函数来完成uvm框架内不同严重度消息的输出,同时通过函数定义了消息的冗余度、关联 ID和关联行为。
uvm_report_info(string id, string message, int verbosity = UVM_MEDIUM, string filename =
“”, int line = 0);
uvm_report_warning(string id, string message, int verbosity = UVM_MEDIUM, string
filename = “”, int line = 0);
uvm_report_error(string id, string message, int verbosity = UVM_LOW, string filename = “”,
int line = 0);
uvm_report_fatal(string id, string message, int verbosity = UVM_NONE, string filename = “”,
int line = 0);
上面四个函数都是 uvm_report_object 类和 uvm_sequence_item 类的成员函数,因此在继承自这两个类的的 component 和 transaction 中都可以使用以下四个宏对应上面的四个函数:`uvm_info(string id, string message, int verbosity)
`uvm_warning(string id, string message)
`uvm_error(string id, string message)
`uvm_fatal(string id, string message)
上面宏在全局环境中都可以使用。注意:只有“info”消息能被等级设置屏蔽,“warning”,“error”和“fatal”消息将一直会打印出来,或者只能通过设置消息关联的行为来关闭其输出。b. 冗余控制
冗余控制主要通过设置全局的冗余度、组件的冗余度来调整消息的输出。
全局控制:为了能够给 testbench 全局的设置一个冗余等级,函数 set_report_verbosity_level_hier()可以实现该功能。
function void set_report_verbosity_level_hier(int verbosity);
当一个 testbench 模型调用该函数时,能够设置整个 UVM testbench 的冗余等级。一个更简单的不需要重新编译代码的方法是使用 UVM 命令行处理器处理 UVM_VERBOSITY plusarg 参数,如下所示:
vsim testbench UVM_VERBOSITY=UVM_HIGH
细粒度控制:除了全局控制之外, UVM 允许在组件层面甚至在 ID 的层面单独设置冗余水平。函数 set_report_verbosity_level()能够实现设置个别组件的最大冗余水平。
function void set_report_verbosity_level (int verbosity_level);
uvm_report_object 类和 uvm_component 类的成员函数包括该函数,用于设置该组件中消息的冗余等级的最大值。这个函数还有一个分等级的版本,用来设置一个组件和其子组件的冗余等级。
通过 uvm_set_verbosity plusarg, UVM 命令行处理器也提供了更多细粒度的控制,该 plusarg 也用于组件层面和 ID 等级冗余控制。
uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>
uvm_set_verbosity=<comp>,<id>,<verbosity>,time,<time>
这两个参数允许用户在仿真阶段巧妙的设置特定组件在特定时间段(在 run期间的时间)的冗余情况。
c. 关联行为控制
UVM 中能够设置指定消息相关联的行为,即可以设置该消息出现后testbench 的动作。指定消息的类型有以下几类:同一组件下指定的 ID、同一组件下指定的严重度、同一组件下指定的严重度和 ID。
方法 1:
通过下面的函数来将某一类型的消息和特定的行为关联起来。
function void set_report_severity_id_override(uvm_severity cur_severity, string id,uvm_severity new_severity )
function void set_report_severity_action (uvm_severity severity, uvm_action action)
function void set_report_id_action (string id,uvm_action action)
function void set_report_severity_id_action (uvm_severity severity, string id,uvm_action action)
function void set_report_severity_id_verbosity_hier(uvm_severity severity,string id,int verbosity)
function void set_report_severity_action_hier ( uvm_severity severity,uvm_action action)
function void set_report_id_action_hier (string id,uvm_action action)
function void set_report_severity_id_action_hier(uvm_severity severity,string id,uvm_action action)
上述的函数中 action 参数可以是 7 种关联行为的一种或者其中几种的组合。比如为了关闭组件 mycomp 中 id 为“MYTAG”,冗余级别为 UVM_ERROR的这类消息的输出,可以添加如下命令:mycomp.set_report_severity_id_action(UVM_ERROR, “MYTAG”,UVM_NO_ACTION);
或者为了打印该消息同时退出仿真,则可以添加如下命令:mycomp.set_report_severity_id_action(UVM_ERROR, “MYTAG”,UVM_DISPLAY|UVM_EXIT);
方法 2:通过 uvm_set_action plusarg, UVM 命令行处理器也提供了更多细粒度的控
制,该 plusarg 也用于组件层面和 ID 等级冗余控制。用 uvm_set_action 也可以设置相应 component 的属性。
uvm_set_action=<comp>,<id>,<severity>,<action>
关于性能的问题推荐使用`uvm_*()系列宏来处理报告的原因中最重要的是,当一个等级设置为消息无需被打印出来时,`uvm_info 宏在做任何字符串处理之前进行冗余等级检查,这样能够提高仿真效率。下面看一个简单的`uvm_info()语句:
`uvm_info("Message_ID", $sformatf("%s,data[ ]=0xx",name,ii,data[ii]),UVM_HIGH)
在该语句中包含一个相对复杂的语句$sforment,当$sformat()语句被重复调用时,需要占据足够的仿真时间。当冗余等级被设置为 UVM_HIGH 时,大多数情况下该$sformat()消息将不会打印。因为宏的使用,当该条消息不被打印时,将不会执行该条语句,从而不会浪费时间去进入$sformat()生成结果字符串。
`uvm_info 宏下面用 uvm_report_object::uvm_report_enabled() API来做一个冗余等级的检查,然后在调用和该宏使用同样的参数的uvm_report_info()之前决定一个消息是否被打印。
if (uvm_report_enabled(UVM_HIGH, UVM_INFO, "Message_ID"))
uvm_report_info("Message_ID", $sformatf("%s, data[ ] = 0xx", name, ii,data[ii]), UVM_HIGH);
如果直接使用 uvm_report_info(),uvm_report_info("Message_ID", $sformatf("%s, data[ ] = 0xx", name, ii, data[ii]),UVM_HIGH);
即使最终该字符串在 UVM_HIGH 冗余设置下根本不会打印, $sformat()字符串仍将在整个 uvm_report_info()函数之前进行处理,这样会降低仿真效率。