3.4 学习UVM中的uvm_monitor类分为几步?

文章目录

  • 前言
  • 1. 定义
  • 2. 核心功能
  • 3. 适用场景
  • 4. 使用方法
  • 5. 完整代码示例
    • 5.1 事务类定义
    • 5.2 Monitor 类定义
    • 5.3 Scoreboard 类定义
    • 5.4 测试平台
  • 6. 代码说明
  • 7. 总结


前言

以下是关于 UVM 中 uvm_monitor 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例:


1. 定义

uvm_monitor 是 UVM(Universal Verification Methodology)中的一个重要组件类,用于监控 DUT(Design Under Test)的接口行为。它负责采集 DUT 的信号活动并将其转换为高层次的事务(transaction),然后将这些事务发送给其他组件(如 uvm_scoreboarduvm_subscriber)进行分析和检查。

uvm_monitor 的主要特点:

  • 被动组件,不驱动信号,仅监控信号。
  • 将信号活动转换为事务。
  • 是 UVM 测试平台中用于数据采集和分析的关键组件。

2. 核心功能

uvm_monitor 提供了以下核心功能:

  • 信号监控:监控 DUT 的接口信号,捕捉信号变化。
  • 事务转换:将捕捉到的信号转换为高层次的事务。
  • 数据广播:通过 Analysis Port(uvm_analysis_port)将事务广播给其他组件(如 uvm_scoreboard)。
  • 协议检查:在监控过程中检查协议是否符合预期。

3. 适用场景

uvm_monitor 通常用于以下场景:

  • 接口监控:监控 DUT 的输入或输出接口(如 AXI、APB、SPI 等)。
  • 协议检查:检查接口信号是否符合协议规范。
  • 数据采集:采集 DUT 的行为数据,用于功能覆盖率和性能分析。
  • 事务广播:将采集到的事务发送给其他组件进行进一步处理。

4. 使用方法

使用 uvm_monitor 的步骤如下:

  1. 定义类:从 uvm_monitor 派生一个类,并定义其属性和方法。
  2. 实现监控逻辑:在 run_phase 中实现信号监控和事务转换逻辑。
  3. 广播事务:通过 uvm_analysis_port 将事务广播给其他组件。
  4. 连接组件:在测试平台中将 uvm_monitor 与其他组件(如 uvm_scoreboard)连接。

5. 完整代码示例

以下是一个完整的代码示例,展示如何使用 uvm_monitor 监控 DUT 的接口行为。

5.1 事务类定义

// 定义一个从 uvm_sequence_item 派生的事务类
class my_transaction extends uvm_sequence_item;bit [7:0] data;bit [3:0] addr;bit       valid;// 注册类到 UVM 工厂`uvm_object_utils(my_transaction)// 构造函数function new(string name = "my_transaction");super.new(name);endfunction// 实现 print 方法virtual function void do_print(uvm_printer printer);printer.print_field("data",  this.data,  8);printer.print_field("addr",  this.addr,  4);printer.print_field("valid", this.valid, 1);endfunctionendclass

5.2 Monitor 类定义

// 定义一个从 uvm_monitor 派生的监控类
class my_monitor extends uvm_monitor;// 定义 analysis portuvm_analysis_port #(my_transaction) ap;// 虚拟接口(用于访问 DUT 信号)virtual my_interface vif;// 注册类到 UVM 工厂`uvm_component_utils(my_monitor)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);ap = new("ap", this);endfunction// 实现 run_phasevirtual task run_phase(uvm_phase phase);forever beginmy_transaction tx;// 等待信号有效@(posedge vif.clock iff vif.valid);// 创建事务对象tx = my_transaction::type_id::create("tx");// 捕捉信号并转换为事务tx.data  = vif.data;tx.addr  = vif.addr;tx.valid = vif.valid;// 打印事务`uvm_info("MONITOR", $sformatf("Captured transaction: data=0x%0h, addr=0x%0h, valid=%b", tx.data, tx.addr, tx.valid), UVM_LOW)// 通过 analysis port 广播事务ap.write(tx);endendtaskendclass

5.3 Scoreboard 类定义

// 定义一个从 uvm_scoreboard 派生的记分板类
class my_scoreboard extends uvm_scoreboard;// 注册类到 UVM 工厂`uvm_component_utils(my_scoreboard)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunction// 实现 write 方法(用于接收事务)virtual function void write(my_transaction tx);`uvm_info("SCOREBOARD", $sformatf("Received transaction: data=0x%0h, addr=0x%0h, valid=%b", tx.data, tx.addr, tx.valid), UVM_LOW)// 在这里添加事务检查逻辑endfunctionendclass

5.4 测试平台

// 测试平台
module testbench;initial begin// 创建 env 类class my_env extends uvm_env;my_monitor    monitor;my_scoreboard scoreboard;// 注册类到 UVM 工厂`uvm_component_utils(my_env)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunction// 构建组件virtual function void build_phase(uvm_phase phase);monitor    = my_monitor::type_id::create("monitor", this);scoreboard = my_scoreboard::type_id::create("scoreboard", this);endfunction// 连接组件virtual function void connect_phase(uvm_phase phase);monitor.ap.connect(scoreboard.write);endfunctionendclass// 创建测试类class my_test extends uvm_test;my_env env;// 注册类到 UVM 工厂`uvm_component_utils(my_test)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunction// 构建组件virtual function void build_phase(uvm_phase phase);env = my_env::type_id::create("env", this);endfunction// 运行测试virtual task run_phase(uvm_phase phase);phase.raise_objection(this);#100; // 模拟测试运行时间phase.drop_objection(this);endtaskendclass// 启动测试initial beginrun_test("my_test");endend
endmodule

6. 代码说明

  • 事务类my_transaction 定义了事务的属性和方法。
  • Monitor 类my_monitoruvm_monitor 派生,实现了信号监控和事务转换逻辑,并通过 uvm_analysis_port 广播事务。
  • Scoreboard 类my_scoreboard 用于接收事务并进行检查。
  • 测试平台my_envmy_test 类用于构建和运行测试环境。

7. 总结

uvm_monitor 是 UVM 中用于监控 DUT 接口行为的关键组件。它负责采集信号并将其转换为事务,然后将事务广播给其他组件进行分析和检查。以上示例展示了如何定义和使用 uvm_monitor,适用于实际的验证场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15964.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ Primer 类型转换

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

.Net使用EF Core框架如何连接Oracle

目录 一、Nutget包添加 二、 配置文件 三、创建实体类 四、创建数据库上下文类 五、将数据库上下文服务注册到容器 六、测试数据库数据 (1)编写PeopleController (2)编写People页面 一、Nutget包添加 一定要安装Oracle.Ma…

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题:考生文件夹(注意&#x…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

【Flink源码分析】5. Flink1.19源码分析-异步编程(CompletableFuture)

5 CompletableFuture 实现异步编排;获取异步任务执行的结果。 CompletableFuture提供了几十种方法,辅助我们的异步任务场景。这些方法包括创建异步任务、异步任务回调、多个任务组合处理等方面。 5.1 supplyAsync 方法 supplyAsync 执行 Completable…

LabVIEW在呼吸机测试气体容量计算

在呼吸机测试中,精确测量气体容量变化是评估设备性能的关键步骤。通过监测呼吸机气道内的压力变化,并结合流阻和肺顺应性等参数,可以计算出单位时间内的气体容量变化。本案例基于LabVIEW实现该计算过程,以确保测试数据的准确性和一…

Lombok使用指南

引言 lombok作为减少我们代码量的利器,本文将列举常用的几个注解,来帮助减少代码量 注解及其功能 Getter 和 Setter import lombok.Getter; import lombok.Setter;Getter Setter public class Person {private String name;private int age; } …

JAVA学习第一天

String的构造方法-118 String创建对象的特点——119 String字符串的比较——120 字符串的遍历——122 两个函数:length(),charAt() StringBuilder——127 String的内容是不可变的 StringBuilder的内容是可变…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡,都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关,需要用工具拦截请求修改请求头部才行。 Less18(User-Agent注入) 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

Spring依赖注入方式

写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…

arcgis界址点编号工具开发原理(西北角顺时针)

arcgis界址点编号工具开发原理(西北角顺时针) 1、工具实现思路。寻找离包络矩形左顶角最近的点作为起点。如下图:距离包络矩形左顶角最近的点,作为J1点没有任何问题。 问题在于并不是所有的地块,都这么中规中矩、合情…

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题,并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制,以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…

生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】

随着生物信息学的快速发展,基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而,个人电脑在处理这些任务时往往面临性能瓶颈,如内存不足、运算速度慢等问题,导致分析任务频繁失败或崩溃。为了解决这一难题&#xf…

[AUTOSAR通信] - PDUR模块解读

点击订阅专栏不迷路 文章目录 一、 PDUR模块概述二、功能描述2.1 发送路由功能2.2 接收路由功能2.3 网关路由功能2.4 路由控制功能 三、配置項介紹3.1. PduRBswModules3.2. PduRGeneral3.3. PduRRoutingTables3.4. PduRRoutingPath3.5. PduRSrcPdu3.6. PduRDestPdu 四、总结 &g…

分治下的快速排序(典型算法思想)—— OJ例题算法解析思路

目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用…

PDF Shaper:免费多功能 PDF 工具箱,一站式满足您的 PDF 需求!

​PDF Shaper 是一款功能强大且完全免费的 PDF 工具箱,它几乎涵盖了日常 PDF 操作的方方面面,无论是转换、编辑还是处理,都能轻松搞定。以下是这款软件的详细介绍: 功能丰富,一应俱全 PDF 转换功能强大 PDF 转 Word&am…

未来替代手机的产品,而非手机的本身

替代手机的产品包括以下几种: 可穿戴设备:智能手表、智能眼镜等可穿戴设备可以提供类似手机的功能,如通话、信息推送、浏览网页等。 虚拟现实(VR)技术:通过佩戴VR头显,用户可以进行语音通话、发…

deepseek+“D-id”或“即梦AI”快速生成短视频

1、deepseek生成视频脚本 1.1、第一步:使用通用模板提出需求,生成视频脚本 对话输入示例脚本1: 大年初五是迎财神的日志,帮我生成10秒左右的短视频, 体现一家3口在院子里欢庆新年, 孩子在院子里放鞭炮烟…

在CT107D单片机综合训练平台上实现外部中断控制LED闪烁

引言 在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在…