AXI 基础第 5 讲 - 创建 AXI4-Lite Sniffer IP 以在赛灵思 Vivado IP integrator 中使用

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

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

在本篇 AXI 基础系列讲座的新博文中,我们将讲解下如何创建可在赛灵思 Vivado IP integrator 中使用的 AXI Sniffer IP

引言

在某些情况下,通过嗅探 AXI 接口来分析其中正在发生的传输事务是很有用的。在本文中,我将为大家演示如何创建基本 AXI4-Lite Sniffer IP 以对特定地址上正在发生的读写传输事务进行计数。

首先,编写 HDL (Verilog) 代码,然后将其封装为 IP,最后将此 IP 添加到 IP Integrator Block Design (BD) 中。

我们将创建包含 AXI4-Lite 输入接口的 AXI Sniffer 用于嗅探 AXI4-Lite 链接,并包含 2 项输出以提供在特定地址上发生的读写传输事务的数量(地址可通过 GUI 配置)。

 


创建 AXI Sniffer IP 以在 Vivado IP integrator 中使用(教程)

 

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

    这将创建一个附带 BD 的 Vivado 工程,此 BD 包含 AXI VIP(设置为 AXI4-Lite 主接口)和 AXI GPIO IP。这与我们在 AXI 基础第 3 讲一文中完成的最终设计十分相似。


    在此工程中,我们将创建 AXI Sniffer IP,然后尝试将其连接到位于 AXI VIP 和 AXI GPIO IP 之间的 AXI4-Lite 接口

    首先,让我们来编写适用于 AXI Sniffer IP 的 HDL (Verilog) 代码

 

  1. 双击“源 (Sources)”窗口中的 AXI_Sniffer.v 文件以在文本编辑器中将其打开



    首先,需要声明 IP 端口。我们需要 1 个 AXI4-Lite 接口。根据 ARM 网站上提供的 AMBA® AXI™ 和 ACE™ 协议规范(链接),AXI4-Lite 接口上所需信号如下



    我们还需要添加 2 个端口(read_accesses 和 write_accesses),用于输出 IP 监测地址的读写访问次数。

 

  1. 添加以下代码以声明所有必需的信号。
module AXI_Sniffer
(
    input           aclk,
    input           aresetn,
    input           s_axi_arvalid,
    input           s_axi_arready,
    input [31:0]    s_axi_araddr,
    input [2:0]     s_axi_arprot,
    input           s_axi_rvalid,
    input           s_axi_rready,
    input [31:0]    s_axi_rdata,
    input [1:0]     s_axi_rresp,
    input           s_axi_awvalid,
    input           s_axi_awready,
    input [31:0]    s_axi_awaddr,
    input [2:0]     s_axi_awprot,
    input           s_axi_wvalid,
    input           s_axi_wready,
    input [31:0]    s_axi_wdata,
    input [3:0]     s_axi_wstrb,
    input           s_axi_bready,
    input           s_axi_bvalid,
    input [1:0]     s_axi_bresp,
    output [31:0]   read_accesses,
    output [31:0]   write_accesses
    );


 

 

:在本例中,所有 AXI4-Lite 信号均设置为输入,因为 IP 不应对 AXI4-Lite 接口执行任何操作,仅限于监测其中的流量


然后,IP 需要 1 个参数用于设置要监测的地址
 

  1. 添加以下代码以添加用于监测地址的参数
module AXI_Sniffer
#(
    parameter  SLAVE_BASE_ADDR  = 32'h40000000
)
(

 

 

最后,我们需要添加用于对地址访问次数进行计数的逻辑。监测地址出现在 axi 总线上时,每次 r/wready r/wvalid 处于高位时,此代码都会将计数增加 1
 

  1. 请将以下代码添加到此文件中
reg [31:0] read_accesses_cnt;
reg [31:0] write_accesses_cnt;
     
assign read_accesses  = read_accesses_cnt;
assign write_accesses = write_accesses_cnt;
     
//Check the Read Address Channel
always @(posedge aclk)
begin
    if(aresetn == 0)
    begin
        read_accesses_cnt  = 0;
    end
    else if (s_axi_arready && s_axi_arvalid && s_axi_araddr == SLAVE_BASE_ADDR)
    begin
        read_accesses_cnt = read_accesses_cnt + 1;
    end
    else
        read_accesses_cnt = read_accesses_cnt;
end
     
//Check the Write Address Channel
always @(posedge aclk)
begin
    if(aresetn == 0)
    begin
        write_accesses_cnt = 0;
    end
    else if (s_axi_awready && s_axi_awvalid && s_axi_awaddr == SLAVE_BASE_ADDR)
    begin
        write_accesses_cnt = write_accesses_cnt + 1;
    end
    else
        write_accesses_cnt = write_accesses_cnt;
end

endmodule

 

  1. 保存 AXI_Sniffer.v 文件

    在 IP integrator 中,提供了一项允许用户将 HDL 文件导入 BD 的功能。

    右键单击 BD,然后单击“添加模块 (Add Module...)”

 

可以看到,该工具将所有 s_axi_* 信号组合为接口 s_axi。但如果我们尝试将此接口连接到 AXI VIP AXI GPIO 之间的现有连接上,该工具将会禁止此操作。



这是因为导入模块工具已将 s_axi 接口设置为从接口,而 Vivado 仅允许每个主接口连接到一个从接口。

要创建监测 IP,我们需要将代码封装为 IP,这将为我们提供更多接口选项。

  1. 单击“工具 (Tools) > 创建并封装新 IP (Create and Package New IP...)
     
  2. 在“Create and Package New IP”的第 2 个页面上,选择“封装指定目录 (Package a specified directory)”,然后单击“下一步 (Next)”  
     
  3. 选中 AXI_Basics_5/src/hdl/AXI_Sniffer 目录,然后单击“Next > Next(保留默认设置) > 完成 (Finish)”

    这样将创建 IP Packager 工程  。在“封装 IP (Package IP)”选项卡中,单击“端口和接口 (Ports and Interface)”部分。




    可以看到,工具又一次将 s_axi_* 信号分组构成 s_axi 接口。但此接口仍设置为从接口。要连接到现有 AXI 总线,我们需要告知该工具,此接口并非从接口,而是监测接口。

 

  1. 右键单击 s_axi 接口,然后单击“编辑接口 (Edit Interface...)”

 

  • 在“Edit Interface”窗口的“常规 (General)”选项卡中,将“模式 (Mode)”更改为“monitor”  

  • 然后单击“端口映射 (Port Mapping)”选项卡,并启用“隐藏已映射的端口 (Hide Mapped Port)” 

 

  • 对于 IP 的每个名为 s_axi_* 的物理端口,查找接口的匹配“逻辑端口 (Logical Ports)”,然后单击“映射端口 (Map Ports)”

 

  1. 完成所有 s_axi_* 端口映射后,单击“确定 (OK)”,以关闭“编辑接口 (Edit Interface)”窗口
     
  2. 再次右键单击 s_axi 接口,然后单击“关联时钟 (Associate Clocks...)”

 

  1. 在下一个窗口中,应已自动选中 aclk。单击“OK”

 

  1. 单击“复查并封装 (Review and Package)”部分,然后单击“封装 IP (Package IP)”。

 

这样将关闭 IP Packager 工程。
 

  1. 从初始工程的 BD 中移除先前的 AXI_Sniffer IP
     
  2. 右键单击初始工程的 BD,然后单击“添加 IP (Add IP)”。找到 AXI Sniffer IP(应已自动添加到 IP 目录中),并将其添加到 BD


  3. 尝试将新 AXI Sniffer IP 的 s_axi 接口连接到 AXI VIP 与 AXI GPIO 之间的总线。现在,此操作已可行

  4. 将定制 IP 的 aclk 和 aresetn 输入端口连接到对应的 BD 端口
     
  5. 验证 BD 设计。确保其中不存在任何严重警告或错误。保存 BD。

    最后,我们可在仿真中验证此 IP 是否有效。

     
  6. 启动仿真,将 AXI_Sniffer IP 的端口 read_accesses 和 write_accesses 添加到波形窗口中

 

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



    在仿真波形中可以看到,正在执行 2 项读取和 2 项写入传输事务。但我们的 IP 计数仅显示 2 项写入传输事务和 1 项读取传输事务



    我们可以观察每项传输事务的地址,查看输出是否正确。在 IP 监测的地址 0x4000_0000 上正在发生 2 项写入传输事务



    但只有 1 项读取传输事务目标为地址 0x4000_0000(另一项读取传输事务目标为 0x4000_0008),因此 IP 行为正确



    本文仅展示了 1 个利用 AXI Sniffer(或者称为 Monitor)IP 可实现的操作的示例。您可编辑 Verilog 代码以添加自己的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值