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

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

3天内不再提示

UVM学习笔记(二)

冬至子 来源:多读点书 作者:夕文x 2023-05-26 14:43 次阅读

第2章一个简单的UVM验证平台

2.3 为验证平台加入各个组件

2.3.1 加入transaction

引入transaction目的:

  • 更规范地传递信息更方便地引入transaction级的随机激励 。(一般来说,物理协议中的数据交换都是以帧或者包为单位的,而transaction就类似于这里包的概念)

my_transaction派生自uvm_sequence_item,而uvm_sequence_item是uvm_object的派生类。

派生自uvm_object的类 vs 派生自uvm_component的类

1.jpg

主要流程如下:

  • 在main_phase中,先使用randomize将tr随机化,之后通过drive_one_pkt任务将tr的内容驱动到DUT的端口上。在drive_one_pkt中,先将tr中所有的数据 压入队列data_q中 ,之后再 将data_q中所有的数据弹出并驱动 。将tr中的数据压入队列data_q中的过程相当于打包成一个byte流的过程。

2.3.2 加入env

引入uvm_env的原因:

  • 解决多个并列关系模块(driver、 monitor、 reference model和scoreboard等)实例化问题

问题:

  1. 在top_tb中例化这几个模块不行:run_test在top_tb结构层次之外建立一个新的结构层次,模块间传值需要通过config_db机制
  2. 在run_test中例化这几个模块不行:run_test函数本身限制,只能实例化一个模块。
  3. 在driver中例化其他模块不行:会让这些模块具备父子关系,打破了他们之间的并列关系。

解决:

  • 引入env机制,提供一个容器类,该容器类中包含了多个并列关系的模块,然后用run_test来实例化这个容器类

在UVM的树形结构中, build_phase的执行遵照从树根到树叶的顺序。

2.3.3 加入monitor

引入monitor原因:

  • 监测DUT的行为(可以检测输出,也可以检测输入)

monitor与driver的比较

1.jpg

关于monitor使用的4点注意:

  1. 所有的monitor类应该派生自uvm_monitor
  2. 与driver类似,在my_monitor中也需要有一个virtual my_if
  3. 使用uvm_component_utils宏注册
  4. monitor需要时刻收集数据,所以在main_phase中要使用**while(1)**循环

2.3.4 封装成agent

引入agent的原因:

  • driver和monitor二者 处理的是同一种协议 ,代码高度相似,所以将两者封装在一起。 不同的agent就代表了不同的协议

图片

is_active是uvm_agent内置的一个成员变量,通过顶层传值,控制driver是否进行例化,且is_active的值默认为UVM_ACTIVE

  • UVM_PASSIVE:例化monitor而不需要例化driver(输出端口无需驱动)
  • UVM_ACTIVE:例化monitor,也需要例化driver(输入端口需要驱动)

例化动作可以在build_phase函数中完成,也可以在new函数中完成,但强烈建议仅在build_phase中完成实例化。

1.jpg

2.3.5 加入reference model

引入原因:

  • 完成和DUT相同的功能,作为DUT的参考模型

这里reference model对应的模块名为 my_model。my_model从i_agt得到my_transaction,并把my_transaction传递给my_scoreboard。在UVM中,通常使用 TLM( Transaction Level Modeling) 实现component之间transaction级别通信。my_transaction在my_model中的传递方式大致分为三部分:

  1. 在my_monitor中使用uvm_analysis_port类例化一个用于发送transaction级数据的端口,并通过my_agent中uvm_analysis_port的引用变量往my_env传递端口
  2. 在my_model中使用uvm_blocking_get_port类例化一个用于接收transaction级数据的端口
  3. 在my_env中使用uvm_tlm_analysis_fifo类例化一个fifo。引入 connect_phase ,将fifo的analysis_export端口连接到i_agt.ap,fifo的blocking_get_export端口连接到mdl.port。(mdl为my_model类的例化对象)
  4. 使用fifo的原因: analysis_port是非阻塞性质的 , ap.write函数调用完成后马上返回,不会等待数据被接收。

2.3.6 加入scoreboard

引入scoreboard作用:

  • 比较reference model和o_agt的monitor的结果。

多进程的使用:

  • 在my_scoreboard中使用uvm_blocking_get_port新建两个port:exp_port、act_port,并在main_phase中,通过fork建立起两个进程,一个进程处理exp_port的数据(ref),当收到数据后,把数据放入expect_queue中;另外一个进程处理act_port的数据(dut),当收集到这些数据后,从expect_queue中弹出之前从exp_port收到的数据,并调用my_transaction的my_compare函数。
  • 由于DUT处理数据需要延时,而reference model是基于高级语言的处理,一般 不需要延时 ,因此 可以保证exp_port的数据在act_port的数据之前到来

2.3.7 加入field_automation机制

引入field_automation机制的原因:

  • 自动实现my_transaction中print、copy、compare这样的比较常见的结构体操作,简化my_transaction的实现。同时默认的pack_bytes(tr中的各个字段转换成byte流)和unpack_bytes(byte流转换成tr中的各个字段)也简化了driver、monitor的实现。

使用uvm_object_utils_beginuvm_object_utils_end来实现my_transaction的factory注册,在这两个宏中间,使用uvm_field宏注册所有字段。

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

    关注

    0

    文章

    181

    浏览量

    19167
  • TLM
    TLM
    +关注

    关注

    1

    文章

    32

    浏览量

    24747
  • DUT
    DUT
    +关注

    关注

    0

    文章

    189

    浏览量

    12371
  • sequence
    +关注

    关注

    0

    文章

    23

    浏览量

    2840
收藏 人收藏

    评论

    相关推荐

    LabVIEW学习笔记 【第卷】

    之前在论坛上看见有人分享一本书——《LabVIEW学习笔记 》,觉得挺好,而且热度也很高。只不过第卷的附件丢失了,我试着下载,也下载不了。现找来第卷,与各位一起
    发表于 10-17 21:58

    新手学习System Verilog & UVM指南

    新手学习SystemVerilog & UVM指南 从刚接触System Verilog以及后来的VMM,OVM,UVM已经有很多年了,随着电子工业的逐步发展,国内对验证人才的需求也会急剧
    发表于 03-11 16:24

    我的EMC学习笔记

    本帖最后由 林雪凉 于 2015-12-1 20:31 编辑 好久没有学习了,都快忘记了。这是整理的第部分学习笔记。 另外,这个是第一部分的:https://bbs.elecf
    发表于 12-01 20:23

    IC验证"为什么要学习UVM呢"

    推出了RGM,补上了这一短板。只是很遗憾的是,RGM并没有成为OVM的一部分,要想使用RGM,需要额外下载。现在OVM已经停止更新,完全被UVM代替。UVM(Universal
    发表于 12-01 15:09

    IC验证之UVM常用宏汇总分析(四)

    宏,它有两种定义方式,一是直接在源文件中中使用define进行定义:`define MACRO 或者: `define MACRO 100是在编译时的命令行中使用如下的方式
    发表于 12-02 15:24

    数字IC验证之“什么是UVM”“UVM的特点”“UVM提供哪些资源”(2)连载中...

    uvm的特点以及uvm为用户提供了哪些资源?什么是uvm呢?uvm是通用验证方法学的缩写,是为验证服务的,uvm是基于systemveri
    发表于 01-21 16:00

    什么是uvmuvm的特点有哪些呢

    大家好,我是一哥,上章内容我们介绍什么是uvmuvm的特点以及uvm为用户提供了哪些资源?本章内容我们来看一看一个典型的uvm验证平台应该是什么样子的,来看一个典型的
    发表于 02-14 06:46

    谈谈UVM中的uvm_info打印

      uvm_info宏的定义如下:  `define uvm_info(ID,MSG,VERBOSITY) \  begin \  if (uvm_report_enabled(VERBOSITY
    发表于 03-17 16:41

    Modelsim uvm库编译及执行

    第一句话是设置uvm环境变量,指定uvm的dpi位置。 第句话是创建work工作目录。 第三句话是编译源文件,并且通过-L指定几个编译库。 第三句是执行仿真,调用uvm
    的头像 发表于 12-01 11:25 3870次阅读
    Modelsim <b class='flag-5'>uvm</b>库编译及执行

    UCOSIII学习笔记)任务管理、Hook函数、中断

    UCOSIII学习笔记)文章目录UCOSIII学习笔记)一、UCOSIII任务管理1、任
    发表于 12-23 19:58 4次下载
    UCOSIII<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(<b class='flag-5'>二</b>)任务管理、Hook函数、中断

    UVM学习笔记(一)

    driver应该派生自uvm_driver,而uvm_driver派生自uvm_component。
    的头像 发表于 05-26 14:38 1375次阅读
    <b class='flag-5'>UVM</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(一)

    UVM学习笔记(三)

    sequence机制作用:用于产生激励。其分为两部分,一是sequence,是sequencer。
    的头像 发表于 05-26 14:46 1145次阅读
    <b class='flag-5'>UVM</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(三)

    UVMuvm_config_db机制背后的大功臣

    本次讲一下UVM中的uvm_config_db,在UVM中提供了一个内部数据库,可以在其中存储给定名称下的值,之后可以由其它TB组件去检索。
    的头像 发表于 06-20 17:28 1408次阅读

    UVMuvm_config_db机制背后的大功臣

    本次讲一下UVM中的uvm_config_db,在UVM中提供了一个内部数据库,可以在其中存储给定名称下的值,之后可以由其它TB组件去检索。
    的头像 发表于 06-29 16:57 1275次阅读

    一文详解UVM设计模式

    本篇是对UVM设计模式 ( ) 参数化类、静态变量/方法/类、单例模式、UVM_ROOT、工厂模式、UVM_FACTORY[1]中单例模式的补充,分析静态类的使用,
    的头像 发表于 08-06 10:38 1763次阅读
    一文详解<b class='flag-5'>UVM</b>设计模式