0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AXI VIP当作master时如何使用

傅里叶的猫 来源:傅里叶的猫 2023-07-27 09:19 次阅读

  AXI接口虽然经常使用,很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP,可以当做AXI的master、pass through和slave,本次内容我们看下AXI VIP当作master时如何使用。

  新建Vivado工程,并新建block design,命名为:axi_demo

4168dc3c-2c12-11ee-a368-dac502259ad0.png

新建axi vip,参数设置如下,第一个参数设置为Master,其他都保持默认,当然如果可以根据自己的实际需求作改动,比如id位宽,数据位宽等等。

418272c8-2c12-11ee-a368-dac502259ad0.pngimage-20230726185112648

再添加AXI BRAM Controller和Block Memory Generator:

41bc2fd6-2c12-11ee-a368-dac502259ad0.png

地址分配如下:0xc000_0000

41cd63e6-2c12-11ee-a368-dac502259ad0.png

生成ip的各种文件:

41e31a1a-2c12-11ee-a368-dac502259ad0.png

新建仿真的tb_top文件,需要注意,文件类型是system verilog

420b9f80-2c12-11ee-a368-dac502259ad0.pngimage-20230726185756796

仿真代码放到文章末尾,代码中中导入的axi_demo_axi_vip_0_0_pkg,就是下面axi vip的component_name再加上后缀_pkg,后面的mst_agent也是component_name加上后缀 _mst_t

importaxi_demo_axi_vip_0_0_pkg::*;
axi_demo_axi_vip_0_0_mst_tmst_agent;
4232e388-2c12-11ee-a368-dac502259ad0.pngimage-20230726190026270

运行仿真:

426af2b4-2c12-11ee-a368-dac502259ad0.pngimage-20230726190219346

将axi vip的M-AXI添加到波形窗口中:

427cbecc-2c12-11ee-a368-dac502259ad0.pngimage-20230726190445127

可以看到,我们一开始向地址0xc0001000写入0x12345678,又发起一次读操作,可以将该数据读出。

42b768e2-2c12-11ee-a368-dac502259ad0.pngimage-20230726190702883

有同学可能习惯用vcs来仿真,下篇文章我们再用vcs+verdi来仿真vivado的axi vip。

`timescale1ns/1ps

importaxi_vip_pkg::*;
importaxi_demo_axi_vip_0_0_pkg::*;

moduletb_top();

bitclk;
bitaresetn;

//usedinAPIandparitalrandomizationfortransactiongenerationanddatareadbackfromdriver
axi_transactionwr_transaction;//Writetransaction
axi_transactionrd_transaction;//Readtransaction

xil_axi_uintmtestWID;//WriteID
xil_axi_ulongmtestWADDR;//WriteADDR
xil_axi_len_tmtestWBurstLength;//WriteBurstLength
xil_axi_size_tmtestWDataSize;//WriteSIZE
xil_axi_burst_tmtestWBurstType;//WriteBurstType
xil_axi_uintmtestRID;//ReadID
xil_axi_ulongmtestRADDR;//ReadADDR
xil_axi_len_tmtestRBurstLength;//ReadBurstLength
xil_axi_size_tmtestRDataSize;//ReadSIZE
xil_axi_burst_tmtestRBurstType;//ReadBurstType
xil_axi_lock_tmtestLOCK;//LOCKvalueforWRITE/READ_BURSTtransaction
xil_axi_cache_tmtestCacheType=3;//CacheTypevalueforWRITE/READ_BURSTtransaction
xil_axi_prot_tmtestProtectionType=3'b000;//ProtectionTypevalueforWRITE/READ_BURSTtransaction
xil_axi_region_tmtestRegion=4'b000;//RegionvalueforWRITE/READ_BURSTtransaction
xil_axi_qos_tmtestQOS=4'b000;//QOSvalueforWRITE/READ_BURSTtransaction
xil_axi_data_beatdbeat;//DatabeatvalueforWRITE/READ_BURSTtransaction
xil_axi_user_beatusrbeat;//UserbeatvalueforWRITE/READ_BURSTtransaction
xil_axi_data_beat[255:0]mtestWUSER;//WuservalueforWRITE/READ_BURSTtransaction
xil_axi_data_beatmtestAWUSER='h0;//AwuservalueforWRITE/READ_BURSTtransaction
xil_axi_data_beatmtestARUSER=0;//AruservalueforWRITE/READ_BURSTtransaction
xil_axi_data_beat[255:0]mtestRUSER;//RuservalueforWRITE/READ_BURSTtransaction
xil_axi_uintmtestBUSER=0;//BuservalueforWRITE/READ_BURSTtransaction
xil_axi_resp_tmtestBresp;//BrespvalueforWRITE/READ_BURSTtransaction
xil_axi_resp_t[255:0]mtestRresp;//RrespvalueforWRITE/READ_BURSTtransaction

bit[63:0]mtestWData;//WriteData
bit[8*4096-1:0]Wdatablock;//Writedatablock
xil_axi_data_beatWdatabeat[];//Writedatabeats

bit[63:0]mtestRData;//ReadData
bit[8*4096-1:0]Rdatablock;//Readdatablock
xil_axi_data_beatRdatabeat[];//Readdatabeats


initialbegin
aresetn=1'b0;
clk=1'b0;
#100ns;
aresetn=1'b1;
end

always#10clk<= ~clk;

axi_demo u_dut(
    .aclk_0       (clk     ),
    .aresetn_0    (aresetn )
);

axi_demo_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

责任编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7640

    浏览量

    148512
  • 参数
    +关注

    关注

    11

    文章

    1398

    浏览量

    31472
  • AXI
    AXI
    +关注

    关注

    1

    文章

    126

    浏览量

    16290

原文标题:Xilinx AXI VIP使用教程

文章出处:【微信号:傅里叶的猫,微信公众号:傅里叶的猫】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AXI VIP设计示例 AXI接口传输分析

    赛灵思 AXI Verification IP (AXI VIP) 是支持用户对 AXI4 和 AXI4-Lite 进行仿真的 IP。它还可
    发表于 07-08 09:24 1337次阅读

    如何将AXI VIP添加到Vivado工程中

    在这篇新博文中,我们来聊一聊如何将 AXI VIP 添加到 Vivado 工程中,并对 AXI4-Lite 接口进行仿真。随后,我们将在仿真波形窗口中讲解用于AXI4-Lite 传输事
    发表于 07-08 09:27 1721次阅读

    如何使用AXI VIPAXI4(Full)主接口中执行验证和查找错误

    AXI 基础第 2 讲 一文中,曾提到赛灵思 Verification IP (AXI VIP) 可用作为 AXI 协议检查工具。在本次第4讲中,我们将来了解下如何使用它在
    发表于 07-08 09:31 2090次阅读

    使用JTAG到AXI Master无法调试设计的解决办法?

    我根据以下快速拍摄视频完成了我的设计:http://www.xilinx.com/video/hardware/using-jtag-to-axi-master-in-vivado.html在视频
    发表于 08-12 09:16

    求大佬分享uart2axi_master_intf程序源码

    求大佬分享uart2axi_master_intf程序源码
    发表于 02-22 06:43

    如何使用Xilinx AXI VIP对自己的设计搭建仿真验证环境的方法

    使用Vivado生成AXI VIPAXI Verification IP)来对自己设计的AXI接口模块进行全方位的验证(如使用VIP
    发表于 10-09 16:08

    AXI 总线交互分为 Master / Slave 两端

    在 AMBA 系列之 AXI 总线协议初探 中,了解到 AXI 总线交互分为 Master / Slave 两端,而且标准的 AXI 总线支持不同的位宽,既然是总线,那么必须要支持总线
    的头像 发表于 02-08 11:44 1.3w次阅读

    Xilinx AXI Interconnect

    在 AMBA 系列之 AXI 总线协议初探 中,了解到 AXI 总线交互分为 Master / Slave 两端,而且标准的 AXI 总线支持不同的位宽,既然是总线,那么必须要支持总线
    发表于 02-23 06:57 45次下载
    Xilinx <b class='flag-5'>AXI</b> Interconnect

    串口转axi主机总线接口

    uart2axi_master_intf程序源码:/**************************************************** Module Name
    发表于 12-28 20:04 14次下载
    串口转<b class='flag-5'>axi</b>主机总线接口

    利用axi_master接口指令端的几个静态参数的优化技巧

    本文给大家提供利用axi_master接口指令端的几个静态参数的优化技巧,从扩展总线接口数量,扩展总线位宽,循环展开等角度入手。最核心的优化思想就是以资源面积换取高带宽的以便并行计算。
    的头像 发表于 07-01 09:39 1058次阅读

    AXI学习路线,从握手协议开始

    AXI master的全面讨论变得困难。我还没有(还)想出如何简化材料来写一篇关于如何构建通用 AXI master器的帖子,这已经够难了——通常来说,寻址就是那么难。
    发表于 07-29 11:27 1012次阅读

    使用AXI VIP的几个关键步骤及常见功能

    使用Vivado生成AXI VIPAXI Verification IP)来对自己设计的AXI接口模块进行全方位的验证(如使用VIP
    的头像 发表于 10-08 16:07 4097次阅读

    一些高质量的AMBA(APB/AHB/AXI) VIP分享

    关于VIP的好处,估计就不用我安利了,引用最近S家的一句广告语,“拥有VIP,无惧芯片设计挑战”。而在当今的芯片领域,用的最多的可能还是标准总线APB/AHB/AXI等。提到VIP,估
    的头像 发表于 12-06 14:58 1164次阅读

    AXI VIP当作master时如何使用?

    AXI接口虽然经常使用,很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP,可以当做AXImaster、pass through和slave,本次内
    的头像 发表于 07-27 09:16 945次阅读
    <b class='flag-5'>AXI</b> <b class='flag-5'>VIP</b><b class='flag-5'>当作</b><b class='flag-5'>master</b>时如何使用?

    LogiCORE JTAG至AXI Master IP核简介

    LogiCORE JTAG至AXI Master IP核是一个可定制的核,可生成AXIAXI总线可用于处理和驱动系统中FPGA内部的AXI信号。AXI总线接口协议可通过IP定制Viva
    的头像 发表于 10-16 10:12 481次阅读
    LogiCORE JTAG至<b class='flag-5'>AXI</b> <b class='flag-5'>Master</b> IP核简介