【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】

news2024/11/16 13:25:46

apb协议

写时序

地址、写信号、PSEL、写数据信号同时发生变化,即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高,表示ENABLE周期,在该周期内,数据、地址以及控制信号都必须保持有效。整个写传输在这个周期结束时完成:
在这里插入图片描述

读时序

地址、写信号、PSEL信号同时发生变化,在下个时钟上升沿,PENABLE信号拉高,从机必须在ENABLE周期内提供读数据:
在这里插入图片描述

Sequencer

充当激励环节的路由器作用,管理sequence,也传递数据,仲裁某一时刻传递哪个sequence的数据

  • uvm_sequencer#(REQ,RSP)
    REQ:request;RSP:response//一般相同
  • default_sequence
    决定接数据的类型
  • seq_item_export
    决定送数据的driver

sequencer的实现

class apb_sequencer extends uvm_sequencer #(apb_trans);
	`uvm_component_utils(apb_sequencer);
	function new(string name,uvm_component parent);
		super.new(name,parent);
	endfunction
endclass
简便方法(不建议使用)typedef uvm_sequencer #(apb_trans) apb_sequencer;

virtual sequencer

  • 不同的sequence需要不同的sequencer
  • 控制其他的sequencer
  • 不和任何driver相连
  • 本身不处理item

实现与sequencer相同,其中可以定义子sequencer

Driver

driver和monitor都是数据转换类型,但方向相反

driver的方法:
get_next_item(阻塞)
try_next_item(不阻塞)
item_done(不阻塞)
driver的使用
uvm_driver(REQ,REP)
seq_item_port.get_next_item(req);//get上述括号内传来的句柄

在这里插入图片描述

driver的实现

class apb_driver extends uvm_driver #(apb_trans);
	`uvm_component_utils(apb_driver)
	
	//定义虚接口
	virtual apb_interface vif;
	
	function new(string name,uvm_component parent);
		super.new(name,parent);
	endfunction
	
	//config_db连接虚接口
	function void connect_phase(uvm_phase phase);
		super.connect_phase(phase);
		if(!uvm_config_db #(virtual apb_interface)::get(this,"","vif",vif);
			`uvm_fatal("NOvif","NOvif for apb_driver");
		end
	endfunction
	
	task run_phase(uvm_phase phase);
		super.run_phase(phase);
		vif.paddr<=0;
		vif.pwdata<=0;
		vif.pwrite<=0;
		vif.psel<=0;
		vif.penable<=0;
		tx_driver();
	endtask
	
	//从seq_item_port获取transaction
	task tx_driver();
		forever begin
			seq_item_port.get_next_item(req);
			send(req);
			seq_item_port.item_done();
		end
	endtask
	
	//给vif传送transaction
	task send(apb_trans tr);
		case(tr.dir)
			apb_trans::RD:begin
				@(posedge vif.clk);
				vif.paddr<=tr.addr;
				vif.pwrite<=0;
				vif.psel<=1;
				@(posedge vif.clk);
				vif.penable<=1;
				@(posedge vif.clk);
				tr.data=vif.prdata;
				vif.psel<=0;
				vif.penable<=0;
			end
			apb_trans::WR:begin
				@(posedge vif.clk);
				vif.paddr<=tr.addr;
				vif.pwdata<=tr.data;
				vif.psel<=1;
				vif.pwrite<=1;
				@(posedge vif.clk);
				vif.penable<=1;
				@(posedge vif.clk);
				tr.data=vif.prdata;
				vif.psel<=0;
				vif.penable<=0;
			end
		endcase
endclass

Monitor

源码中没有定义port

monitor不用像driver一样按时序操作的原因:
driver:transaction→DUT,DUT时序要求正确
monitor:DUT→transaction,验证没有时序的概念,只关注行为

在这里插入图片描述

monitor的实现

class apb_monitor extends uvm_monitor;
	`uvm_component_utils(apb_moitor);
	
	//定义虚接口
	virtual apb_interface vif;
	//利用uvm_analysis_port创建apb_mon_port
	uvm_analysis_port #(apb_trans) apb_mon_port;
	
	function new(string name,uvm_component parent);
		super.new(name,parent);
	endfunction
	
	config_db连接虚接口,new apb_mon_port
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		if(!uvm_config_db #(virtual apb_interface)::get(this,"","vif",vif);
			`uvm_fatal("NOvif","NOvif for apb_monitor");
		end
		apb_mon_port=new("apb_mon_port",this);
	endfunction
	
	//从vif获取transaction,要create transaction,写入apb_mon_port中,base_test中会与scoreboard的uvm_analysis_imp连接
	task run_phase(uvm_phase phase);
		super.run_phase(phase);
		forever begin
			apb_trans tr = apb_trans::type_id::create("tr",this);
			@(posedge vif.clk);
			if(vif.psel==1 && vif.penable==1)begin
				tr.dir=(vif.pwrite)?apb_trans::WR:apb_trans::RD;
				tr.addr=vif.paddr;
				tr.data=(vif.pwrite)?vif.pwdata:vif.prdata;
				apb_mon_port.write(tr);
			end
		end
	endtask
endclass

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

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

相关文章

【Java常用API】正则表达式的基础使用

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

Matlab|计及需求响应和电能交互的多主体综合能源系统主从博弈优化调度策略

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序建立了多主体综合能源模型&#xff0c;采用双层模型进行求解&#xff0c;上层用自适应粒子群算法求解出各能源售价和需求响应补偿价格&#xff1b;下层采用混合整数规划算法求解出三个园区、配电网、储能…

leetcode 热题 100_旋转图像

题解一&#xff1a; 翻转数组&#xff1a;先将数组沿右上-左下对角线翻转&#xff0c;再将数组上下翻转。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;for (int i 0; i < n; i) {//沿右上-左下对角线翻转for (int j 0; j < n - i - 1…

vob格式转换mp4怎么转? 如何保持vob原画质?

VOB&#xff08;Video Object&#xff09;文件格式在数字视频制作领域崭露头角。起源于DVD技术的发展&#xff0c;VOB旨在存储包括音频、视频和菜单等多媒体元素的内容。这一格式为数字娱乐提供了高质量的视频体验&#xff0c;然而&#xff0c;由于其相对封闭的特性&#xff0c…

Stable Diffusion 模型下载:Comic Babes(漫画宝贝)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 条目内容类型大模型基础模型SD 1.5来源CIVITAI作者datmuttdoe文件名称comicBabes_v2.safet…

数据治理实践——金融行业大数据治理的方向与实践

目录 一、证券数据治理服务化背景 1.1 金融数据治理发展趋势 1.2 证券行业数据治理建设背景 1.3 证券行业数据治理目标 1.4 证券行业数据治理痛点 二、证券数据治理服务化实践 2.1 国信证券数据治理建设框架 2.2 国信证券数据治理建设思路 2.3 数据模型管理 2.4 数据…

例解变分自编码器(VAE)

本文通过一个回归例子介绍变分自编码器。产生训练和测试样本的代码如下&#xff1a; # data import tensorflow as tf import numpy as np import matplotlib.pyplot as plt %matplotlib inlinedef f(x, sigma):# y 10 * sin(2 * pi) epsilonreturn 10 * np.sin(2 * np.pi *…

【漏洞分析】CVE-2024-27198可RCE身份验证绕过JetBrains TeamCity

CVE-2024-27198可RCE身份验证绕过JetBrains TeamCity 一、基本原理二、创建新的管理员用户三、自我检查四、POC 一、基本原理 向存在漏洞服务器发送一个不存在的页面请求 ?jsp/app/rest/server;.jsp 这会使服务器报错提供版本信息&#xff0c;且无需登录 Fofa app“JET_BRAIN…

Linux工具 - 好用的yum包管理器

~~~~ 前言yum是什么为什么有yum如何使用yum配置用户yum源为什么要配置yum源具体配置备份CentOS-Base.repo文件下载对应阿里yum源到本目录/etc/yum.repos.d/清理yum并生成缓存更改配置文件CentOS-Base.repo更新yum 常用命令listinstall选项-y remove选项-y update 结语 前言 本…

ON1 Portrait AI 2023:智能美颜,打造完美人像 mac版

在数字化时代&#xff0c;人像摄影的需求和追求愈发高涨。为了满足摄影师对于完美人像的追求&#xff0c;ON1推出了全新的ON1 Portrait AI 2023。这款软件结合了先进的人工智能技术与人像处理的专业知识&#xff0c;为人像摄影带来了前所未有的智能体验。 ON1 Portrait AI 202…

2024.3.11

1.结构体数组 代码&#xff1a; #include<myhead.h>struct Stu {char name[100];int age;double score; };int main(int argc, const char *argv[]) {int i,j;struct Stu t{"z",1,1};struct Stu arr[4]{{"甲乙",12,98},{"陈二",13,77},{…

docker启动时环境变量不生效(docker打包成镜像后环境变量失效)

前言 因项目需要多处部署&#xff0c;为了部署的方便&#xff0c;于是准备将项目环境打包成docker镜像以便于部署。mq、mysql这些在仓库中都有现成的镜像&#xff0c;虽然java和nginx的也都有&#xff0c;但是不知道当时是怎么想的&#xff0c;就不想搞太多镜像&#xff0c;也…

五、OpenAI实战之Assistants API

在8线小城的革委会办公室里&#xff0c;黑8和革委会主任的对话再次展开。 黑8&#xff1a;主任&#xff0c;您知道吗&#xff1f;除了OpenAI API&#xff0c;现在还有一项新的技术叫做Assistants API&#xff0c;它可以帮助我们更好地进行对话和沟通。 主任&#xff1a;Assis…

Redhat Linux(RHEL) - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Oracle Linux版环境发布之后&#xff0c;近日我又制作了基于Redhat Linux 的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代表…

SD-WAN能解决企业网络的哪些问题?

SD-WAN技术的崛起为企业网络带来了全新的解决方案。在数字化转型、云计算、远程办公和5G等领域&#xff0c;SD-WAN技术展现出强劲的市场趋势。那么&#xff0c;SD-WAN究竟能够解决企业网络中的哪些难题呢&#xff1f; 提升网络带宽利用率 传统网络在连接分支机构时&#xff0c;…

解决input事件监听拼音输入法导致高频事件

1、业务场景 在文本框中输入内容&#xff0c;执行查询接口&#xff0c;但遇到一个问题&#xff0c;当用拼音打字写汉字去搜索的时候&#xff0c;会输入一些字母拼成汉字&#xff0c;怎么能监听等拼音文字输入完成后再触发文本框监听事件 2、解决方案 通过查阅资料得知在输入中…

Qt教程 — 1.3 如何创建Qt项目

目录 1 新建一个项目 2 项目文件介绍 2.1 项目文件夹介绍 2.2 配置文件*.pro 2.3 头文件*.h 2.4 源文件*.cpp 2.5 样式文件*.ui 3 修改 ui 文件 4 项目编译&调试&运行 4.1 运行 4.2 编译报错 1 新建一个项目 (1) 新建项目&#xff0c;方法一&#xff1a;打…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

基于jsp+mysql+Spring+mybatis的SSM汽车保险理赔管理系统设计和实现

基于jspmysqlSpringmybatis的SSM汽车保险理赔管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

C++ 之LeetCode刷题记录(三十九)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用…