当前位置: 首页 > news >正文

UVM寄存器模型:uvm_reg_adapter

文章目录

  • 一、什么是uvm_reg_adapter
    • 1、what
    • 2、Example
    • 2.1、代码详解
  • 二、如何使用uvm_reg_adapter
  • 三、为什么要引入uvm_reg_adapter

一、什么是uvm_reg_adapter

1、what

  1. uvm_reg_adapter继承于uvm_object,定义了用于在 uvm_reg_bus_op特定总线事务之间进行转换的接口,使得寄存器模型和总线之间能够有效地进行通信。
  2. uvm_reg_bus_op:定义用于寄存器和内存访问的通用总线事务的结构,具有类型(读或写)、地址、数据和字节启用信息。
类型                成员
uvm_access_e        kind          UVM_READ or UVM_WRITE.
uvm_reg_addr_t      addr          地址;默认64位
uvm_reg_data_t      data          数据:默认64位
int                 n_bits        传输的bit位
uvm_reg_byte_en_t   byte_en       使能byte操作
uvm_status_e        status        传输的结果:UVM_IS_OK, UVM_HAS_X, UVM_NOT_OK.

2、Example

class rkv_ahbmtx_reg_adapter extends uvm_reg_adapter;`uvm_object_utils(rkv_ahbmtx_reg_adapter)
function new(string name = "rkv_ahbmtx_reg_adapter");super.new(name);provides_responses = 1;  // 如果总线要返回response数据,则应当使能provides_responses
endfunctionfunction uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); //函数原型需要一字不改svt_ahb_transaction t;t.xact_type = (rw.kind == UVM_WRITE) ? svt_ahb_master_transaction::WRITE :svt_ahb_master_transaction::READ;t.addr = rw.addr;t.burst_type = svt_ahb_master_transaction::SINGLE;t.burst_size = svt_ahb_master_transaction::BURST_SIZE_32BIT;t.data = new[1];  //svt_ahb_transaction 中的data是数组,这里是single传输,所以设置size为1t.data[0] = rw.data;return t;    //隐形转换
endfunctionfunction void bus2reg(uvm_sequence_item bus_item, ref uvm_reg_bus_op rw); //函数原型需要一字不改svt_ahb_transaction t;if (!$cast(t, bus_item)) begin`uvm_fatal("CASTFAIL", "Provided bus_item is not of the correct type")return;endrw.kind = (t.xact_type == svt_ahb_master_transaction::WRITE) ? UVM_WRITE : UVM_READ;rw.addr = t.addr;rw.data = t.data[0];rw.status = UVM_IS_OK;
endfunction
endclass

2.1、代码详解

  1. provides_responses:如果总线要返回response数据,则应当使能provides_responses;若总线不支持返回response数据(没有调用put_response(RSP)或者item_done(RSP)),则不应设置,负责会使得环境挂起

  2. supports_byte_enable:总线支持byte访问,则使能

  3. reg2bus

    1. 函数原型: pure virtual function uvm_sequence_item reg2bus( const ref uvm_reg_bus_op rw)
    2. pure virtual :纯虚方法,即没有实体的方法原型,它只可以在抽象类中定义(uvm_reg_adapter 是抽象类(virtual class uvm_reg_adapter extends uvm_object )
    3. 函数声明的返回类型是 uvm_sequence_itemuvm_sequence_item 是父类类型,但是最后 return t返回的是子类句柄(svt_ahb_transaction 实例的句柄),这里存在一个隐形转换:子类句柄转换为父类句柄并返回;也就是说最后返回的是父类句柄指向的父类类型;( 在svt_ahb_master_driver中其参数的数据类型是svt_ahb_master_transaction svt_sequencersvt_driver的参数都是 uvm_sequence_item,所以将其返回为 uvm_sequence_item)在这里插入图片描述
    4. const refconst 关键字用于声明一个变量为常量,意味着该变量的值在初始化后不能被修改。const ref 表示一个常量引用,指向一个对象,但不允许通过这个引用修改该对象
    5. reg2bus()完成的桥接场景是,如果用户在寄存器级别做了操作,那么寄存器级别操作的信息uvm_reg_bus_op会被记录,同时调用uvm_reg_adapter::reg2bus()函数。在完成了将uvm_reg_bus_op的信息映射到bus_trans之后,函数将bus_trans实例返回。而在返回bus_trans之后,该实例将通过bus_seqeuncer传入到bus_driver。这里的transaction传输是后台隐式调用的,不需要主动发起。
  4. bus2reg

    1. 函数原型: pure virtual function void bus2reg(uvm_sequence_item bus_item,ref uvm_reg_bus_op rw)
    2. 父类句柄bus_item指向了子类对象(实际传输的类型就是子类类型),所以要把父类句柄bus_item指向的子类对象转换为uvm_reg_bus_op 类型;父类句柄是无法访问子类对象,需要先把父类句柄转换为子类句柄
vt_ahb_transaction t;
if (!$cast(t, bus_item)) begin`uvm_fatal("CASTFAIL", "Provided bus_item is not of the correct type")return;end
  1. bus2reg函数的功能与reg2bus相反,完成了从bus_transuvm_reg_bus_op的内容映射。在完成映射之后,更新的uvm_reg_bus_op数据最终返回至寄存器操作场景层。

  2. 对于寄存器操作,无论读操作还是写操作,都需要经历调用reg2bus,继而发起总线事务,而完成总线事务发回反馈之后,又需要调用bus2reg,将总线的数据返回至寄存器操作层面。

二、如何使用uvm_reg_adapter

  1. 集成在env
  2. 例化后,需要在connect_phase中做必要的连接
rgm.map.set_sequencer(agt.sequencer, adapter);
predictor.adapter = adapter;

三、为什么要引入uvm_reg_adapter

  1. 通过使用适配器,验证环境中的不同组件可以相互独立开发和修改,减少了对其他组件的依赖。

  2. 提高可重用性:适配器可以在不同的项目或测试环境中复用,从而节省开发时间和资源。

  3. 简化复杂性:在复杂的验证环境中,适配器有助于简化不同协议之间的交互,使得设计和验证人员可以专注于各自的任务,而不必担心接口细节。

  4. 没有适配器,组件无法轻松适应不同的协议或接口,降低了验证环境的灵活性和可重用性。

相关文章:

UVM寄存器模型:uvm_reg_adapter

文章目录 一、什么是uvm_reg_adapter1、what2、Example2.1、代码详解 二、如何使用uvm_reg_adapter三、为什么要引入uvm_reg_adapter 一、什么是uvm_reg_adapter 1、what uvm_reg_adapter继承于uvm_object,定义了用于在 uvm_reg_bus_op 和特定总线事务之间进行转换…...

总结OpenGL和pyrender安装和使用过程中的坑

目录 报错一:AttributeError: NoneType object has no attribute glGetError 报错二:ImportError: (Unable to load OpenGL library, OSMesa: cannot open shared object file: No such file or directory, OSMesa, None) 报错三:raise ImportError("Unable to load…...

温湿传感器(学习笔记下)

接着我们温湿传感器上半部分的学习,现在我们学习接下来的部分,编写GXHTC3驱动程序,也就是给gxhtc3.c文件添加代码,我们要判断gxhtc3芯片是否存在和正常,就要先读取gxhtc3的ID号,根据gxhtc3的数据手册,读取命…...

期刊论文写作之word模板

一、zotero参考文献使用 下载zotero软件,请搜索相关帖子或者小破站即可; 把pdf拖到zotero软件里面,直接拉进去; 下面建立一个word演示: 1.导入pdf点击红框部分,根据期刊要求选择参考文献样式&#xff0…...

雷池社区版OPEN API使用教程

OPEN API使用教程 新版本接口支持API Token鉴权 接口文档官方没有提供,有需要可以自行爬取,爬了几个,其实也很方便 使用条件 需要使用默认的 admin 用户登录才可见此功能版本需要 > 6.6.0 使用方法 1.在系统管理创建API TOKEN 2.发…...

LSTM(Long Short-Term Memory,长短期记忆网络)在高端局效果如何

lstm 杂乱数据分析 LSTM(Long Short-Term Memory,长短期记忆网络)在高端局,即复杂的机器学习和深度学习应用中,展现出了其独特的优势和广泛的应用价值。以下是对LSTM在高端局中的详细解析: 一、LSTM的优势…...

模组操作宝典:4种关机重启技巧,让你的设备运行无忧

今天我说的是关于关机重启技巧。 给4G模组VBAT断电关机,模组关机前未能及时退出当前基站,会有什么影响呢? 基站会误以为设备还在线,下次开机仍会拿着上次驻网信息去连基站。基站一看,上次链接还在——认为你是非法设…...

利用API接口实现旺店通和金蝶系统的无缝数据对接

旺店通销售出库对接金蝶销售订单(线下)的技术实现 在企业日常运营中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体案例:如何通过轻易云数据集成平台,实现旺店通企业奇门的数据无缝对接到金蝶云星空系统。我们将…...

热题100(hash)

热题100&#xff08;Hash&#xff09; 三道题目 1.两数之和&#xff08;√&#xff09; 49.字母异位词分组&#xff08;题解&#xff09; 128.最长连续序列(题解) 思路 第1题简单hash映射&#xff0c;O(n) 第49题,关键点在于Hashmap的形式&#xff0c;‘HashMap<Stri…...

Ubuntu下Mysql修改默认存储路径

首先声明&#xff0c;亲身经验&#xff0c;自己实践&#xff0c;网上百度了好几个帖子&#xff0c;全是坑&#xff0c;都TMD的不行&#xff0c;修改各种配置文件&#xff0c;就是服务起不来&#xff0c;有以下几种配置文件需要修改 第一个文件/etc/mysql/my.cnf 这个文件是存…...

LVGL移植教程(超详细)——基于GD32F303X系列MCU

版本&#xff1a;LVGL Kernel V8.3.0&#xff0c;运行压力测试Demo Stress首先放一张最终Stress Demo 运行图&#xff1a; 一、准备 1. GD32 Keil工程 准备任意一个屏幕可以正常显示的GD32工程&#xff1a; 2. LVGL源码 最新版现在已经是V9.2了&#xff0c;这里我选择了…...

《计算机原理与系统结构》学习系列——处理器(中)

系列文章目录 目录 流水线数据通路与控制概述5个流水级指令周期与流水级 流水线性能流水线时钟周期的长度T和数量cycles流水线性能 流水线数据通路流水线寄存器流水线分析图形化流水线流水线控制 流水线数据通路与控制 概述 5个流水级 指令周期与流水级 单周期实现中&#x…...

深入解析 OceanBase 数据库中的局部索引和全局索引

深入解析 OceanBase 数据库中的局部索引和全局索引 引言 在分布式数据库中&#xff0c;索引的设计对于优化查询性能至关重要。OceanBase 作为一款高性能的分布式关系数据库&#xff0c;支持局部索引和全局索引两种索引类型。理解这两种索引的特点和适用场景&#xff0c;对于数…...

2024防晒衣市场社媒营销洞察报告

2024年&#xff0c;硬防晒已经从单一的户外场景&#xff0c;扩展到通勤、外出游玩、穿搭等更多场景&#xff0c;多样化的需求导致的消费群体不断扩大&#xff0c;“防晒经济”迎来自己的主场时刻。 当前&#xff0c;防晒衣不仅需要满足不用场景的灵活切换&#xff0c;还要满足多…...

【Ubuntu20.04 Visual Studio Code安装】【VSCODE】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、打开VSCOE官网二、下载VSODE的Ubuntu版本三、安装VSCODE软件包四、导入工作空间(添加工作空间目录)五、安装插件&#xff1a;1.安装简体中文包2.安装ros插件…...

贪心算法day(1)

1.将数组和减半的最少操作次数 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;创建大跟堆将最大的数进行减半 注意点&#xff1a;double t queue.poll()会将queue队列数字减少一个后再除以2&#xff0c;queue.offer(queue.poll(&#xff09;/…...

窗口函数sql使用总结

一、开窗 基础知识&#xff1a;窗口分析函数 &#xff08;1&#xff09;LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 第一个参数为列名&#xff0c;第二个参数为往上第n行&#xff08;可选&#xff0c;默认为1&#xff09;&#xff0c;第三个参数为默认值&#xff08;当往…...

python单因素分析

写了个简易小程序实现&#xff0c;以后用的时候直接复制就行&#xff1a; import numpy as np from scipy.stats import fdatas [[65,60,69,79,38,68,54,67,68,43],[74,71,58,49,58,49,48,68,56,47],[22,34,24,21,20,36,36,31,28,33] ] a 0.05def get_mean_var(data):data_m…...

「C/C++」C++ STL容器库 之 std::list 双向链表容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

应用程序框架进阶<HarmonyOS第一课>

一、判断题 1. 一个应用是由一个或多个HAP组成。 正确(True) 错误(False) 正确(True) 回答正确 2. UIAbility组件多实例启动模式是默认的启动模式。 正确(True)错误(False) 错误(False) 回答正确 二、单选题 1. 以下关于指定实例启动模式说法正确的是&#xff1f; …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...