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

    文章

    9032

    浏览量

    153979
  • 参数
    +关注

    关注

    11

    文章

    1867

    浏览量

    33173
  • AXI
    AXI
    +关注

    关注

    1

    文章

    136

    浏览量

    17325

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

    使用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.7w次阅读

    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学习路线,从握手协议开始

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

    AXI VIP 中产生传输事务的基本方法

    本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。
    的头像 发表于 08-29 14:58 ?2543次阅读

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

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

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

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

    关于高质量的AMBA(APB/AHB/AXI) VIP的分享

    AMBA VIP 分享
    的头像 发表于 12-10 20:47 ?4434次阅读
    关于高质量的AMBA(APB/AHB/<b class='flag-5'>AXI</b>) <b class='flag-5'>VIP</b>的分享

    AXI VIP当作master时如何使用?

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