AXI 基础第 3 讲 - 使用 AXI VIP 对 AXI4-Lite 主 (Master) 接口进行仿真

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。

以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。

本篇 AXI 基础系列博文将展示如何使用赛灵思 AXI Verification IP AXI4-Lite 主接口进行仿真。同时,我们还将详细介绍 AXI4-Lite 读写 (Read/Write) 传输过程。


AXI 基础第 3 讲 - 使用 AXI VIP 对 AXI4-Lite 主 (Master) 接口进行仿真

引言

在前几篇 AXI 基础系列文章中,我们简要介绍了 AXI4 总线规范(AXI 基础第 1 讲)以及 AXI Verification IP (AXI VIP)AXI 基础第 2 讲)。

在这篇新博文中,我们来聊一聊如何将 AXI VIP 添加到 Vivado 工程中,并对 AXI4-Lite 接口进行仿真。随后,我们将在仿真波形窗口中讲解用于 AXI4-Lite 传输事务的信号。

 

使用 AXI VIP 作为 AXI4-Lite 主接口(教程)

  1. 下载设计文件(本文后附
     
  2. 打开 Vivado 2019.2。
     
  3. 在 Tcl 控制台中,使用 cd 命令进入解压缩的目录 (cd AXI_Basics_3)
     
  4. 在 Tcl 中,使用 source 命令执行 Tcl 脚本 (source ./create_proj.tcl)

    这将创建 1 个 Vivado 工程,其中附带包含 AXI GPIO IP 的块设计 (Block Design)。此 AXI GPIO IP 的通道 1 作为外部输出接口,用于仿真到板载 LED 的连接,我们将尝试通过 AXI4-Lite 传输事务来开关此 LED;同时,此 IP 的通道 2 作为外部输入接口,用于仿真到板载开关的连接,我们将尝试读取此开关的状态。


 

  1. 将 AXI Verification IP (AXI VIP) 添加到设计中。
     
  2. 双击 AXI VIP 打开其配置 GUI,并修改以下参数: 
  • Interface mode:MASTER 

  • Protocol (MANUAL):AXI4LITE

 

  1. 将 AXI VIP 的 AXI4-Lite 主接口 (M_AXI) 连接到 AXI GPIO IP 的 AXI4-Lite 从接口 (S_AXI),将 AXI VIP 的 aclk 和 aresetn 端口连接到块设计的输入

  2. 打开“地址编辑器 (Address Editor)”选项卡(“窗口 (Window) > 地址编辑器 (Address Editor)”),然后单击“自动分配地址 (Auto Assign Address)”图标

 

  1. 确认此地址设置为 0x4000_0000



    :此处地址的上半部分无关紧要,因为 AXI GPIO 的 S_AXI 接口中仅有 9 个地址位连接到 AXI VIP
  2. 验证块设计。确保其中不存在任何严重警告或错误。
    然后保存块设计。

    现在,我们需要更新测试激励文件,以声明例化并控制 AXI VIP。
    为此,我们将按照(PG2672019 10 30 v1.1)中“实用编码指南与示例”章节的内容来进行操作。

     
  3. 从“源 (Sources)”窗口打开测试激励文件 AXI_GPIO_tb.sv



    测试激励文件中已包含部分信号(例如,时钟和复位)的控制逻辑,并包含将 LED 状态输出至控制台的流程。

 

always @(posedge led_1)

begin

     $display("led 1 ON");

end

always @(negedge led_1)

begin

     $display("led 1 OFF");

end


实用编码指南与示例”中提到的第 1 步是在 SystemVerilog 测试激励中创建 1 个模块。此操作在此测试激励文件中已完成。

2 步是导入 2 个必需的包:axi_vip_pkg <component_name>_pkg

:请使用以下 Tcl 命令来查找 VIP 实例的 <component_name>,以及对应于 AXI VIP 实例的输出。
随附的测试激励文件中假定 AXI 组件名称为 design_1_axi_vip_0_0(添加到 BD 的首个 AXI VIP 的默认名称)

get_ips *vip*
  • 在第 58 行附近添加以下行
//Step 2 - Import two required packages: axi_vip_pkg and <component_name>_pkg.
import axi_vip_pkg::*;
import AXI_GPIO_Sim_axi_vip_0_0_pkg::*;

 

3 步是声明 master VIP 的代理 (agent)
 

  • 在第 102 行附近添加以下行
// Step 3 - Declare the agent for the master VIP
AXI_GPIO_Sim_axi_vip_0_0_mst_t      master_agent;

 

4 步和第 5 步为创建新代理并将其启动。
 

  1. 在第 107 行附近添加以下行 
// Step 4 - Create a new agent

master_agent = new("master vip agent",UUT.AXI_GPIO_Sim_i.axi_vip_0.inst.IF);



// Step 5 - Start the agent

master_agent.start_master();


准备就绪,可以发送传输事务了。

发送 AXI4-Lite 传输事务其实很简单。只需使用 AXI4LITE_WRITE_BURST(addr,prot,data,resp) API 执行写传输事务,使用 AXI4LITE_READ_BURST(addr,prot,data,resp) API 执行读传输事务即可。

AXI VIP 的所有 API 都记录在 zip 文件中您可从 Xilinx.com 此处下载该文件。

 

在本教程中,我们将尝试开关连接到 AXI GPIO 通道 1 LED_1,并读取连接到 AXI GPIO 通道 2 SWITCH_1 的状态。

通过查看 AXI GPIO IP 的寄存器映射(PG144) 的表 2-4)可知,我们必须在地址 0x0 执行写操作,在地址 0x8 执行读操作:




我们将从写操作开始,尝试切换 LED_1 的状态。

添加以下代码以将 0x1 写入 AXI GPIO 寄存器 0x0,这样应可开启此 LED

//Send 0x1 to the AXI GPIO Data register 1
#500ns
addr = 0;
data = 1;
master_agent.AXI4LITE_WRITE_BURST(base_addr + addr,0,data,resp);

 添加以下代码以将 0x0 写入 AXI GPIO 寄存器 0x0,这样应可关闭此 LED 

//Send 0x0 to the AXI GPIO Data register 1

#200ns

addr = 0;

data = 0;

master_agent.AXI4LITE_WRITE_BURST(base_addr + addr,0,data,resp);

下一步,我们将读取开关位置的每次变更,并向控制台显示开关状态。

添加对应于读传输事务的以下代码:

// Switch in OFF position
switch_1 = 0;
// Read the AXI GPIO Data register 2
#200ns
addr = 8;
master_agent.AXI4LITE_READ_BURST(base_addr + addr,0,data,resp);
switch_state = data&1'h1;
if(switch_state == 0)
    $display("switch 1 OFF");
else
    $display("switch 1 ON");
     
// Switch in ON position
switch_1 = 1;
// Read the AXI GPIO Data register 2
#200ns
addr = 8;
master_agent.AXI4LITE_READ_BURST(base_addr + addr,0,data,resp);
switch_state = data&1'h1;
if(switch_state == 0)
    $display("switch 1 OFF");
else
    $display("switch 1 ON");

启动仿真,并使其运行 3us。在 Tcl 控制台中,您应可看到该 LED 的开启和关闭,并可看到开关状态



现在,我们即可对 AXI4-Lite 接口上的传输事务进行分析

  1. 在“范围 (Scope)”窗口中,选中位于“AXI_GPIO_tb > UUT > AXI_GPIO_Sim_i”下的 axi_vip_0
  2.  在“对象 (Objects)”窗口中,右键单击 M_AXI 协议实例,然后单击“添加到波形窗口 (Add to Wave Window) 

  1. 重新启动仿真,并运行 3us

    这样在 AXI4-Lite 接口上将可看到 4 个传输事务:2 个写传输事务后接 2 个读传输事务
  2. 展开 M_AXI 协议实例,查看各个通道

    这样可以看到写传输事务中的各个步骤。
    首先,当 READY 和 VALID 信号在写地址通道上均处于高位(AWREADY 和 AWVALID)时,地址从主接口传输到从接口




    随后,当 READY 和 VALID 信号在写通道上均处于高位(WREADY 和 WVALID)时,数据从主接口传输到从接口
    :每个地址仅传输一个数据,因为在 AXI4-Lite 接口上不支持突发 (burst) 读写。


    最后,当从接口在写响应通道上发送写响应(以表明写操作是否成功)时,写传输事务即告完成。当 READY 和 VALID 信号在写响应通道上均处于高位(BREADY 和 BVALID)时,响应从从接口传输到主接口


    对于读传输事务,同样可执行此分析。
    首先,当 READY 和 VALID 信号在读地址通道上均处于高位(ARREADY 和 ARVALID)时,地址从主接口传输到从接口


随后,当 READY VALID 信号在读通道上均处于高位(RREADY RVALID)时,数据从从接口传输至主接口

注:执行读传输事务期间,从接口也会发送读响应以指示读操作是否成功。

此响应将与读通道上的数据同时发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值