验证平台必须监测DUT的行为,只有知道DUT的输入输出信号变化之后,才能根据这些信号变化来判定DUT的行为是否正确。

验证平台中实现监测DUT行为的组件是monitor。driver负责把transaction级别的数据转变成DUT的端口级别,并驱动给DUT,monitor的行为与其相对,用于收集DUT的端口数据,并将其转换成transaction交给后续的组件如reference model、scoreboard等处理。

一个monitor的定义如下:


代码清单 2-29

文件:src/ch2/section2.3/2.3.3/my_monitor.sv

  3 class my_monitor extends uvm_monitor;
  4
  5    virtual my_if vif;
  6
  7    `uvm_component_utils(my_monitor)
  8    function new(string name = "my_monitor", uvm_component parent = null);
  9       super.new(name, parent);
 10    endfunction
 11
 12    virtual function void build_phase(uvm_phase phase);
 13       super.build_phase(phase);
 14       if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
 15          `uvm_fatal("my_monitor", "virtual interface must be set for vif!!!")
 16    endfunction
 17
 18    extern task main_phase(uvm_phase phase);
 19    extern task collect_one_pkt(my_transaction tr);
 20 endclass
 21
 22 task my_monitor::main_phase(uvm_phase phase);
 23    my_transaction tr;
 24    while(1) begin
 25       tr = new("tr");
 26       collect_one_pkt(tr);
 27    end
 28 endtask
 29
 30 task my_monitor::collect_one_pkt(my_transaction tr);
 31    bit[7:0] data_q[$];
 32    int psize;
 33    while(1) begin
 34      @(posedge vif.clk);
 35      if(vif.valid) break;
 36    end
 37
 38    `uvm_info("my_monitor", "begin to collect one pkt", UVM_LOW);
 39    while(vif.valid) begin
 40       data_q.push_back(vif.data);
 41       @(posedge vif.clk);
 42    end
 43    //pop dmac
 44    for(int i = 0; i < 6; i++) begin
 45       tr.dmac = {tr.dmac[39:0], data_q.pop_front()};
 46    end
 47    //pop smac
 …
 51    //pop ether_type
 …
 58    //pop payload
 …
 62    //pop crc
 63    for(int i = 0; i < 4; i++) begin
 64       tr.crc = {tr.crc[23:0], data_q.pop_front()};
 65    end
 66    `uvm_info("my_monitor", "end collect one pkt, print it:", UVM_LOW);
 67    tr.my_print();
 68 endtask


有几点需要注意的是:

第一,所有的monitor类应该派生自uvm_monitor;

第二,与driver类似,在my_monitor中也需要有一个virtual my_if;

第三,uvm_monitor在整个仿真中是一直存在的,所以它是一个component,要使用uvm_component_utils宏注册;

第四,由于monitor需要时刻收集数据,永不停歇,所以在main_phase中使用while(1)循环来实现这一目的。

在查阅collect_one_pkt的代码时,可以与my_driver的drv_one_pkt对比来看,两者代码非常相似。当收集完一个transaction后,通过my_print函数将其打印出来。my_print在my_transaction中定义如下:


代码清单 2-30
文件:src/ch2/section2.3/2.3.3/my_transaction.sv
 31    function void my_print();
 32      $display("dmac = %0h", dmac);
 33      $display("smac = %0h", smac);
 34      $display("ether_type = %0h", ether_type);
 35      for(int i = 0; i < pload.size; i++) begin
 36        $display("pload[%0d] = %0h", i, pload[i]);
 37      end
 38      $display("crc = %0h", crc);
 39    endfunction


当完成monitor的定义后,可以在env中对其进行实例化:


代码清单 2-31
文件:src/ch2/section2.3/2.3.3/my_env.sv
  4 class my_env extends uvm_env;
  5
  6   my_driver drv;
  7   my_monitor i_mon;
  8
  9   my_monitor o_mon;
 …
 15   virtual function void build_phase(uvm_phase phase);
 16     super.build_phase(phase);
 17     drv = my_driver::type_id::create("drv", this);
 18     i_mon = my_monitor::type_id::create("i_mon", this);
 19     o_mon = my_monitor::type_id::create("o_mon", this);
 20   endfunction
 …
 23 endclass


需要引起注意的是这里实例化了两个monitor,一个用于监测DUT的输入口,一个用于监测DUT的输出口。

DUT的输出口设置一个monitor没有任何疑问,但是在DUT的输入口设置一个monitor有必要吗?

由于transaction是由driver产生并输出到DUT的端口上,所以driver可以直接将其交给后面的reference model。

在2.1节所示的框图中,也是使用这样的策略。所以是否使用monitor,这个答案仁者见仁,智者见智。这里还是推荐使用monitor,原因是:

第一,在一个大型的项目中,driver根据某一协议发送数据,而monitor根据这种协议收集数据,如果driver和monitor由不同人员实现,那么可以大大减少其中任何一方对协议理解的错误;

第二,在后文将会看到,在实现代码重用时,使用monitor是非常有必要的。

现在,整棵UVM树的结构如图2-4所示。

在env中实例化monitor后,要在top_tb中使用config_db将input_if和output_if传递给两个monitor:


代码清单 2-32

文件:src/ch2/section2.3/2.3.3/top_tb.sv

 47 initial begin
48    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.drv", "vif", input_if);
49    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.i_mon", "vif", input_if);
50    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.o_mon", "vif", output_if);
 51 end

*2.3.3-加入monitor的更多相关文章

  1. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  2. API Monitor简介(API监控工具)

    API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...

  3. 创建 Monitor 并测试 - 每天5分钟玩转 OpenStack(124)

    前面我们创建了 Pool,VIP 并添加了 Member.今天将创建 Monitor,然后测试 LBaaS 是否能够正常工作. 创建 Monitor LBaaS 可以创建 monitor,用于监控 P ...

  4. 11g新特性:Health Monitor Checks

    一.什么是Health Monitor ChecksHealth Monitor Checks能够发现文件损坏,物理.逻辑块损坏,undo.redo损坏,数据字典损坏等等.Health Monitor ...

  5. Guava monitor

    Guava的com.google.util.concurrent类库提供了相对于jdk java.util.concurrent包更加方便实用的并发类,Monitor类就是其中一个.Monitor类在 ...

  6. DAC Usage3:Monitor Data-tier Applications

    If you deploy a DAC to a managed instance of the Database Engine, information about the deployed DAC ...

  7. C# 对象锁——Monitor

    Monitor里边有一些static方法,可以用于在对象上获取同步锁,来进行一些进程同步控制操作 用法及注意点如下: using System; using System.Collections.Ge ...

  8. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  9. sql monitor生成不了报告& FFS hint不生效两个问题思考

    事情的发生就是这么偶然,一步步的深入才能汲取到更深入的知识~~ -------------------START------------------------------------------- ...

  10. [转载]抓包,端口镜像,monitor session命令(转)

    原文地址:抓包,端口镜像,monitor session命令(转)作者:浮云皓月 一.SPAN简介 SPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN. --Lo ...

随机推荐

  1. [javascript][翻译]使用javascript添加css rule

    来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...

  2. cesium编程中级(二)源码编译

    cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...

  3. kvm快照备份及常用命令

    转载自:http://www.myjishu.com/?p=431 好文章 kvm快照备份及常用命令 kvm快照,分两种: 1种lvm快照,如果分区是lvm,可以利用lvm进行kvm的快照备份 2种由 ...

  4. BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 755  Solved: 432[Submit][Status][Discuss] ...

  5. Vulnhub Acid

    1.信息收集 1.1.netdiscover netdiscover -i eth0 -r 192.168.118.0/24 1.2. Nmap nmap -sP -T4 192.168.118.0/ ...

  6. 引入阿里的druid

    Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. Druid支持所有JDBC兼容的数据库,包括 ...

  7. httpclient4.5 https请求 忽略身份验证

    import org.apache.commons.collections.MapUtils; import org.apache.http.*; import org.apache.http.cli ...

  8. 部署LVS-NAT群集

    案例环境 LVS调度器作为Web服务器池的网关,LVS两块网卡,分别连接内外网,外网地址172.16.16.172.24,同时也作为整个群集的VIP,内网地址为192.168.7.21-24/24,是 ...

  9. Spring Boot 中使用 jpa

    本文原文版权归 CSDN Hgihness 所有,此处为转载+技术收藏,如有再转请自觉于篇头处标明原文作者及出处,这是大家对作者劳动成果的自觉尊重!! 作者:Hgihness 原文:http://bl ...

  10. python中type、class、object的区别

    type 一. type可以用来返回一个对象的类型 例如: 二. 由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点.type的 ...