Zynq学习笔记--AXI 总线仿真(AXI VIP)

目录

1. 概述

2. Simulation with AXI VIP

2.1 axi_vip_pkg

 2.2 design_1_axi_vip_0_0_pkg

 2.3 参数指定

3. 实例化注意事项

3.1 名称对应关系

3.2 寄存器地址

 3.3 block design


1. 概述

AXI Verification IP(AXI VIP)是一种用于验证AXI总线协议的仿真工具,可帮助开发人员在设计阶段发现和解决潜在的硬件设计问题。通过使用AXI VIP,用户可以在仿真环境中模拟AXI总线的行为,验证设计的正确性和性能。

它只是一个仿真IP,不会被综合到最终的硬件中。

2. Simulation with AXI VIP

首先需要导入两个SystemVerilog包。类似于python中的导入。两者都用于导入代码中定义的函数、参数、类等,以便在当前文件中使用。

在SystemVerilog中,包是一种封装数据类型、任务和函数的机制,通常用于在不同的模块间共享。而Python的模块和包是文件和文件夹的集合,用于组织和重用代码。

import axi_vip_pkg::*; // 系统自带:<loc>/Vivado/2022.1/data/xilinx_vip/hdl/axi_vip_pkg.sv
import design_1_axi_vip_0_0_pkg::*; //在工程目录中

 我在注释中标注了包的具体位置,可以查看该包的具体行为。

2.1 axi_vip_pkg

定义了一个名为 axi_mst_agent 的SystemVerilog类,继承自 xil_agent。

宏定义:AXI_PARAM_DECL 是一个宏定义。
类扩展:axi_mst_agent 类通过 AXI_PARAM_DECL 宏应用这些参数,并扩展了 xil_agent 类。
组件实例化:
        monitor:用于监控AXI总线上的事务。
        wr_driver:用于驱动AXI总线上的写操作。
        rd_driver:用于驱动AXI总线上的读操作。
构造函数:new 函数是类的构造函数,用于创建 axi_mst_agent 实例。它初始化了监控器、写驱动器、读驱动器,并将虚拟接口与代理关联起来。
虚拟接口:axi_vip_if 是一个虚拟接口,它允许 axi_mst_agent 与AXI总线的物理信号进行交互。
代理设置:vif_proxy 是一个代理,用于将虚拟接口的操作映射到物理接口。这允许在仿真环境中模拟实际的硬件行为。

<axi_vip_pkg.sv> 中定义的 axi_mst_agent 类,继承自xil_agent

`define AXI_PARAM_DECL #( //宏定义
  int C_AXI_PROTOCOL=0,
      C_AXI_ADDR_WIDTH=32, 
      C_AXI_WDATA_WIDTH=32,
      C_AXI_RDATA_WIDTH=32,
      C_AXI_WID_WIDTH=0,
      …)

class axi_mst_agent `AXI_PARAM_DECL extends xil_agent;
  axi_monitor       `AXI_PARAM_ORDER monitor;
  axi_mst_wr_driver `AXI_PARAM_ORDER wr_driver;
  …
  function new (string name = "unnamed_axi_mst_agent",
      virtual interface axi_vip_if `AXI_PARAM_ORDER vif);
    super.new(name); //调用其基类的构造函数
    this.monitor   = new($sformatf("%s_monitor",name));
    this.wr_driver = new($sformatf("%s_wr_driver",name));
    this.rd_driver = new($sformatf("%s_rd_driver",name));
    this.vif_proxy = new($sformatf("%s_vif",name));
    this.vif_proxy.assign_vi(vif);
    this.set_vif(this.vif_proxy);
  endfunction : new  // axi_mst_agent类构造函数
…
endclass : axi_mst_agent

 2.2 design_1_axi_vip_0_0_pkg

定义了一个封装包,其中包含了一些参数和类型定义,用于配置和实例化AXI VIP组件。

首先,在package中定义了一些参数,如VIP_PROTOCOL和VIP_READ_WRITE_MODE,用于指定AXI VIP的协议和读写模式。

然后,通过typedef关键字定义了一个名为design_1_axi_vip_0_0_mst_t的类型,该类型是axi_mst_agent类的特化版本,根据之前定义的参数进行特化。

启动验证组件的示例代码:

首先声明了一个名为master_agent的design_1_axi_vip_0_0_mst_t类型的对象,然后在initial块中创建并启动了这个agent。通过实例化和启动这个agent,可以开始对AXI VIP进行仿真测试。最后,使用endpackage关键字结束了这个封装包的定义。

 2.3 参数指定

SystemVerilog中,类并不直接支持像C++Java中的模板化(泛型)编程,但它允许你创建参数化的类,这些参数通过顺序指定。如下:

// <component_name>_pkg

parameter design_1_axi_vip_0_0_VIP_PROTOCOL         = 2;
parameter design_1_axi_vip_0_0_VIP_READ_WRITE_MODE  = "READ_WRITE";
parameter design_1_axi_vip_0_0_VIP_INTERFACE_MODE   = 0;
parameter design_1_axi_vip_0_0_VIP_ADDR_WIDTH       = 32;
parameter design_1_axi_vip_0_0_VIP_DATA_WIDTH       = 32;
…

typedef axi_mst_agent #(
    design_1_axi_vip_0_0_VIP_PROTOCOL, 
    design_1_axi_vip_0_0_VIP_ADDR_WIDTH,
    design_1_axi_vip_0_0_VIP_DATA_WIDTH,
    design_1_axi_vip_0_0_VIP_DATA_WIDTH,
    design_1_axi_vip_0_0_VIP_ID_WIDTH,
    …
) design_1_axi_vip_0_0_mst_t;

3. 实例化注意事项

3.1 名称对应关系

3.2 寄存器地址

 3.3 block design

 

  • 32
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值