作者: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里的位置。

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接口悬空,模拟从设备无响应的情况。

右键点击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。

注释掉代码中的Xil_Out32(0xFD616020, 0x103E7);一行,观察没有ATB时CPU的挂死现象。
结论
配置ATB的过程建议在芯片启动过程中进行,并确保相关AXI总线不存在数据传输。通过本文提供的方法,用户可以有效配置和测试Zynq MPSoC中的AXI超时模块,防止CPU挂死。用户可以参考UG1085获取更多ATB的介绍。