前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uvm_info高级技巧(1) ---如何屏蔽某些刷屏的啰嗦调试信息

uvm_info高级技巧(1) ---如何屏蔽某些刷屏的啰嗦调试信息

作者头像
IC验证
发布2020-06-30 11:21:32
4.4K0
发布2020-06-30 11:21:32
举报
文章被收录于专栏:杰瑞IC验证杰瑞IC验证

来源| 杰瑞IC验证(ID:Jerry_IC) |原创作者| Q哥

搭建验证环境时,通过添加uvm_info语句,可以非常方便地打印信息,帮助调试。

但是uvm_info加多了,各种信息刷屏,很可能忽视了重要的信息。

就像微信的朋友圈一样,好友太多,各种微商信息、心灵鸡汤、养生谣言充斥,早已掩盖了最初的社交初衷。

有些同学可能知道设置+UVM_VERBOSITY=XXXX可以屏蔽冗余调试信息,但是XXXX究竟是HIGH还是LOW才能屏蔽/不屏蔽,一直搞不清楚。

另外,设置全局verbosity未免太粗暴了,有没有温柔一些的办法,能对某些信息手下留情呢?

今天Q哥来帮大家对uvm_info做一个详细的剖析。

如下图代码片段1所示,uvm_info本身是一个带参数的宏。

代码片段1

第1个参数ID(也叫info id或msg id)是字符串,用来标示这条信息,UVM根据ID对打印信息进行过滤和筛选;这个ID并不是唯一的,可以给多条语句指定相同的ID。

第2个参数MSG也是字符串,是要打印的调试信息;可以直接给一个字符串,或者通过$sfortmat函数产生一个格式化的字符串。

第3个参数是一个枚举类型,给定了这条调试信息的啰嗦程度。

比如代码片段2第1行的打印语句, “msg_a”这个字符串就是ID,“hi”这个字符串是要打印的信息,UVM_LOW就是这条信息的啰嗦程度。

第2行与第一行的ID相同,但是打印信息和啰嗦程度不一样。

代码片段2

uvm_info本质上通过调用uvm_report_enabled函数来计算当前这条打印语句是不是太啰嗦,再决定是屏蔽还是打印;打印动作是通过uvm_report_info这个函数来完成的。

这里`uvm_file和`uvm_line是两个宏,分别记录了该条打印语句所在的文件名和行号;这就是为什么我们通常会看到uvm_info打印信息里面有文件名和行号的原因。

这里Q哥先卖个关子,后续单独发文给大家再讲讲如何修改uvm_info的显示格式和内容,包括彩色打印这样的雕虫小技。

跑仿真的时候,UVM内部会动态维护一个全局的啰嗦容忍等级,以及针对某个component的啰嗦容忍等级(私人定制)。

打个类比的例子,就好比Q哥心情不好的时候,总体上而言会对别人说的话不耐烦......但是......如果是老板讲话,还是会耐心听完的。

执行uvm_info语句的时候,UVM会将这条语句的啰嗦程度,以及系统对它的容忍等级进行比较。如果当前信息的啰嗦程度比系统所能容忍的等级低,相当于系统认为这句话不啰嗦,于是就打印;否则就不打印。

UVM目前定义了6种啰嗦等级,UVM_NONE -> UVM_LOW -> UVM_MEDIUM -> UVM_HIGH-> UVM_DEBUG -> UVM_FULL是越来越啰嗦。

这里大家一定要区分清楚uvm_info语句的啰嗦程度和系统能容忍的啰嗦等级,它俩是对着干的。

也就是说,写uvm_info语句的时候,verbosity给的越高就越啰嗦, 也就越容易被屏蔽。设置容忍等级的时候,verbosity给的越高代表越能容忍,屏蔽的信息也就越少。

说个惨绝人寰的故事加深一下印象吧,当年蒙古铁骑横扫欧亚大陆的时候,有段时期曾以车轮为容忍等级,凡是身高比车轮高的男子,格杀勿论。。。

如果把uvm_info语句的啰嗦程度类比为男子的身高,这里的车轮高度就是啰嗦容忍等级。身高越高就越惨;容忍等级越低,被杀的人越多。

比如上面代码片段2的四条打印语句,如果全局容忍等级是UVM_HIGH,那么前三行都会打印,第4行不会打印(因为太啰嗦了)。

通常tb搭建好之后,可能不方便修改uvm_info的啰嗦程度,比如用的VIP,或者打印信息是其他人的代码产生的。这时候可以通过修改系统的容忍等级来进行信息屏蔽或解除屏蔽。

一种方法是:通过下面这些命令行参数进行打印信息的筛选,进而精准修改啰嗦容忍等级。

通常用命令行参数进行修改是不需要重新编译的,直接添加plusargs参数跑仿真就可以了,比如用VCS等工具。

第一个是是大家比较熟悉的全局啰嗦容忍等级设置,后两个是高大上的私人定制。

这里的<comp>是uvm component 的路径,支持*号通配符(跟uvm_config_db set/get时的用法类似,只是这里必须用绝对路径)。

<id>是uvm_info的第一个参数(如果选择component的所有打印语句,就写_ALL_)。

<phase>可以指定从某个uvm phase开始生效。

<time>可以指定从某个仿真时刻开始生效。

划重点:

1. 这些plusargs是在仿真刚开始但RTL时间还未推进之前就解析并执行的,也就是说在0时刻之前。

2. 对于全局配置,如果指定了多次,会按照最低的容忍等级来执行。也就是说,如果在一长串的仿真参数里,先给了一个+UVM_VERBOSITY=UVM_LOW,又给了一个+UVM_VERBOSITY=UVM_HIGH,最终会按照UVM_LOW来过滤信息。这有点像木桶短板理论。

3. 私人定制参数筛选的信息,可以无视全局设置。譬如全局配置为UVM_LOW,但是可以单独赦免某些component里的某些语句,使它们不被屏蔽。

下面仍旧以代码片段2来说明:

比如+UVM_VERBOSITY=UVM_LOW全局设置,把系统对整个tb的容忍等级改成UVM_LOW。这样只会打印第1行,像其他三行那样哪怕稍微啰嗦一点就受不了。

注意:这时候另外加上参数+uvm_set_verbosity=uvm_test_top.env0.agent0,msg_a,UVM_HIGH,run,可以单独指定系统对uvm_test_top.env0.agent0里info id为“msg_a”的打印信息的容忍等级改为高,并且从run phase开始生效。

如此一来,代码片段2里面,前两行都会打印,后两行被屏蔽。

再如:

+uvm_set_verbosity=uvm_test_top.env0.agent1.*,_ALL_,UVM_HIGH,time,800可以指定从800ns这个时刻开始,把系统对uvm_test_top.env0.agent1下面所有组件里的所有(_ALL_)打印信息的容忍等级改为高。

如此一来,代码片段2里面,这4行都会打印。

除了命令行plusargs,第二种方法是:在tb里面调用下面这些函数动态修改啰嗦容忍等级。随着uvm phase的推进,执行到这些配置语句时,就开始过滤和屏蔽uvm_info打印的信息。相比plusargs在0时刻之前配置,更加灵活。

例如:

env0.agent1.set_report_verbosity_level(UVM_LOW), 把系统对env0.agent1里面所有调试信息的啰嗦容忍等级调为UVM_LOW。

又如:

env0.agent1.set_report_verbosity_level_hier(UVM_LOW), 把系统对env0.agent1及其下面各个子子孙孙组件里面所有调试信息的啰嗦容忍等级调为UVM_LOW。

再如:

env0.agent1.set_report_id_verbosity(“msg_abc”,UVM_MEDIUM), 把系统对env0.agent1里面id为”msg_abc”的啰嗦容忍等级调为UVM_MEDIUM。

这些函数如果多次调用并作用到相同的component和info id时,后面的就会覆盖掉前面的,也会覆盖掉plusargs的配置。

总结一下

uvm_info执行的时候,UVM会判断系统对这条语句的啰嗦容忍等级,然后进行屏蔽或打印。通过命令行参数或者component对象调用配置函数,可以灵活调整系统的啰嗦容忍等级,从而控制对uvm_info语句的屏蔽。

另外,建议大家写uvm_info语句的时候,info id尽量使用一些便于后期筛选或过滤的字符串(比如function或者task的名字);

而不要使用get_name/get_type_name之类的函数返回的字符串,因为这样既不好对这个模块内部做精细筛选,而且也是多余的信息(uvm_info默认已经打印了文件名和component层次)。

接下来,Q哥会继续给大家剖析如果掩耳盗铃假装没看到uvm_error,如何自欺欺人隐瞒uvm_error, 如何颠倒黑白把uvm_error变成uvm_info。

敬请期待!

日积月累,进步从一点一滴开始,加油!!

——The End——

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杰瑞IC验证 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档