Zynq MPSoC上AXI超时模块(ATB)的配置与测试方法

作者:Longley Zhang,AMD工程师;来源:AMD开发者社区

引言

Zynq MPSoC中的AXI超时模块(AXI Timeout Block,简称ATB)用于监控AXI传输,确保在从设备未响应时及时向主设备发送错误响应(SLVERR),防止CPU挂死。本博客介绍了一个基于2025.1 Vivado/Vitis的ATB配置和测试方法。

ATB的作用

CPU挂死的常见原因之一是AXI4传输未能完成,通常由于以下两个原因:

  • PS-PL的AXI4接口未连接任何逻辑

  • PL中的从设备无响应

ATB的作用就是防止CPU由于上述原因挂死。

Zynq MPSoC内部有五个AXI超时模块(ATB),分别监控以下AXI总线接口:

  • M_AXI_HPM0_LPD

  • M_AXI_HPM0_FPD

  • M_AXI_HPM1_FPD

  • PCIe和GPU

  • 路由到PS其他外设

下图的红框标出了这五个ATB在MPSoC PS里的位置。

Zynq MPSoC框图.png

ATB的配置步骤

由于Vitis里没有提供ATB配置的驱动以及例程,用户需要根据UG1085第15章里ATB一节的流程去配置ATB。本博客提供一个简单的ATB配置例子,并测试ATB是否正常工作。

1. 创建Vivado工程:

  • 在2025.1 Vivado中创建一个ZCU102工程。

  • 运行附件的tcl脚本atb_test_prj.tcl创建Block Design(BD)工程。

  • 在BD工程中,将M_AXI_HPM1_FPD接口悬空,模拟从设备无响应的情况。

Zynq.png

  • 右键点击DB,选择“Create HDL Wrapper”。

  • 点击“Generate Bitstream”生成bit文件。

  • 选择菜单File->Export->Export Hardware导出xsa文件。

2. 创建Vitis工程:

打开2025.1 Vitis,使用导出的xsa文件创建platform project,选择A53的standalone OS。

创建一个空的application project,导入附件的helloworld.c,然后编译。

3. 下载与测试:

右键点击新建的application project,选择“Debug As”,将程序通过debug方式下载到ZCU102。

通过单步运行或设置断点,观察程序运行Xil_Out32(0xB0000000, 0x1)后进入SerrorHandler。

测试.png

注释掉代码中的Xil_Out32(0xFD616020, 0x103E7);一行,观察没有ATB时CPU的挂死现象。

结论

配置ATB的过程建议在芯片启动过程中进行,并确保相关AXI总线不存在数据传输。通过本文提供的方法,用户可以有效配置和测试Zynq MPSoC中的AXI超时模块,防止CPU挂死。用户可以参考UG1085获取更多ATB的介绍。