接续UVM基础入门文章。


前言

重点讲述UVM常用的接口连接方式。


寄存器模型:

UVM寄存器模型(Register Model)是一组高级抽象的类,用于对DUT(Design Under Test)中具有地址映射的寄存器和存储器进行建模,通过提供寄存器操作的抽象接口进行读写操作,这样简化了对寄存器的验证。

寄存器模型模拟了DUT内部的存储器件,一个简单的寄存器模型如图:

上述的图中可以看出寄存器模型的大致框架,内部含有众多寄存器和存储器,这些元件通过地址图与DUT内部的寄存器形成映射关系。

不过寄存器的保留域可以不用管,无法写入,读出的数据是复位值,在提取寄存器功能点时也常常忽略保留域。

寄存器读写:

寄存器模型与DUT的数据交互复杂多样,整体方式其实就是通过前门访问和后门访问。

前门访问过程:

1.测试用例或者参考模型会调用寄存器模型的read() 或者 write() 方法,指定为前门访问方式。一旦寄存器模型被上层调用后,这个寄存器模型就会产生一个有关读写操作事务。

2.寄存器模型通过调用adapter的reg2bus函数将寄存器读写事务转换成总线事务。

3.该总线事务会交给关联的sequencer发送给driver,然后再驱动给DUT。

4.monitor监测响应,然后给到端口传出去,这个端口可以是analysis_port端口。

5.寄存器模型通过analysis_port端口获取响应后调用adapter的bus2reg函数将事务转换成寄存器操作

6.寄存器模型自动更新镜像值

后门访问过程:

1. 在寄存器模型中,通过 add_hdl_path() 或 add_hdl_path_slice() 为内部的每个寄存器或字段域指定对应的RTL信号路径,这个过程理解为映射。

2. 调用寄存器模型的read() 或者  write() 函数,方式指定为后门路径。

3.通过DPI-C接口或者force/release直接修改或者读取对应路径的寄存器值.

4.写入的数值或者读出的数值都会自动更新到寄存器镜像里。

如图所示:

红色线条表示的是参考模型写数据到DUT内部的路径,绿色线条表示参考模型从DUT寄存器里读出数据,黑色线条表示后门访问。

参考模型一般都不会写数据,想要读寄存器数据可以通过前门后门或者读取镜像值来获取数据。

通道机制:

在UVM的端口连接机制中,最为常用的有3种端口连接机制。

一对一接口:

1.put_port:在完成transaction的打包后,通过port.put(trans)将事务发送出去。(blocking_put_port接口也属于put_port的一种,属于阻塞接口,不支持反向)

2.get_port:在需要transaction的时候,通过port.get(trans)获取事务。(get_blocking_prot就是get_port的一种,它属于阻塞端口)

一对多接口:

analysis_port接口为广播接口,可以向所有组件发送事务信息。

接口转接:

tlm_fifo作为中间传输的缓存器,可以用于不同接口之间的连接。当存在两个接口的定义不相同时,通过将接口连接到fifo对应的接口上实现转接。

tlm_fifo分为有ap端口的fifo 和没有ap端口的fifo。

通常agent发送的transaction不止一个组件使用,因此在agent中通常使用的analysis_port实现广播,而在参考模型或者记分板中并不需要广播功能。

因此在不需要广播功能的组件中,通常可以不用analysis_port端口。

以agent到scoreboard的端口连接为例简单的讲述一下常用的接口连接机制:

1.多对一连接:

analysis_port------env.tlm_fifo------scoreboard.get_blocking_port。

这属于不同类型的接口连接,由于scoreboard不是时刻都需要事务的,因此需要一个缓冲功能的接口。

analysis_port--------scoreboard.tlm_fifo

由于fifo中自带了get()函数,通常也可以省略get_blocking_port接口,直接在scoreboard里面实例化两个fifo存储数据用于对比。

虽然使用fifo简单易懂,但是很多时候一个组件需要获取多组数据的情况,这种情况下例化很多fifo是不现实的。

原因在于如果不同agent之间发送事务的phase不同,而scoreboard里面没有选择合适的phase,那么环境的调试将会变得十分困难。

而且想要从fifo里面获取数据需要在特定的phase里面执行。

analysis_port ------------- scoreboard.imp

imp,我在B站上看到的视频解释为通道的意思,如果组件中有多个imp接口的话,需要使用·uvm_analysis_imp_decl宏定义创建多个imp类去分别对应不同的通道,还要再组件中定义具有相同后缀名的函数。

2.一对一连接:

常见一对一的端口连接方式有:

阻塞式单向传输uvm_blocking_put_port(发送) + uvm_blocking_put_imp(接收)

阻塞式双向传输uvm_blocking_transport_port(发送) + uvm_blocking_transport_imp(接收)

非阻塞式单向传输uvm_nonblocking_put_port(发送) + uvm_nonblocking_put_imp(接收)

例如:

class scoreboard extends uvm_component;`uvm_component_param_utils(scoreboard #(transaction))// 定义两个IMP端口:一个接收预期数据,一个接收实际数据uvm_blocking_put_imp #(transaction, scoreboard #(transaction)) expected_imp;uvm_blocking_put_imp #(transaction, scoreboard #(transaction)) actual_imp;// 存储预期和实际数据的队列transaction expected_queue[$];transaction actual_queue[$];function new(string name = "scoreboard", uvm_component parent = null);super.new(name, parent);expected_imp = new("expected_imp", this);actual_imp = new("actual_imp", this);endfunction// 实现expected_imp的put方法virtual task put(transaction tr);`uvm_info("SCOREBOARD", $sformatf("Received Expected Data: %0h", tr.data), UVM_MEDIUM);expected_queue.push_back(tr);endtask// 实现actual_imp的put方法virtual task put(transaction tr);`uvm_info("SCOREBOARD", $sformatf("Received Actual Data: %0h", tr.data), UVM_MEDIUM);actual_queue.push_back(tr);endtask// 比对逻辑(可在run_phase或单独的任务中调用)task compare();if (expected_queue.size() != actual_queue.size()) begin`uvm_error("SCOREBOARD", "Mismatch in number of transactions!");end else beginforeach (expected_queue[i]) beginif (expected_queue[i].data !== actual_queue[i].data) begin`uvm_error("SCOREBOARD", $sformatf("Data mismatch at index %0d!", i));endendendexpected_queue.delete();actual_queue.delete();endtask
endclass

总结

不同种类的端口一般不能直接相连,需要FIFO转接,或者将两个要相连的端口类型声明为一致的。

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

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

相关文章

12.NModbus4在C#上的部署与使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一种基于TCP/IP协议的工业自动化通信协议。它在Modbus协议的基础上,利用TCP/IP网络进行数据传输,使得工业设备之间的通信更加便捷和高效。常用的Modbus功能码包括0x03(读保持寄存器)、0x06…

硬件开发2-汇编1(ARMv7-A)- 基本概要

一、汇编基本概要1、ARM数据和指令类型2、ARM字节顺序即可大端存储也可小端存储,默认小端存储(不建议修改)、kernel(内核)中的,CPSR(当前程序状态寄存器)可修改大小端存储3、ARM处理…

Linux中进程和线程常用的API详解

进程与线程基础及 Linux 进程间通信(IPC)详解 一、程序与进程 1. 程序(静态文件) 程序是存储在磁盘上的可执行文件,是静态实体,不占用 CPU、内存等运行时资源,仅占用磁盘空间。不同操作系统的可…

VS Code 插件开发教程

VS Code 插件开发教程 概述 Visual Studio Code(简称 VS Code)是一款由 Microsoft 开发的开源轻量级编辑器,支持跨平台(Windows、macOS、Linux)。 其最大的优势之一是强大的插件系统,开发者可以通过编写扩…

Docker技术解析

1.Docker安装 1.如果Ubuntu自带的Docker版本太低,我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用…

TCP套接字的使用

Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.ServerSocketServerSocket是创建TCP服务端Socket的api,主要方法:方法签名说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口Socket accpet()开始监听指定端口,有客户端链接后,返回…

linux执行systemctl enable xxxxx 报 Failed to execute operation: Bad message

linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message 如果在执行 systemctl enable 命令时遇到 "Failed to execute operation: Bad message" 错误,可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决&a…

终端之外:解锁Linux命令行的魔法与力量

Linux命令行的核心理念 在记忆具体的指令之前,先理解它的哲学: 一切皆文件 :硬件设施,进程,目录…在Linux中几乎所有资源都被抽象为文件,这意味着你可以通过同样的指令(如 ench ,cat&#xff…

CSS 动画实战:实现电商中“加入购物车”的抛物线效果

引言 在电商网站中,“加入购物车”动画 是提升用户体验的经典交互之一。一个小小的商品图标从页面飘向购物车,不仅直观地反馈了操作结果,还能增加趣味性与沉浸感。 实现这一效果的方式有很多,比如 JavaScript 计算路径 动画&…

深度学习之损失函数

深度神经网络由多层网络连接而成,网络连接处防止线性直接相关,采用非线性函数进行逐层隔离,真正实现每层参数的独立性,也就是只对本层提取到的特征紧密相关。因为如果是线性函数直接相连就成了一层中间网络了,只不过参…

Oracle OCP认证考试题目详解082系列第32题

考察知识点:Oracle profiles(配置文件) 英语题目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:单节点与副本集的最佳实践

Docker 部署 MongoDB:单节点与复制集的企业级最佳实践引言:容器化有状态服务的范式转变第一部分:基础概念与生产环境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount:生产环境抉择1.3 获取与验证官方镜像官方镜像默认…

公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程

本地物理服务器计算机搭建部署应用包括网站等,然后在局域网内的访问外,还需要提供外地的连接访问,这是比较常见的跨网通信需求。如在家或在外访问公司内部办公系统网站,这就涉及内网IP和公网IP的转换,或域名的解析使用…

整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之6 拼句 之1 (豆包助手 之8)

摘要(AI生成)认知演进 中 交流句子所包含的 信息描述框架 < i , j > ( m , n )本体论基础&#xff08;数学约束&#xff09;&#xff1a; n n元&#xff08;维度&#xff09;n次&#xff08;层次&#xff09;n个&#xff08;方程&#xff09;n场&#xff08;场景&am…

微软的两个调试器debugpy和python

在生成launch.json文件时&#xff0c;新版本的python扩展解释器类型是debugpy&#xff0c;而不是就版本的type:python&#xff0c;那么两者的区别在哪&#xff1f;1. 历史演变背景&#xff08;1&#xff09;旧版&#xff08;Python扩展 < 2021.09&#xff09;使用 "typ…

【连载2】C# MVC 自定义错误页设计:404/500 处理与 SEO 优化

在开发ASP.NET MVC 应用时&#xff0c;自定义错误页是提升用户体验和 SEO 表现的重要环节。默认的错误页不仅不美观&#xff0c;还可能泄露技术细节&#xff0c;影响用户体验和搜索引擎排名。 实现自定义错误页的完整代码 配置 Web.config 自定义错误页 在 ASP.NET 中&#…

mcp解读——概述及整体架构

概念介绍 什么是模型上下文协议 &#xff08;MCP&#xff09; MCP&#xff08;模型上下文协议&#xff09;是一种用于将 AI 应用程序连接到外部系统的开源标准。 使用 MCP&#xff0c;Claude 或 ChatGPT 等人工智能应用程序可以连接到数据源&#xff08;例如本地文件、数据库&a…

AI 赋能云端运维:基于 MCP 协议深度集成 Codebuddy CLI 与腾讯云 Lighthouse 的实战全解

摘要 在云计算技术飞速演进的今天&#xff0c;服务器的管理与运维正经历着从传统手动操作、脚本自动化到智能化、对话式交互的深刻变革。本文将系统性地、全流程地展示如何将腾讯云 Lighthouse 轻量应用服务器与尖端的 AI 编程助手 Codebuddy CLI 进行深度集成。我们将从服务器…

【Proteus仿真】【51单片机】教室灯光控制器设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、DS1302时钟模块、人体红外感应模块、开关LED指示灯、继电器、PCF8591 ADC模块、光敏传感器、按键模块等。 主要功能&#xff1a; 系统运…

成为一个年薪30W+的FPGA工程师是一种什么体验?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是现场可编程门阵列&#xff0c;通过硬件描述语言设计电路&#xff0c;可实现并行计算&#xff0c;广泛应用于通信、人工智能、工业控制等领域。FPGA工程师的工作包括RTL设计、仿真验证、时序分析等。尽管并非所有公…