3. 学习UVM的核心组件

文章目录

  • 前言
  • 一、UVM 核心组件详解
    • 1. uvm_component
    • 2. uvm_object
    • 3. uvm_driver
    • 4. uvm_monitor
    • 5. uvm_agent
    • 6. uvm_sequencer
    • 7. uvm_sequence
    • 8. uvm_sequence_item
    • 9. uvm_scoreboard
    • 10. uvm_env
    • 11. uvm_test
  • 二、相互关系
  • 三、综合示例


前言

UVM(Universal Verification Methodology)是一种广泛应用于硬件验证领域的标准方法学,旨在提高验证流程的可重用性和可扩展性。UVM 提供了一套预定义的类和方法,用于创建模块化、可重用的验证环境。


一、UVM 核心组件详解

UVM(Universal Verification Methodology)是一种广泛应用于硬件验证领域的标准方法学,旨在提高验证流程的可重用性和可扩展性。UVM 提供了一套预定义的类和方法,用于创建模块化、可重用的验证环境。以下是一些核心组件及其作用和相互关系的详细介绍:

1. uvm_component

uvm_component 是 UVM 中所有组件的基类,如 uvm_driver、uvm_monitor、uvm_agent、uvm_scoreboard 等。它支持层次结构、相位机制和报告机制。

  • 层次结构:每个 uvm_component 实例都是 UVM 树形结构的节点,可以有多个子节点。
  • 相位机制:组件可以参与 UVM 的相位机制,组织仿真过程中的不同阶段,如构建、连接、运行和清理。
  • 报告机制:组件可以使用 UVM 的消息基础设施报告事件、警告和错误。

定义示例:

class my_component extends uvm_component;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);// 构建组件endfunctionvirtual function void connect_phase(uvm_phase phase);// 连接组件endfunction
endclass

2. uvm_object

uvm_object 是 UVM 中所有对象的基类,提供了字段自动化机制和身份鉴别方法。

  • 字段自动化:提供 print、copy、pack 等方法。
  • 身份鉴别:提供 get_name、get_type_name、get_full_name 等方法。

定义示例:

class my_object extends uvm_object;function new(string name = "my_object");super.new(name);endfunctionvirtual function void do_print(uvm_printer printer);// 自定义打印方法endfunction
endclass

3. uvm_driver

uvm_driver 负责将事务驱动到 DUT(Design Under Test)的接口上。它通常从 uvm_sequencer 获取事务,并将其转换为 DUT 可以理解的信号。

定义示例:

class my_driver extends uvm_driver #(my_transaction);virtual my_interface vif;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual task run_phase(uvm_phase phase);forever beginseq_item_port.get_next_item(req);// 对 req 进行处理,发送事务到 DUTvif.signal = req.data;seq_item_port.item_done();endendtask
endclass

4. uvm_monitor

uvm_monitor 负责监视 DUT 的接口,并将事务捕获到事务对象中。它通常将捕获的事务发送到 uvm_scoreboard 或其他组件进行进一步处理。

定义示例:

class my_monitor extends uvm_monitor;uvm_analysis_port #(my_transaction) item_collected_port;virtual my_interface vif;function new(string name, uvm_component parent);super.new(name, parent);item_collected_port = new("item_collected_port", this);endfunctionvirtual task run_phase(uvm_phase phase);forever begin// 监视 DUT 的接口并捕获事务my_transaction trans = my_transaction::type_id::create("trans");trans.data = vif.signal;item_collected_port.write(trans);endendtask
endclass

5. uvm_agent

uvm_agent 是一个组合组件,通常包含一个 uvm_driver、一个 uvm_monitor 和一个 uvm_sequencer。它负责管理这些组件的交互,提供一个完整的验证接口。

定义示例:

class my_agent extends uvm_agent;my_driver m_driver;my_sequencer m_sequencer;my_monitor m_monitor;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);m_driver = my_driver::type_id::create("m_driver", this);m_sequencer = my_sequencer::type_id::create("m_sequencer", this);m_monitor = my_monitor::type_id::create("m_monitor", this);endfunctionvirtual function void connect_phase(uvm_phase phase);m_driver.seq_item_port.connect(m_sequencer.seq_item_export);endfunction
endclass

6. uvm_sequencer

uvm_sequencer 负责管理事务的生成和发送。它从 uvm_sequence 获取事务,并将其发送到 uvm_driver。

定义示例:

class my_sequencer extends uvm_sequencer #(my_transaction);function new(string name, uvm_component parent);super.new(name, parent);endfunction
endclass

7. uvm_sequence

uvm_sequence 用于生成事务序列。它可以生成单个事务或多个事务的序列,并将它们发送到 uvm_sequencer。

定义示例:

class my_sequence extends uvm_sequence #(my_transaction);function new(string name = "my_sequence");super.new(name);endfunctionvirtual task body();`uvm_info(get_type_name(), "Executing my_sequence", UVM_LOW)// 创建和发送事务my_transaction trans = my_transaction::type_id::create("trans");start_item(trans);trans.randomize();finish_item(trans);endtask
endclass

8. uvm_sequence_item

uvm_sequence_item 是所有事务的基类。它定义了事务的基本结构和方法,可以被 uvm_sequence 和 uvm_driver 使用。

定义示例:

class my_transaction extends uvm_sequence_item;rand int data;
function new(string name = "my_transaction");super.new(name);endfunction
virtual function void do_print(uvm_printer printer);printer.print_field_int("data", data, $bits(data));endfunction
endclass

9. uvm_scoreboard

uvm_scoreboard 用于验证 DUT 的行为是否正确。它通常接收来自 uvm_monitor 的事务,并进行比较和验证。

定义示例:

class my_scoreboard extends uvm_scoreboard;uvm_analysis_imp #(my_transaction, my_scoreboard) item_collected_export;function new(string name, uvm_component parent);super.new(name, parent);item_collected_export = new("item_collected_export", this);endfunctionvirtual function void write(my_transaction t);// 处理接收到的事务`uvm_info(get_type_name(), "Received transaction", UVM_LOW)endfunction
endclass

10. uvm_env

uvm_env 是验证环境的顶层组件,通常包含多个 uvm_agent、uvm_scoreboard 和其他组件。它负责管理整个验证环境的构建和运行。

定义示例:

class my_env extends uvm_env;my_agent m_agent;my_scoreboard m_scoreboard;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);m_agent = my_agent::type_id::create("m_agent", this);m_scoreboard = my_scoreboard::type_id::create("m_scoreboard", this);endfunctionvirtual function void connect_phase(uvm_phase phase);// 连接 agent 和 scoreboardm_agent.m_monitor.item_collected_port.connect(m_scoreboard.item_collected_export);endfunction
endclass

11. uvm_test

uvm_test 是测试用例的顶层组件,通常包含一个 uvm_env 和多个 uvm_sequence。它负责启动验证过程,并管理测试的运行。

定义示例:

class my_test extends uvm_test;my_env m_env;
function new(string name, uvm_component parent);super.new(name, parent);endfunction
virtual function void build_phase(uvm_phase phase);m_env = my_env::type_id::create("m_env", this);endfunction
virtual task run_phase(uvm_phase phase);my_sequence seq = my_sequence::type_id::create("seq");phase.raise_objection(this);seq.start(m_env.m_agent.m_sequencer);phase.drop_objection(this);endtask
endclass

二、相互关系

  • uvm_test:作为测试的入口点,创建和配置 uvm_env 和 uvm_sequence。
  • uvm_env:管理验证环境中的多个 uvm_agent、uvm_scoreboard 和其他组件。
  • uvm_agent:包含 uvm_driver、uvm_monitor 和 uvm_sequencer,负责驱动和监视 DUT 的接口。
  • uvm_driver:从 uvm_sequencer 获取事务并驱动到 DUT。
  • uvm_monitor:监视 DUT 的接口并捕获事务,发送到 uvm_scoreboard。
  • uvm_sequencer:管理事务的生成和发送,从 uvm_sequence 获取事务。
  • uvm_sequence:生成事务序列,发送到 uvm_sequencer。
  • uvm_sequence_item:定义事务的基本结构和方法。
  • uvm_scoreboard:验证 DUT 的行为是否正确,接收来自 uvm_monitor 的事务。

相互关系

  1. uvm_test:
    ○ 包含 uvm_env:管理验证环境。
    ○ 包含 uvm_sequence:管理测试序列。
    ○ 启动验证过程:通过 run_phase 方法启动测试。
  2. uvm_env:
    ○ 包含多个 uvm_agent:管理多个验证接口。
    ○ 包含 uvm_scoreboard:验证 DUT 的行为。
    ○ 配置组件间通信:通过 connect_phase 方法连接组件。
  3. uvm_agent:
    ○ 包含 uvm_driver:驱动事务到 DUT。
    ○ 包含 uvm_monitor:监视 DUT 的接口。
    ○ 包含 uvm_sequencer:管理事务序列。
    ○ 连接组件:通过 connect_phase 方法连接 uvm_driver 和 uvm_sequencer。
  4. uvm_driver:
    ○ 从 uvm_sequencer 获取事务:通过 seq_item_port 获取事务。
    ○ 驱动事务到 DUT:将事务转换为 DUT 可以理解的信号。
    5. uvm_monitor:
    ○ 监视 DUT 的接口:捕获 DUT 的信号并转换为事务对象。
    ○ 发送事务:将捕获的事务发送到 uvm_scoreboard 或其他组件。
  5. uvm_sequencer:
    ○ 从 uvm_sequence 获取事务:通过 start_item 和 finish_item 方法获取事务。
    ○ 发送事务到 uvm_driver:通过 seq_item_port 发送事务。
  6. uvm_sequence:
    ○ 生成事务序列:通过 start_item 和 finish_item 方法生成事务。
    ○ 发送事务到 uvm_sequencer:通过 start 方法启动序列。
  7. uvm_sequence_item:
    ○ 定义事务结构:提供事务的基本字段和方法。
    ○ 支持字段自动化:提供 print、copy、pack 等方法。
  8. uvm_scoreboard:
    ○ 接收事务:通过 uvm_analysis_port 接收事务。
    ○ 比较和验证:比较接收到的事务和参考模型的数据,判断 DUT 是否正确工作。
  9. uvm_object:
    ○ 字段自动化:提供 print、copy、pack 等方法。
    ○ 身份鉴别:提供 get_name、get_type_name、get_full_name 等方法。

三、综合示例

以下是一个综合示例,展示了如何使用这些核心组件构建一个简单的验证环境:

// my_transaction.sv
class my_transaction extends uvm_object;rand int data;rand bit [31:0] address;function new(string name = "my_transaction");super.new(name);endfunctionconstraint c_data { data > 0; }constraint c_address { address < 1024; }virtual function void do_print(uvm_printer printer);super.do_print(printer);printer.print_field_int("data", data, $bits(data));printer.print_field_int("address", address, $bits(address));endfunction
endclass
// my_driver.sv
class my_driver extends uvm_driver#(my_transaction);virtual my_if vif;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);if (!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("NOVIF", "Cannot get virtual interface")endfunctionvirtual task run_phase(uvm_phase phase);forever beginseq_item_port.get_next_item(req);vif.data = req.data;vif.address = req.address;seq_item_port.item_done();endendtask
endclass
// my_monitor.sv
class my_monitor extends uvm_monitor;virtual my_if vif;uvm_analysis_port#(my_transaction) analysis_port;function new(string name, uvm_component parent);super.new(name, parent);analysis_port = new("analysis_port", this);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);if (!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("NOVIF", "Cannot get virtual interface")endfunctionvirtual task run_phase(uvm_phase phase);forever beginmy_transaction trans = new();trans.data = vif.data;trans.address = vif.address;analysis_port.write(trans);endendtask
endclass
// my_sequencer.sv
class my_sequencer extends uvm_sequencer#(my_transaction);function new(string name, uvm_component parent);super.new(name, parent);endfunction
endclass
// my_agent.sv
class my_agent extends uvm_agent;my_driver driver;my_monitor monitor;my_sequencer sequencer;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);driver = my_driver::type_id::create("driver", this);monitor = my_monitor::type_id::create("monitor", this);sequencer = my_sequencer::type_id::create("sequencer", this);endfunctionvirtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);driver.seq_item_port.connect(sequencer.seq_item_export);endfunction
endclass
// my_scoreboard.sv
class my_scoreboard extends uvm_scoreboard;uvm_tlm_fifo#(my_transaction) exp_fifo;uvm_tlm_fifo#(my_transaction) act_fifo;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);exp_fifo = new("exp_fifo", this);act_fifo = new("act_fifo", this);endfunctionvirtual task run_phase(uvm_phase phase);my_transaction exp_trans, act_trans;forever beginexp_fifo.get(exp_trans);act_fifo.get(act_trans);if (exp_trans != act_trans) begin`uvm_error("SB", "Transaction mismatch")endendendtask
endclass
// my_env.sv
class my_env extends uvm_env;my_agent agent;my_scoreboard scoreboard;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);agent = my_agent::type_id::create("agent", this);scoreboard = my_scoreboard::type_id::create("scoreboard", this);endfunctionvirtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);agent.monitor.analysis_port.connect(scoreboard.exp_fifo.analysis_export);endfunction
endclass
// my_test.sv
class my_test extends uvm_test;my_env env;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);env = my_env::type_id::create("env", this);endfunctionvirtual task run_phase(uvm_phase phase);my_sequence seq = my_sequence::type_id::create("seq");seq.start(env.agent.sequencer);endtask
endclass

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

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

相关文章

k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限

一.service资源对内发布服务Cluster IP对外发布服务NodePortIngress 二.dashboard:基于网页的k8s管理插件 三.资源服务与帐号权限一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务功能:1.服务自动感知:pod迁移后访问service的ip,不受影响…

MySQL——表操作及查询

一.表操作 MySQL的操作中&#xff0c;一些专用的词无论是大写还是小写都是可以通过的。 1.插入数据 INSERT [INTO] table_name (列名称…)VALUES (列数据…), (列数据…); "[]"表示可有可无&#xff0c;插入时&#xff0c;如果不指定要插入的列&#xff0c;则表示默…

数据结构-基础

1、概念&#xff1a; 程序 数据结构 算法 2、程序的好坏 可读性&#xff0c;稳定性&#xff0c;扩展性&#xff0c;时间复杂度&#xff0c;空间复杂度。 3、数据结构 是指存储、组织数据的方式&#xff0c;以便高效地进行访问和修改。通过选择适当的数据结构&#xff0c; 能…

本地部署DeepSeek(Mac版本,带图形化操作界面)

一、下载安装&#xff1a;Ollama 官网下载&#xff1a;Download Ollama on macOS 二、安装Ollama 1、直接解压zip压缩包&#xff0c;解压出来就是应用程序 2、直接将Ollama拖到应用程序中即可 3、启动终端命令验证 # 输入 ollama 代表已经安装成功。 4、下载模型 点击模型…

Nginx配置 ngx_http_proxy_connect_module 模块及安装

1、配置完互联网yum源后,安装相关依赖软件包 [root@server soft]# yum install -y patch pcre pcre-devel make gcc gcc-c++ openssl openssh [root@server soft]# yum install openssl* 2、解压缩软件,加载模块 [root@server soft]# ls nginx-1.20.2 nginx-1.20.2.tar.gz …

宾馆民宿酒店住宿管理系统+小程序项目需求分析文档

该系统是一款专为现代酒店设计的高效、智能、易用的管理工具,旨在帮助酒店提升运营效率、优化客户体验,提升客户满意度与忠诚度,并促进业务增长。系统采用先进的云计算技术,支持小程序等多平台访问,第三方接口,确保数据安全与稳定。本系统主要针对中小型精品酒店、连锁酒…

山东大学软件学院人机交互期末复习笔记

文章目录 2022-2023 数媒方向2023-2024 软工方向重点题目绪论发展阶段 感知和认知基础视觉听觉肤觉知觉认知过程和交互设计原则感知和识别注意记忆问题解决语言处理影响认知的因素 立体显示技术及其应用红蓝眼镜偏振式眼镜主动式&#xff08;快门时&#xff09;立体眼镜 交互设…

《Kettle实操案例一(全量/增量更新与邮件发送)》

目录 一、场景描述:二、要求:三、思路四、整体作业五、各部分详细配置1、Start2、转换-获取执行开始时间3、获取目标表抽取前行数4、检验字段的值5、增量更新6、全量更新7、获取目标表抽取后行数8、获取执行结束时间9、日志写入数据库10、写日志11、发送数据抽取完成邮件 六、最…

位运算算法篇:进入位运算的世界

位运算算法篇&#xff1a;进入位运算的世界 本篇文章是我们位运算算法篇的第一章&#xff0c;那么在我们是算法世界中&#xff0c;有那么多重要以及有趣的算法&#xff0c;比如深度优先搜索算法以及BFS以及动态规划算法等等&#xff0c;那么我们位运算在这些算法面前相比&#…

redis高级数据结构HyperLogLog

文章目录 背景常见API注意事项实现原理1、哈希函数2、前导零统计3、存储与计数4、基数估算 pf 的内存占用为什么是 12k&#xff1f;总结 背景 在开始这一节之前&#xff0c;我们先思考一个常见的业务问题&#xff1a;如果你负责开发维护一个大型的网站&#xff0c;有一天老板找…

<tauri><rust><GUI>基于rust和tauri,在已有的前端框架上手动集成tauri示例

前言 本文是基于rust和tauri&#xff0c;由于tauri是前、后端结合的GUI框架&#xff0c;既可以直接生成包含前端代码的文件&#xff0c;也可以在已有的前端项目上集成tauri框架&#xff0c;将前端页面化为桌面GUI。 环境配置 系统&#xff1a;windows 10 平台&#xff1a;visu…

mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别

一 事务简介&#xff0c; 数据库准备&#xff1a; create table account(id int auto_increment primary key comment 主键ID,name varchar(128) not null comment 姓名,backaccountnumber char(18) unique comment 银行账号,money float comment 余额 )comment 银行账号表;…

重塑生产制造企业项目管理新范式:项目模板在Tita中的卓越实践

在竞争激烈的生产制造领域&#xff0c;每一个项目的成功执行都是企业稳健前行的重要基石。然而&#xff0c;面对复杂多变的生产流程、严格的交货期限以及不断变化的客户需求&#xff0c;如何确保项目高效、有序地进行&#xff0c;成为了众多企业面临的共同挑战。此时&#xff0…

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …

1-1二分查找

二分查找 1 基础版1.1 算法描述1.2 算法流程图1.3 算法实现1.3.1 Java实现 2 改动版2.1 算法描述2.2 算法流程图2.3 算法实现2.3.1 Java实现 2.4 改进点分析2.4.1 区间定义差异2.4.2 核心改进原理2.4.3 数学等价性证明 3 平衡版3.1 算法描述3.2 算法流程图3.3 算法实现3.3.1 Ja…

Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗

Elasticsearch 本身并不直接收集目标服务器的日志&#xff0c;它主要用于存储、搜索和分析数据。要收集目标服务器的日志&#xff0c;通常会借助其他工具&#xff0c;并且一般不需要在目标服务器上安装 Elasticsearch 软件&#xff0c;常见的日志收集方案&#xff1a; Filebeat…

Ajax-介绍

概念: Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML. 作用: 数据交换:通过Aiax可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互: 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术, 如:搜索联想、…

论软件架构风格论文

摘要: 本人于2023年1月参与广东省某公司委托我司开发的“虚拟电厂”项目,主要负责系统整体架构设计和中间件选型。该项目为新型电力存储、电力调配、能源交易提供一套整体的软件系统。本文以虚拟电厂项目为例,主要讨论架构风格在本项目中的具体应用,主要包括如下,底层架构…

基于可信数据空间的企业数据要素与流通体系建设(附ppt 下载)

近期&#xff0c;可信数据空间会议召开。大数据系统软件国家工程研究中心总工程师王晨发表了题为《基于可信数据空间的企业数据要素与流通体系建设》主旨演讲。 WeChat Subscription Account【智慧城市指北】&#xff0c;可搜索相关关键字“20250107”&#xff0c;可获取具体获…

idea整合deepseek实现AI辅助编程

1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号&#xff0c;DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息&#xff0c;File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…