0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM消息打印机制打印的时间跟波形时间不一样是怎么回事呢?

sanyue7758 来源:硅芯思见 2023-10-07 16:55 次阅读

前面讨论过$time和$realtime显示时间时,log信息中显示的时间会跟仿真波形不一致,有一些差异。有些朋友在使用UVM构建测试平台时调用`uvm_info时发现波形中信号变化的时间和`uvm_info显示的时间不一致(本文以`uvm_info为例说明),并且使用UVM-1.1和UVM-1.2居然`uvm_info显示的时间还不一样,这到底是怎么回事儿呢?下面本文将通过追究下到底是什么原因导致的,并且给出自定义消息格式的一些方法。

【示例】

5e42558e-6139-11ee-939d-92fbcf53809c.png

【仿真结果】 使用UVM-1.1进行仿真

5e6d1f30-6139-11ee-939d-92fbcf53809c.png

【仿真结果】 使用UVM-1.2进行仿真

5e82a800-6139-11ee-939d-92fbcf53809c.png

通过上面两个示例结果我们发现UVM-1.2和UVM-1.1的结果相差还是比较大的,并且UVM-1.2仿真波形结果与log信息差别还是比较大的,这是为什么呢?下面一块挖掘下这到底是为啥?

【使用UVM-1.1进行仿真现象分析】

首先我们知道`uvm_info实际上都来自于下图中这个宏,其中实现打印的实际上是uvm_report_info这个function,所以需要关心下uvm_report_info怎么实现的。

5e9b6f98-6139-11ee-939d-92fbcf53809c.png

uvm_report_info这个function定义在uvm_globals.svh中,如下图。

5ea7c2de-6139-11ee-939d-92fbcf53809c.png

在这个方法中,可以看到uvm_report_info的主要实现是通过uvm_root这个类中的uvm_report_info这个方法实现的,下面我们继续查找uvm_root这个类,在uvm_root中并没有找到这个方法的实现,所以继续查找uvm_root的父类uvm_component,很遗憾,uvm_component里头也么有uvm_report_info这个方法的实现,那么这个哥们去哪里呢?uvm_component还有一个父类是uvm_report_object,在uvm_report_object.svh中定义的uvm_report_object类中找到了uvm_report_object这个方法的定义,如下图。

5ec8f774-6139-11ee-939d-92fbcf53809c.png

从上面代码中可以看到uvm_report_info中通过m_rh调用了report()这个方法,这个方法来自于句柄m_rh的类型,在uvm_report_object类中m_rh的类型从上述代码中可以看到是uvm_report_handler,所以report()这个方法至少应该来自于uvm_report_handler中,下面是在uvm_report_handler这个类找到的report方法的定义,如下图。

5ee5fa68-6139-11ee-939d-92fbcf53809c.png

在report()方法中,又通过srvr这个句柄调用了report方法,此时的这个report方法至少应该在srvr这个句柄的类型uvm_report_server这个类中,uvm_report_sever这个类中果然有report这个方法的定义,如下图。

5efd8976-6139-11ee-939d-92fbcf53809c.png

在report这个方法中实际上实现输出消息的是通过process_report这个方法,但是在这个方法中并没有关于时间显示的信息,关于时间信息实际上是来自于compose_message这个方法,如上图。在compose_message这个方法中实现了当前仿真时间的获取(如图中红色阴影),可以看到这个时间是通过$realtime获取的,而$realtime获取的时间是一个实数,但是在显示的时间受$timeformat设置的默认值的影响,即此时显示的时间单位是该语句执行时所在域的时间精度,所以此时我们看到`uvm_info调用时在log中显示的时间是一个五位数,与波形上期望的小数有一些差异,如果期望对这个数据显示格式进行约束,可以在顶层调用`uvm_info宏之前通过$timeformat进行设置。

【使用UVM-1.2进行仿真现象分析】

在UVM-1.2中关于`uvm_info的分析在uvm_message_defines.svh、uvm_globals.svh、uvm_root.svh、uvm_component.svh和UVM-1.1基本是一样的,没有太大变化,但是在uvm_report_object.svh中有一些差异。在uvm_report_object中,uvm_report_info方法的定义如下。

5f2a655e-6139-11ee-939d-92fbcf53809c.png

在uvm_report_object中,uvm_report_info方法调用了uvm_report这个方法,uvm_report这个方法中实现信息处理的是uvm_process_report_message这个方法,此方法中实现信息处理的实际上是通过其中的m_rh.process_report_message实现的,所以m_rh调用的这个方法应该在m_rh这个句柄的类型定义中,而m_rh的类型为uvm_report_handler,所以关于消息打印的追踪进入到uvm_report_handler中,在uvm_report_handler中process_report_message的定义如下图所示。

5f3ee9e8-6139-11ee-939d-92fbcf53809c.png

在uvm_report_handler中process_report_message的定义中,实际上对于信息处理的来自于srver.process_report_message,而srver这个句柄的类型为uvm_report_server,所以process_report_message至少来自于uvm_report_server,打开uvm_report_server.svh着实被惊喜到了,因为在uvm_report_server中process_report_message是个纯虚方法,其定义如下。

5f551c22-6139-11ee-939d-92fbcf53809c.png

那么process_report_message要实现功能,必须在uvm_report_server的一个子类中实现,在UVM-1.2中这个子类就是uvm_default_report_server,在uvm_default_report_server中process_report_message的定义如下。

5f68cc5e-6139-11ee-939d-92fbcf53809c.png

这个方法中,处理信息的实际上是compose_report_message,这个方法虽然是通过svr(uvm_report_server)调用的,所以此时的compose_report_message()其实也来自于uvm_report_server的子类中,其定义如下。

5f91d9a0-6139-11ee-939d-92fbcf53809c.png

在compose_report_message这个方法中实现了当前仿真时间的获取(如图中红色阴影),可以看到这个时间是通过$time(注意:这里与UVM-1.1不同)获取的,而$time获取的时间是一个整型数据,并且此时显示的时间也受$timeformat设置的默认值的影响,即此时显示的时间单位是该语句执行时所在域的时间精度,所以此时我们看到`uvm_info调用时在log中显示的时间是一个五位数并且只保留了对应时间单位的整数部分数字,显示的时间就与波形上期望的小数存在了较大的差异,此时虽然可以通过$timeformat进行设置,但是也不会获得时间精度对应的具体小数部分的数字了。

那么,既然库里提供的默认显示时间与用户期望的不一致,有没有办法可以解决呢?其实只要注意是上述最终实现消息字符串的实际上都是虚方法,那么就可以通过派生子类重写该方法,然后将子类句柄指向的对象传递给实现消息机制的父类句柄,从而就可以实现对于消息机制的重定义了。下面我们通过一个示例来说明如何自定义消息格式,同样的分别针对UVM-1.1和UVM-1.2进行示例说明如何定制消息格式。

【UVM-1.1消息格式定制】

第一步:定义usr_report_server(类名根据需要自定义)类,因为UVM中消息最终实现都是在uvm_report_server中,所以usr_report_server也拓展自uvm_report_server。

5fb62756-6139-11ee-939d-92fbcf53809c.png

第二步:在用户拓展自uvm_test的测试类的build_phase中,声明一个第一步定义的usr_report_server类的句柄usr_svr,并且在build_phase中将其通过new函数创建对象;第三步:在build_phase中将指向创建好对象的句柄usr_svr传递给uvm_report_server::set_server(usr_svr),代码如下例。

5fc17804-6139-11ee-939d-92fbcf53809c.png

第四步:运行仿真,下面是仿真实例结果。

5fd59dd4-6139-11ee-939d-92fbcf53809c.png

【UVM-1.2消息格式定制】

第一步:定义usr_report_server(类名根据需要自定义)类,因为UVM中消息最终实现都是在uvm_default_report_server中,所以usr_report_server也拓展自uvm_default_report_server。

5fe53924-6139-11ee-939d-92fbcf53809c.png

第二步:在用户拓展自uvm_test的测试类的build_phase中,声明一个第一步定义的usr_report_server类的句柄usr_svr,并且在build_phase中将其通过new函数创建对象;

第三步:在build_phase中将指向创建好对象的句柄usr_svr传递给uvm_report_server::set_server(usr_svr),代码同【UVM-1.1消息格式定制】第三步的代码截图;

第四步:运行仿真,下面是仿真实例结果。

5ff9a684-6139-11ee-939d-92fbcf53809c.png

通过上述方式,用户就可以自己定义显示消息的方法,并且可以根据需要控制显示时间等信息。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19191

    浏览量

    229311
  • 仿真器
    +关注

    关注

    14

    文章

    1016

    浏览量

    83676
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    19149

原文标题:UVM消息打印机制打印的时间跟波形时间不一样

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    pdf打印机怎么打印excel

    `经常工作的人应该知道,对于excel表格在工作的时候用的是非常多的,有时候我们也会遇到要打印的情况,那么pdf打印机怎么打印excel
    发表于 08-08 16:27

    打印雕刻激光怎么可以像打印机一样下位机直接与pc通讯后执

    新手不知道问题应该怎么问因为理性上 不理解找了很多相关资料还是没找首先不管是打印雕刻还是激光都是上位机和下位机那么图像文字是通过上位机与下位机通讯执行的怎么可以像打印机一样下位机直接
    发表于 01-14 09:09

    MEGA-X 3D打印机教程更换步进电机驱动

    电机驱动器是真的垃圾,打印的时候噪音极大,这可能不同人感受不一样,这个没更换步进电机之前,打印时候的噪音基本在80dB左右,很多时候听着刺耳。以至于我白天在家写代码都需要带着耳机才行,晚上就别说了。这次更换的是TMC2208步进
    发表于 06-29 06:58

    热升华打印机打印时间

    热升华打印机打印时间              打印
    发表于 12-23 14:18 1093次阅读

    打印机的首页输出时间

    打印机的首页输出时间      &n
    发表于 12-29 09:56 642次阅读

    打印机的功率

    打印机的功率           我们经常提到的打印机的功率,般指的是打印机的额定
    发表于 12-29 10:33 1w次阅读

    视频打印机打印时间/打印纸尺寸

    视频打印机打印时间/打印纸尺寸      视频打印机打印
    发表于 12-31 10:23 713次阅读

    喷墨打印机常见问题

    喷墨打印机常见问题1、打印打开机之后会有异常响声怎么回事?     打印机在开机之后有异常响声,原因有二个:
    发表于 01-14 10:51 1186次阅读

    打印机的种类

    本视频主要详细介绍了打印机的种类,分别是便携式打印机、墨仓式(加墨式)打印机、激光打印机、喷墨打印机
    的头像 发表于 04-11 14:26 1.3w次阅读

    兄弟打印机怎么_兄弟打印机的使用方法

    现在市场上的打印机的种类和品牌众多,打印机品牌中兄弟打印机的知名度不及惠普打印机,所以很多人并不了解兄弟这个打印机品牌。那么兄弟
    的头像 发表于 04-10 09:50 1.3w次阅读

    RFID打印机和条码打印机的区别

    RFID打印机和条码打印机有哪些区别?用于条码打印的叫做条码打印机,RFID打印机就是在般的条
    发表于 08-07 17:37 2188次阅读

    影响着3D打印机价格的原因有哪些?

    3D打印机按照不一样技术种类价格也不一样。从最简单的千元级FDM桌面机3D打印到最现代化的FDM工业级3D打印机
    的头像 发表于 09-17 16:56 2534次阅读

    FDM桌面级3D打印机的定义与应用

    FDM是由3D打印机的成型方法不一样而分的,FDM即FusedDepositionModeling的简称,意为熔融沉积成型。
    的头像 发表于 12-26 11:20 1398次阅读

    winxp系统中打印机提示无法设置默认打印机怎么办

    无法设置默认打印机,这是怎么回事,针对这个问题,就给大家分享下winxp系统中打印机无法使用提示无法设置默认
    发表于 02-03 15:17 2162次阅读
    winxp系统中<b class='flag-5'>打印机</b>提示无法设置默认<b class='flag-5'>打印机</b>怎么办

    canon打印机打印出来是空白的怎么回事?

    佳能打印机打印出来是空白的,可能是由多种原因导致的。以下是些可能的原因和相应的解决方法: 检查墨盒: 确保墨盒已正确安装在打印机中。 检查墨盒是否已用完或接近用完。如果是这样,请更换
    的头像 发表于 06-16 09:10 1.3w次阅读