AHB-to-APB Bridge——08burst_test(rdy、nrdy、slverr、tight)、地址

news2024/12/26 21:50:28

-------------- burst_test:与single_test不同的是,需要在run_phase中使用fork join 让AHB侧和APB侧同时工作(不能等AHB都发完APB才工作);num_apb_seq为APB已传输的个数,当APB侧传输数据的个数,大于或等于AHB侧的总数据个数后,跳出循环;

class ahbl_mst_burst extends ahb2apb_base_test;
  
  ahbl_mst_burst_seq ahbl_mst_seq_i;
  apb_slv_nrdy_seq            apb_slv_seq_i;

  `uvm_component_utils(ahbl_mst_burst)

  function new(string name,uvm_component parent=null);
    super.new(name,parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    ahbl_mst_seq_i = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_i",this);
    apb_slv_seq_i = apb_slv_nrdy_seq::type_id::create("apb_slv_seq_i",this);
  endfunction
  
  virtual task run_phase(uvm_phase phase);
    int num_apb_seq;
    phase.raise_objection(this);
    super.run_phase(phase);

    #100us;
    fork//使用fork join 让AHB侧和APB侧同时工作(不能等AHB都发完APB才工作)
      begin
        ahbl_mst_seq_i.start(env_i.ahbl_mst_agt_i.sqr_i);
      end
      begin
        num_apb_seq = 0;
        while(1)begin
          apb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);
          num_apb_seq++;
          if(num_apb_seq >= ahbl_mst_seq_i.req.get_bst_beats())begin
            break;//APB侧传输数据的个数,大于或等于AHB侧的数据个数后,跳出循环
          end
        end
      end
    join
    phase.drop_objection(this);
  endtask

endclass

burst_seq中:将htrans、hsize、hburst、hwrite注释掉(全部随机)

class ahbl_mst_burst_seq extends ahbl_mst_basic_seq;
 
  function new(string name="ahbl_mst_burst_seq");
    super.new(name);
  endfunction

  `uvm_object_utils(ahbl_mst_burst_seq)

  virtual task body();
    `uvm_do_with(req,{hsel == 1'b1;
                      //htrans == ahbl_mst_pkg::NSEQ;
                     // hsize  == ahbl_mst_pkg::WORD;
                      //hburst == ahbl_mst_pkg::SINGLE;
                      //hwrite == 1'b1;
                      })

  endtask
endclass

---------- burst_test_slverr:每次传输slv侧slverr为1,随机1:5个周期的nready:

class apb_slv_slverr_seq extends apb_slv_basic_seq;
  
  function new(string name = "apb_slv_slverr_seq");
    super.new(name);
  endfunction

  `uvm_object_utils(apb_slv_slverr_seq)

  virtual task body();
    `uvm_do_with(req,{slverr == 1'b1;
                      nready_num inside {[1:5]};})
  endtask
endclass

 AHB侧收到SLVERR的波形为第一个周期HRESP为高,HREADYOUT为低;第二个周期都为高;

对于AHB协议中所讲,遇到ERRO可以立即停掉或者传输完毕给IDLE;

 --------------burst_tight_transfer(紧密传输两个burst):基本相同,例化两个相同的burst_seq,再run_phase中先后使用,并先后分别判断传输数量后跳出循环;

class ahbl_mst_tight_transfer extends ahb2apb_base_test;
  
  ahbl_mst_burst_seq ahbl_mst_seq_0;
  ahbl_mst_burst_seq ahbl_mst_seq_1;
  apb_slv_nrdy_seq   apb_slv_seq_i;

  `uvm_component_utils(ahbl_mst_tight_transfer)

  function new(string name,uvm_component parent=null);
    super.new(name,parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    ahbl_mst_seq_0 = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_0",this);
    ahbl_mst_seq_1 = ahbl_mst_burst_seq::type_id::create("ahbl_mst_seq_1",this);
    apb_slv_seq_i = apb_slv_nrdy_seq::type_id::create("apb_slv_seq_i",this);
  endfunction
  
  virtual task run_phase(uvm_phase phase);
    int num_apb_seq;
    phase.raise_objection(this);
    super.run_phase(phase);

    #100us;
    fork
      begin
        ahbl_mst_seq_0.start(env_i.ahbl_mst_agt_i.sqr_i);
        ahbl_mst_seq_1.start(env_i.ahbl_mst_agt_i.sqr_i);
      end
      begin
        num_apb_seq = 0;
        while(1)begin
          apb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);
          num_apb_seq++;
          if(num_apb_seq >= ahbl_mst_seq_0.req.get_bst_beats())begin
            break;
          end
        end
        while(1)begin
          apb_slv_seq_i.start(env_i.apb_slv_agt_i.sqr_i);
          num_apb_seq++;
          if(num_apb_seq >= ahbl_mst_seq_1.req.get_bst_beats())begin
            break;
          end
        end
      end
    join
    phase.drop_objection(this);
  endtask

endclass

 第一个随机burst是WORD读操作,第二个是HALFWORD写操作;

AHB写操作第一个5666说明写入高两个字节有效为AB6C3EE5;第二个5668说明低两个字节有效为477EF246;APB端地址总是一次加4,PSTRB信号代表了地址是高有效还是低有效,C为1100说明高有效,3为0011说明低有效;(PSTRB仅用于写,说明了哪个字节数据是有效)

 

-------------------------------地址解读:32位一次传4字节,地址0、4、8、C变化;

 16位一次传2字节HalfWord,地址0、2、4、6、8、A…变化;

 如地址0X42,HWORD传输,随机出来的32位数据只有高两个字节有效;低两个字节无效;

 

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

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

相关文章

dbn_svm电池容量soc预测,深度信念网络DBN+支持向量机SVM的电池容量SOC预测

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM长短期神经网络的原理 DBN+SVM的时间序列电容预测 基本结构 主要参数 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,本文用DBN提取特征,用SVM分类,…

chatgpt赋能python:Python中0.0和0的相同性探究

Python中0.0和0的相同性探究 Python是一种动态且解释型的编程语言,被广泛应用于编写Web应用程序、数据分析、人工智能等领域。当我们在Python中进行数值比较时,可能会遇到这样一个问题:0.0和0是否相同?本文将会进行探究&#xff…

【Python】一个简单的小程序,实现批量修改图片格式(附完整代码及程序)

程序下载地址:链接:https://pan.baidu.com/s/1ser7iEMRS54syvwl1cck1Q?pwdjr66 提取码:jr66 一、完整代码 如果想要测试代码,记得在使用前先保证已经安装了Python的PIL模块 import os from tkinter import Tk, Button, messa…

数据库基础——7.多表查询

这篇文章来讲一下数据库中的多表查询 目录 1. 一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 1.3 案例分析与问题解决 2. 多表查询分类讲解 2.1 等值连接 vs 非等值连接 2.1.1等值连接 2.1.2 非等值连接 2.2 自连接 vs…

chatgpt赋能python:PythonDemo:快速了解Python编程语言

Python Demo:快速了解Python编程语言 如果你是一个对编程感兴趣的人,或者正在学习编程,那么你一定听说过Python这个编程语言。Python是一个非常易学易用的语言,同时也是非常流行的语言之一。Python具有众多的库和框架&#xff0c…

从RE到RSE:聊聊无线产品EMC认证测试中的辐射项(下)

当无线产品开启个人通信时代之际,EUT这个载体变了,辐射发射测试标准要不要变?怎么变? 回答这个问题的不再是ANSI和CISPR,而是联合国下属机构国际电信联盟无线电通信部门(ITU-R)以及著名的移动通…

Django学习笔记002之resetfull应用

学习目标: 学习resetfull接口 掌握Django web基础设施 学习内容: 1.学习resetfull接口 简介 人工智能解释: 应用场景 以下是人工智能使用Django框架实现的restfull接口代码: #views.py from django.http import JsonRespon…

maven环境变量配置zsh: command not found: mvn。

在输入命令vim ~/.zshrc的时候出现下面的报错: 解决办法 第一步输入下面的命令vim -r 文件名(文件名也就是第二行双引号里面的所有字母字符) 第二步输入下面的命令rm -f xx.swp 在配置好maven的环境变量但是在输入mvn -v的时候会报错 zsh:…

浅读《简约之美-软件设计之道》

浅读《简约之美-软件设计之道》 大家好,我是Lampard~ 这个周末阅读了一本程序设计相关的书籍《简约之美-软件设计之道》,它原著是《The Science of Software Development》,由余晟大大翻译。 这本书只有数十页,和它的命名一样追求…

Linux---GUN binutils

文章目录 一、GUN binutis概述二、工具集详细说明nm指令使用size指令使用objdump指令使用addr2line指令使用readelf指令使用strip指令使用 一、GUN binutis概述 什么是GUN binutis?它是一个二进制工具集,默认情况下所有 Linux 发行版中都会安装这些二进制工具。实际…

chatgpt赋能python:Python中的Cumsum()函数

Python中的Cumsum()函数 Python是数据科学家和工程师喜欢的一种高级脚本语言。它为许多数据科学的任务提供了大量的分析和可视化工具。 在Python中,Cumulative Sum或cumsum()函数是一个非常有用的函数之一。 它可以基于给定的轴计算数组元素的累积和。 什么是cums…

【牛客算法BM2】 链表内指定区间反转

​ 你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题…

chatgpt赋能python:Python编程技巧:没有换行输入三个数的方法

Python编程技巧:没有换行输入三个数的方法 在Python编程过程中,我们经常需要从用户输入一些数据。但是,当我们需要从用户输入多个数值时,我们往往会遇到一些问题,比如输入回车符会造成程序无法正常执行等。那么&#…

被比尔盖茨选中的GPT技术,是如何演进,又革谁的命?

作者 | 智商掉了一地、Python 如果机器能够以类似于人类的方式进行理解和沟通,那会是怎样的情况?这一直是学界中备受关注的话题,而由于近些年来在自然语言处理的一系列突破,我们可能比以往任何时候都更接近实现这个目标。在这个突…

C语言基础:翁恺笔记

英尺英寸换算米案例&#xff1a; #include <stdio.h>int main() {int inch0,foot0;printf("请输入身高的英尺和英寸\n");scanf("%d %d",&inch,&foot);printf("身高是%f米",(inchfoot/12)*0.3048);return 0; } 总结&#xff1a;…

mac的maven的环境变量配置

首先下载maven文件 下载安装 下载地址&#xff1a; Maven – Download Apache Maven 2、配置环境变量 打开mac终端&#xff0c;不做任何操作直接输入命令&#xff1a;vim ~/.zshrc 打开.zshrc之后&#xff0c;按下i键&#xff0c;进行配置如下&#xff1a; #maven export M…

chatgpt赋能python:Python下载与运行指南-让Python脚本更容易使用

Python下载与运行指南 - 让Python脚本更容易使用 Python已经成为世界上最流行的编程语言之一。Python具有简单易用的特点&#xff0c;几乎可以开始创建任何类型的应用程序或脚本。如果你是一名新手或是一名经验丰富的开发者&#xff0c;Python都是一款优秀的编程语言。 本篇文…

chatgpt赋能python:Python中KW的介绍:了解Python关键字

Python中KW的介绍&#xff1a;了解Python关键字 在Python语言中&#xff0c;KW是一个非常重要的概念。KW是Python中的关键字&#xff0c;也就是非常重要的语法元素。在程序中使用正确的KW可以帮助我们避免一些常见的错误&#xff0c;从而提高代码的可读性和运行效率。本文将对…

list常见接口的使用(基于c++标准库中的STL)

前言 list是重要的容器了解它的常见接口以及使用是很有必要的&#xff0c;为什么有了vector还要有list呢&#xff1f;因为vector存在一些缺陷&#xff0c;比如&#xff1a;容量满了要扩容&#xff0c;扩容是要付出代价的&#xff08;性能的损失&#xff09;&#xff0c;存在空…

【Leetcode -724.寻找数组的中心下标 -728.自除数】

Leetcode Leetcode -724.寻找数组的中心下标Leetcode -728.自除数 Leetcode -724.寻找数组的中心下标 题目&#xff1a;给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的…