3.6 学习UVM中的uvm_sequencer类分为几步?

文章目录

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


前言

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


1. 定义

uvm_sequencer 是 UVM(Universal Verification Methodology)中的一个关键组件类,用于管理事务(transaction)的生成和调度。它与 uvm_driver 配合使用,负责将事务从序列(sequence)传递到 uvm_driver,从而驱动 DUT(Design Under Test)的接口。

uvm_sequencer 的主要特点:

  • 管理事务的生成和调度。
  • uvm_driver 通过 TLM(Transaction Level Modeling)接口通信。
  • 支持多个序列的并行执行和优先级控制。

2. 核心功能

uvm_sequencer 提供了以下核心功能:

  • 事务调度:从序列中获取事务并将其传递给 uvm_driver
  • 序列管理:支持多个序列的启动、停止和优先级控制。
  • 通信接口:通过 seq_item_exportseq_item_portuvm_driver 通信。
  • 仲裁机制:支持多个序列的仲裁,确保事务按预期顺序传递。

3. 适用场景

uvm_sequencer 通常用于以下场景:

  • 事务生成:用于生成和调度事务,驱动 DUT 的接口。
  • 序列控制:管理多个序列的执行顺序和优先级。
  • 复杂激励生成:支持层次化序列和虚拟序列,生成复杂的测试场景。

4. 使用方法

使用 uvm_sequencer 的步骤如下:

  1. 定义类:从 uvm_sequencer 派生一个类(通常直接使用 uvm_sequencer,无需派生)。
  2. 连接 Driver:在 uvm_agent 中将 uvm_sequenceruvm_driver 连接。
  3. 创建序列:定义从 uvm_sequence 派生的序列类,生成事务。
  4. 启动序列:在测试中启动序列,生成事务并传递给 uvm_driver

5. 完整代码示例

以下是一个完整的代码示例,展示如何使用 uvm_sequencer 管理事务的生成和调度。

5.1 事务类定义

// 定义一个从 uvm_sequence_item 派生的事务类
class my_transaction extends uvm_sequence_item;rand bit [7:0] data;rand 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 Driver 类定义

// 定义一个从 uvm_driver 派生的驱动类
class my_driver extends uvm_driver #(my_transaction);// 注册类到 UVM 工厂`uvm_component_utils(my_driver)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunction// 实现 run_phasevirtual task run_phase(uvm_phase phase);forever beginmy_transaction tx;// 从 sequencer 获取事务seq_item_port.get_next_item(req);// 打印事务`uvm_info("DRIVER", $sformatf("Driving transaction: data=0x%0h, addr=0x%0h, valid=%b", req.data, req.addr, req.valid), UVM_LOW)// 将事务转换为信号激励(这里用延时模拟驱动过程)#10;// 通知 sequencer 事务处理完成seq_item_port.item_done();endendtaskendclass

5.3 Sequencer 类定义

// 定义一个从 uvm_sequencer 派生的 sequencer 类
class my_sequencer extends uvm_sequencer #(my_transaction);// 注册类到 UVM 工厂`uvm_component_utils(my_sequencer)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunctionendclass

5.4 Sequence 类定义

// 定义一个从 uvm_sequence 派生的序列类
class my_sequence extends uvm_sequence #(my_transaction);// 注册类到 UVM 工厂`uvm_object_utils(my_sequence)// 构造函数function new(string name = "my_sequence");super.new(name);endfunction// 实现 body 方法virtual task body();my_transaction tx;// 生成 10 个事务for (int i = 0; i < 10; i++) begintx = my_transaction::type_id::create("tx");// 随机化事务if (!tx.randomize()) `uvm_error("RAND", "Randomization failed")// 发送事务到 sequencer`uvm_info("SEQUENCE", $sformatf("Generated transaction: data=0x%0h, addr=0x%0h, valid=%b", tx.data, tx.addr, tx.valid), UVM_LOW)start_item(tx);finish_item(tx);endendtaskendclass

5.5 Agent 类定义

// 定义一个从 uvm_agent 派生的 agent 类
class my_agent extends uvm_agent;// 组件句柄my_driver    driver;my_sequencer sequencer;// 注册类到 UVM 工厂`uvm_component_utils(my_agent)// 构造函数function new(string name, uvm_component parent);super.new(name, parent);endfunction// 构建组件virtual function void build_phase(uvm_phase phase);driver    = my_driver::type_id::create("driver", this);sequencer = my_sequencer::type_id::create("sequencer", this);endfunction// 连接组件virtual function void connect_phase(uvm_phase phase);driver.seq_item_port.connect(sequencer.seq_item_export);endfunctionendclass

5.6 测试平台

// 测试平台
module testbench;initial begin// 创建 env 类class my_env extends uvm_env;my_agent agent;// 注册类到 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);agent = my_agent::type_id::create("agent", this);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);my_sequence seq;phase.raise_objection(this);seq = my_sequence::type_id::create("seq");seq.start(env.agent.sequencer); // 启动序列phase.drop_objection(this);endtaskendclass// 启动测试initial beginrun_test("my_test");endend
endmodule

6. 代码说明

  • 事务类my_transaction 定义了事务的属性和方法。
  • Driver 类my_driver 用于驱动事务到 DUT。
  • Sequencer 类my_sequencer 用于管理事务的调度。
  • Sequence 类my_sequence 用于生成事务并发送到 uvm_sequencer
  • Agent 类my_agent 封装了 uvm_driveruvm_sequencer
  • 测试平台my_envmy_test 类用于构建和运行测试环境。

7. 总结

uvm_sequencer 是 UVM 中用于管理事务生成和调度的关键组件。它与 uvm_driver 配合使用,负责将事务从序列传递到驱动层。通过 uvm_sequencer,可以实现复杂的激励生成和调度,适用于各种验证场景。以上示例展示了如何定义和使用 uvm_sequencer,适用于实际的验证环境。

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

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

相关文章

Java多线程——线程池的使用

线程饥饿死锁 在单线程的Executor中&#xff0c;如果任务A将任务B提交给同一个Executor&#xff0c;并且等待任务B的结果&#xff0c;就会引发死锁线程池中所有正在执行任务的线程由于等待其他仍处于工作队列中的任务而阻塞 执行时间较长的任务 执行时间较长的任务不仅会造成…

通过C模块中的Python API访问数组的数组

在 C 模块中通过 Python API 访问数组的数组&#xff08;即多维数组&#xff09;涉及到使用 Python C API 来处理 Python 对象和数据结构。在 C 代码中访问这种数据结构时&#xff0c;我们可以使用 Python 的对象访问方式&#xff0c;例如 PyList 或 PyArray&#xff08;如果你…

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构&#xff0c;创建类&#xff0c;编写main主函数&#xff0c;在控制台输出内容。…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展&#xff0c;智能家居逐渐成为现代生活的一部分。在众多智能家居应用中&#xff0c;智能灯光控制系统尤为重要。通过语音控制和自动调节灯光&#xff0c;用户可以更便捷地操作家中的照明设备&#xff0c;提高生活的舒适度与便利性。本文将介绍一…

利用HTML和css技术编写学校官网页面

目录 一&#xff0c;图例展示 二&#xff0c;代码说明 1&#xff0c;html部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 2&#xff0c;css部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 三&#xff0c;程序代码 一&#xff0c;…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点&#xff08;Scheduling&#xff09;目标节点上的 Pod 创建网络配置状态上报与监控控制器管理&#xff08;Controller Manager&#xff09;就绪与服务发现 关键错误场景高级特性 流程图 具…

(一)Axure制作移动端登录页面

你知道如何利用Axure制作移动端登录页面吗&#xff1f;Axure除了可以制作Web端页面&#xff0c;移动端也是可以的哦&#xff0c;下面我们就一起来看一下Axure制作移动端登录页面的过程吧。 第一步&#xff1a;从元件中拖入一个矩形框&#xff0c;并设置其尺寸为&#xff1a;37…

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

第5章 数据库系统(选择|案例|论文)(重点★★★★★)

5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合&#xff0c;数据库系统是指在计算机信息系统中引入数据库后的系统&#xff0c;一般由数据库、数据库管理系统 (DataBaseManagement System&#xff0c;DBMS)、应用系统、数据库管理员(DataBase…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…

Vue笔记(八)

一、Pinia &#xff08;一&#xff09;手动添加Piaia到Vue项目 1.安装Pinia&#xff1a;使用包管理器进行安装&#xff0c;在项目目录下运行 npm install pinia 或 yarn add pinia &#xff0c;为项目引入Pinia状态管理库。 2.创建Pinia实例&#xff1a;在项目的JavaScript代…

vue纯静态实现 视频转GIF 功能(附源码)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实现后的效果二、使用步骤1.引入库2.下载or复制出来js3. 前端实现 总结 前言 一天一个小demo 今天来一个vue纯静态实现 视频转GIF 功能 上一篇我们讲到了…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

【Python】集合

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 集合的创建2. 集合的基本操作2.1 访问集合元素2.2 添加元素2.3 删除元素 3. 集合的数学运算3.1 交集&#xff08;& 或 intersection() 方法&#xff09;3.2 并集&#xff08;| 或 union() 方法&#xf…

Flutter_学习记录_基本组件的使用记录_2

1. PopupMenuButton的使用 代码案例&#xff1a; import package:flutter/material.dart;// ----PopupMemuButtonDemo的案例---- class PopupMemuButtonDemo extends StatefulWidget {const PopupMemuButtonDemo({super.key});overrideState<PopupMemuButtonDemo> crea…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

初识计算机网络

从此篇我将开始网络新篇章&#xff01; 1. 网络发展史 最初的计算机之间相互独立存在&#xff0c;每个计算机只能持有自己的数据&#xff0c;数据无法共享。此时的计算机为独立模式 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#x…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器&#xff0c;找到Adobe Genuine Service Alert&#xff0c;并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗&#xff0c;解决&a…

Vue2生命周期面试题

在 Vue 2 中&#xff0c;this.$el 和 this.$data 都是 Vue 实例的属性&#xff0c;代表不同的内容。 1. this.$el this.$el 是 Vue 实例的根 DOM 元素&#xff0c;它指向 Vue 实例所控制的根节点元素。在 Vue 中&#xff0c;el 是在 Vue 实例创建时&#xff0c;指定的根元素&…