Xilinx AXI VIP使用教程

2023-11-13

Xilinx提供了用于验证AXI相关设计的AXI VIP(AXI Verification IP),它可以对自己设计的AXI接口模块进行全方位的验证(如使用VIP的Master、Passthrough、Slave三种模式对自己写的AXI接口进行仿真验证),提前规避和发现一些不满足AXI总线规范的设计问题。本文以Master AXI VIP为例,介绍其使用方法。

1. 创建block design

在这里插入图片描述
此处默认block design的名字为design_1

2. 添加相关ip

  1. 输入axi vip,添加axi vip ip核

在这里插入图片描述
在这里插入图片描述
2. INTERFACE MODE选择MASTER
3. 添加AXI BRAM Controller和Block Memory Generator IP。同时将AXI BRAM Controller的接口数减少为1个。
在这里插入图片描述
在这里插入图片描述
4. 按下图所示进行连线
在这里插入图片描述
5. 为时钟和复位信号创建输入端口。
在这里插入图片描述
6. 分配地址空间, Validate Design, Generate Output Products, 然后Create HDL Wrapper.
在这里插入图片描述

  1. 创建testbench,语言类型选择system verilog。代码如下:
`timescale 1ns / 1ps

import axi_vip_pkg::*;
import design_1_axi_vip_0_0_pkg::*;

module tb_top();

bit clk;
bit aresetn;

//used in API and parital randomization for transaction generation and data read back from driver
axi_transaction                         wr_transaction;                // Write transaction
axi_transaction                         rd_transaction;                // Read transaction

xil_axi_uint                            mtestWID;                      // Write ID  
xil_axi_ulong                           mtestWADDR;                    // Write ADDR  
xil_axi_len_t                           mtestWBurstLength;             // Write Burst Length   
xil_axi_size_t                          mtestWDataSize;                // Write SIZE  
xil_axi_burst_t                         mtestWBurstType;               // Write Burst Type  
xil_axi_uint                            mtestRID;                      // Read ID  
xil_axi_ulong                           mtestRADDR;                    // Read ADDR  
xil_axi_len_t                           mtestRBurstLength;             // Read Burst Length   
xil_axi_size_t                          mtestRDataSize;                // Read SIZE  
xil_axi_burst_t                         mtestRBurstType;               // Read Burst Type  
xil_axi_lock_t                          mtestLOCK;                     // LOCK value for WRITE/READ_BURST transaction
xil_axi_cache_t                         mtestCacheType = 3;            // Cache Type value for WRITE/READ_BURST transaction
xil_axi_prot_t                          mtestProtectionType = 3'b000;  // Protection Type value for WRITE/READ_BURST transaction
xil_axi_region_t                        mtestRegion = 4'b000;          // Region value for WRITE/READ_BURST transaction
xil_axi_qos_t                           mtestQOS = 4'b000;             // QOS value for WRITE/READ_BURST transaction
xil_axi_data_beat                       dbeat;                         // Data beat value for WRITE/READ_BURST transaction
xil_axi_user_beat                       usrbeat;                       // User beat value for WRITE/READ_BURST transaction
xil_axi_data_beat [255:0]               mtestWUSER;                    // Wuser value for WRITE/READ_BURST transaction
xil_axi_data_beat                       mtestAWUSER = 'h0;             // Awuser value for WRITE/READ_BURST transaction
xil_axi_data_beat                       mtestARUSER = 0;               // Aruser value for WRITE/READ_BURST transaction
xil_axi_data_beat [255:0]               mtestRUSER;                    // Ruser value for WRITE/READ_BURST transaction
xil_axi_uint                            mtestBUSER = 0;                // Buser value for WRITE/READ_BURST transaction
xil_axi_resp_t                          mtestBresp;                    // Bresp value for WRITE/READ_BURST transaction
xil_axi_resp_t[255:0]                   mtestRresp;                    // Rresp value for WRITE/READ_BURST transaction

bit [63:0]                             mtestWData;                     // Write Data
bit[8*4096-1:0]                        Wdatablock;                     // Write data block
xil_axi_data_beat                      Wdatabeat[];                    // Write data beats

bit [63:0]                             mtestRData;                     // Read Data
bit[8*4096-1:0]                        Rdatablock;                     // Read data block
xil_axi_data_beat                      Rdatabeat[];                    // Read data beats


  initial begin
    aresetn = 1'b0;
    clk = 1'b0;
    #100ns;
    aresetn = 1'b1;
  end
   
  always #10 clk <= ~clk;

design_1 u_dut(
    .aclk       (clk     ),
    .aresetn    (aresetn )
);

design_1_axi_vip_0_0_mst_t              mst_agent;

initial begin
    mst_agent = new("master vip agent",u_dut.axi_vip_0.inst.IF);
    mst_agent.start_master();               // mst_agent start to run
    mtestWID = $urandom_range(0,(1<<(0)-1)); 
    mtestWADDR = 'hc000_1000;//$urandom_range(0,(1<<(32)-1));
    mtestWBurstLength = 0;
    mtestWDataSize = xil_axi_size_t'(xil_clog2((32)/8));
    mtestWBurstType = XIL_AXI_BURST_TYPE_INCR;
    mtestWData = 'h12345678;//$urandom();
    $display("mtestWDataSize = %d", mtestWDataSize);
    //single write transaction filled in user inputs through API 
    single_write_transaction_api("single write with api",
                                 .id(mtestWID),
                                 .addr(mtestWADDR),
                                 .len(mtestWBurstLength), 
                                 .size(mtestWDataSize),
                                 .burst(mtestWBurstType),
                                 .wuser(mtestWUSER),
                                 .awuser(mtestAWUSER), 
                                 .data(mtestWData)
                                 );
                                  
    mtestRID = $urandom_range(0,(1<<(0)-1));
    mtestRADDR = mtestWADDR;
    mtestRBurstLength = 0;
    mtestRDataSize = xil_axi_size_t'(xil_clog2((32)/8)); 
    mtestRBurstType = XIL_AXI_BURST_TYPE_INCR;
    
    $display("mtestRDataSize = %d", mtestRDataSize);
    //single read transaction filled in user inputs through API 
    single_read_transaction_api("single read with api",
                                 .id(mtestRID),
                                 .addr(mtestRADDR),
                                 .len(mtestRBurstLength), 
                                 .size(mtestRDataSize),
                                 .burst(mtestRBurstType)
                                 );
end

  task automatic single_write_transaction_api ( 
                                input string                     name ="single_write",
                                input xil_axi_uint               id =0, 
                                input xil_axi_ulong              addr =0,
                                input xil_axi_len_t              len =0, 
                                input xil_axi_size_t             size =xil_axi_size_t'(xil_clog2((32)/8)),
                                input xil_axi_burst_t            burst =XIL_AXI_BURST_TYPE_INCR,
                                input xil_axi_lock_t             lock = XIL_AXI_ALOCK_NOLOCK,
                                input xil_axi_cache_t            cache =3,
                                input xil_axi_prot_t             prot =0,
                                input xil_axi_region_t           region =0,
                                input xil_axi_qos_t              qos =0,
                                input xil_axi_data_beat [255:0]  wuser =0, 
                                input xil_axi_data_beat          awuser =0,
                                input bit [63:0]              data =0
                                                );
    axi_transaction                               wr_trans;
    $display("single_write_transaction_api size = %d", size);
    wr_trans = mst_agent.wr_driver.create_transaction(name);
    wr_trans.set_write_cmd(addr,burst,id,len,size);
    wr_trans.set_prot(prot);
    wr_trans.set_lock(lock);
    wr_trans.set_cache(cache);
    wr_trans.set_region(region);
    wr_trans.set_qos(qos);
    wr_trans.set_data_block(data);
    mst_agent.wr_driver.send(wr_trans);   
  endtask  : single_write_transaction_api 
 
  task automatic single_read_transaction_api ( 
                                    input string                     name ="single_read",
                                    input xil_axi_uint               id =0, 
                                    input xil_axi_ulong              addr =0,
                                    input xil_axi_len_t              len =0, 
                                    input xil_axi_size_t             size =xil_axi_size_t'(xil_clog2((32)/8)),
                                    input xil_axi_burst_t            burst =XIL_AXI_BURST_TYPE_INCR,
                                    input xil_axi_lock_t             lock =XIL_AXI_ALOCK_NOLOCK ,
                                    input xil_axi_cache_t            cache =3,
                                    input xil_axi_prot_t             prot =0,
                                    input xil_axi_region_t           region =0,
                                    input xil_axi_qos_t              qos =0,
                                    input xil_axi_data_beat          aruser =0
                                                );
    axi_transaction                               rd_trans;
    $display("single_read_transaction_api size = %d", size);
    rd_trans = mst_agent.rd_driver.create_transaction(name);
    rd_trans.set_read_cmd(addr,burst,id,len,size);
    rd_trans.set_prot(prot);
    rd_trans.set_lock(lock);
    rd_trans.set_cache(cache);
    rd_trans.set_region(region);
    rd_trans.set_qos(qos);
    mst_agent.rd_driver.send(rd_trans);   
  endtask  : single_read_transaction_api

endmodule

其中,import design_1_axi_vip_0_0_pkg::*;design_1_axi_vip_0_0_mst_t mst_agent;语句中的design_1为block_design名称。需根据实际情况修改。

design_1 u_dut(
    .aclk       (clk     ),
    .aresetn    (aresetn )
);

是对顶层设计模块的例化,模块名以及接口信号名称也需要根据实际情况修改,使之对应。
8. 运行仿真,并观察波形。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xilinx AXI VIP使用教程 的相关文章

  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • Verilog的奇技淫巧[更新中]

    1 Verilog常用的数据选择语句vect a b 或vect a b 转载自 MDY常用的数据选择语句Verilog明德扬论坛 Powered by Discuz vect为变量名字 a为起始位置 加号或者减号代表着升序或者降序 b是进
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • Verilog HDL——分频 计数

    分频 计数 module traffic Clk 50M Rst Clk30 Clk 1Hz input Clk 50M Rst output Clk30 Clk 1Hz 分频器 reg Clk 1Hz 分频器 50M分频 reg 31 0
  • 硬件基础知识

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 SCLK SCLK是一种有固定周期并与运行无关的信号量 CLK CLK是一种脉冲信号 TDNN 时延神经网络 它的两
  • FPGA零基础学习之Vivado-UART驱动教程

    FPGA零基础学习之Vivado UART驱动教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • MOS管的知识,看这一篇就可以了

    转载 21ic电子网 2020 11 15 18 19 以下文章来源于记得诚电子设计 作者记得诚 记得诚电子设计 分享电子硬件知识 永远相信美好的事情即将发生 今天的文章简单总结一下MOS管 如下是本文目录 场效应管分类 场效应管分为结型
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • FPGA project : water_led

    module water led parameter MAX CNT 25 d25 000 000 input wire sys clk input wire sys rst n output wire 03 00 led signal r
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • 关于xilinx BRAM IP的延迟以及流程

    关于RAM IP的延迟 1 选择了output registers 可以在RAM输出端口添加register 也可以在core的输出添加 在primitives添加 降低clock to out到primitive的延迟 在core添加re
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • [从零开始学习FPGA编程-28]:进阶篇 - 基本组合电路-奇偶校验生成器(Verilog语言版本)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 奇偶校验生成器 1 1 什么是奇校验 1 2 Verilog语言描述
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd

随机推荐

  • 嵌入式ERPC框架正式发布了

    一 ERPC开发的原由 随着科技日新月异的快速发展 电子产品的功能越来越多 业务也越来越复杂 以前靠单打独斗完成电子产品的研发的时代已经慢慢远去 更多的是靠一个团队协作共同努力才能完成 这就为电子产品的设计和研发带来了新的问题 团队的协作
  • RDF与可视化【转载】

    Rudolf RDFViz Exploring tools for RDF Graph Visualisation http www ilrt bris ac uk discovery rdf dev rudolf rdfviz To vi
  • 网站遭遇CC及DDOS攻击紧急处理方案

    检测访问是否是CC攻击的命令 80口为网站的访问端口 可以根据实际情况进行修改 netstat anlp grep 80 grep tcp awk print 5 awk F print 1 sort uniq c sort nr head
  • 华为OD机试真题-矩阵元素的边界值-2023年OD统一考试(B卷)

    题目描述 给定一个N M矩阵 请先找出M个该矩阵中每列元素的最大值 然后输出这M个值中的最小值 补充说明 N和M的取值范围均为 0 100 示例1 输入 1 2 3 4 输出 3 说明 第一列元素为 1和3 最大值为3 第二列元素为 2和4
  • python奥特曼代码_【Python】奥特曼VS小怪兽、大战300回合

    上一节 lt gt 上一节我们学了类的基本使用 为了巩固学习 今天继续使用 类 来编程 好好学习 天天打卡 今天我们要研究的是 奥特曼打小怪兽 游戏策划 不要觉得没有用 题目 写出一个 奥特曼 和 小怪兽 类 基本属性有名字 生命值和魔法值
  • 服务的分类

    从技术实现角度和业务角度切入 来梳理服务的类别与层次 1 服务的基本类别 工具 实体和任务 工具服务 标准Api的封装 如JMS JDBC 公共功能区域的提炼 如消息传递 HTTP服务 安全性 非功能性需求的抽取 如拓展性 可用性 以及常见
  • Android Property System

    属性系统是android的一个重要特性 它作为一个服务运行 管理系统配置和状态 所有这些配置和状态都是属性 每个属性是一个键值对 key value pair 其类型都是字符串 从功能上看 属性与windows系统的注册表非常相似 许多an
  • 浅谈深拷贝和浅拷贝的区别

    举例 假设B复制了A 当修改A时 看B是否会发生变化 如果B也跟着变了 说明这是浅拷贝 如果B没变 那就是深拷贝 阐述一下栈堆 基本数据类型与引用数据类型 因为这些概念能更好的让你理解深拷贝与浅拷贝 一 预备知识 两种不同数据类型的值 基本
  • 静态/动态博客Blog框架简介

    简言之 Blog就是以网络作为载体 简易迅速便捷地发布自己的心得 及时有效轻松地与他人进行交流 再集丰富多彩的个性化展示于一体的综合性平台 博客搭建的方式 总体来说 Blog搭建的方式可以分为静态博客和动态博客 顾名思义 静态博客 博文内容
  • css强制一行显示超出的部分显示点点点

    要达到的效果 1 首先盒子应该有固定的宽度 width 200px 2 设置 溢出隐藏 overflow hidden 3 设置文本强制在一行显示 white space nowrap 4 设置文本溢出显示省略号 text overflow
  • js判断多个数组之间是否存在交集

    代码如下 定义一个二维数组 数组中包含N个数组 const arrays 1 2 3 4 5 6 2 7 8 9 10 2 把数组传入进来 function checkIntersection arrays for let i 0 i lt
  • 【小程序】那些年小程序碰过的坑——Scroll-view跳转问题

    序 写到scroll view 就不得不涉及到其中的各个Object属性 但是这个控件本身又很奇特 属性内部经常自相矛盾 着实让人头疼不已 好记性不如烂笔头 记录下来警示自己 也帮助他人 何乐而不为呢 正文 要想Scrolliew进行跳转
  • mat1 and mat2 shapes cannot be multiplied (128x432 and 576x64)的解决

    仅作为记录 大佬请跳过 今天博主在跑大佬博主的pytorch cnn分类mnist数据集的程序 大佬博主文章 第四个网络 出现问题 经过尝试 发现是在定义网络中的问题 将x x view 128 1 改为x x view 1 64 3 3
  • error: struct type mismatch between shaders for uniform (named light)

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 错误原因 二 排查错误 1 使用glslangValidator exe工具 2 顶点着色器着色器1 vert1Shader vert 顶点着色器着色器2 vert2S
  • 【GD32F427开发板试用】 CAN总线收发测试

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动 更多开发板试用活动请关注极术社区网站 作者 meijing 这篇测试下CAN通信的收发测试 代码使用库例程中修改 硬件部分 测试用到了CAN0 串口0和定时器1 1 gt
  • 【读书笔记】Linux高性能服务器编程(第二篇 第五章)

    第五章 Linux网络编程基础API 5 1 socket地址API 5 1 1 主机字节序和网络字节序 字节序分为 1 大端字节序 一个整数的高位字节 23 31 bit 存储在内存的低地址处 低位字节 0 7 bit 存储在内存的高地址
  • okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据

    okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据 Gson gson new GsonBuilder serializeNulls create 1 配置创建okhttp客户端 OkHttpCl
  • 《Python核心编程》读书笔记

    第一章 Python对象 1 1 Python对象 Python使用对象模型来存储数据 所有的Python对象都有三个特性 身份 类型和值 身份可以使用内建函数id 得到 类型可以使用内建函数type 查看 1 2 标准类型 数字 整形 I
  • WGS84的理解

    转载 https support virtual surveyor com en support solutions articles 1000261351 what is wgs84 text When 20you 20determine
  • Xilinx AXI VIP使用教程

    Xilinx提供了用于验证AXI相关设计的AXI VIP AXI Verification IP 它可以对自己设计的AXI接口模块进行全方位的验证 如使用VIP的Master Passthrough Slave三种模式对自己写的AXI接口进