3、AXI总线基础:AXI协议特性、通道、突发传输、outstanding与带宽关系

在STM32H7系列高性能MCU中,AXI(Advanced eXtensible Interface)总线矩阵是连接Cortex-M7内核、DMA控制器、LTDC显示控制器、以太网MAC以及片内SRAM/Flash的关键数据高速公路。与传统的AHB/APB总线相比,AXI协议引入了独立的地址/数据通道、突发传输(Burst)以及乱序完成(Out-of-Order Completion)机制,这些特性直接决定了AI推理时权重、激活值、中间缓冲区在总线上的搬运效率。理解AXI协议的核心参数——尤其是outstanding能力与带宽利用率之间的关系,是优化数据搬运、避免总线瓶颈的前提。

AXI总线通道与Outstanding带宽关系 主控端 Cortex-M7 / DMA / LTDC 从设备 SRAM / Flash / 外设 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) Outstanding 能力 允许未完成事务数 (如 8/16) 隐藏访存延迟,提升带宽利用率 有效带宽 = 数据总线宽度 × 时钟频率 × 传输效率 传输效率受突发长度、Outstanding数、从设备响应延迟共同影响 通道独立

上图展示了AXI协议的核心架构:主控端与从设备之间通过五个独立通道通信。读地址(AR)与读数据(R)通道分离,写地址(AW)、写数据(W)与写响应(B)通道分离。这种通道分离设计使得读操作和写操作可以并行执行,且地址阶段与数据阶段解耦,为outstanding机制提供了硬件基础。在STM32H7中,AXI总线运行在最高240MHz,数据总线宽度为64位(部分内部SRAM区域为32位),理论峰值带宽可达240MHz × 8字节 = 1.92GB/s。然而,实际有效带宽往往远低于此值,其关键制约因素正是outstanding深度与突发传输效率。

3.1 AXI协议特性与通道机制

核心原理:五通道独立与握手协议

AXI协议基于VALID/READY握手信号完成每一次传输。主控端拉高VALID表示数据或地址有效,从设备拉高READY表示可以接收。只有当VALID和READY同时为高时,传输才真正发生。这一机制允许主控端在从设备尚未就绪时持续发送地址或数据,也允许从设备在数据未准备好时通过拉低READY进行流控。五个通道各自独立握手,意味着读地址通道上的事务不必等待读数据通道完成即可继续发送下一个地址——这正是outstanding能够提升带宽的根本原因。

通道名称方向功能关键信号
AR(读地址)主→从携带读地址、突发长度、突发大小ARADDR, ARLEN, ARSIZE, ARBURST
R(读数据)从→主返回读数据及响应状态RDATA, RRESP, RLAST
AW(写地址)主→从携带写地址、突发长度、突发大小AWADDR, AWLEN, AWSIZE, AWBURST
W(写数据)主→从传输写数据,可穿插字节使能WDATA, WSTRB, WLAST
B(写响应)从→主写事务完成确认BRESP

在STM32H7的AXI SRAM(如DTCM、ITCM、AXI SRAM)访问中,读操作通常比写操作更频繁且对延迟更敏感。AI推理时,卷积层的权重读取、激活值加载都属于读密集型操作。若仅依赖单次读事务,主控端必须等待从设备返回数据后才能发起下一次读请求,总线空闲周期将占据大量时间。

判断方法:如何评估通道利用率

评估AXI通道利用率时,可借助STM32CubeMonitor或逻辑分析仪抓取AXI总线信号。重点关注以下指标:

  • 读通道占用率:R通道上VALID与READY同时为高的周期数占总周期数的比例。
  • 地址通道瓶颈:AR通道是否长期处于高占用状态,若是,说明主控端无法及时发出足够多的读请求。
  • 数据通道气泡:R通道上VALID为低但READY为高的周期,表示从设备尚未准备好数据,此时outstanding数可能不足。
经验提示:在STM32H7上,若发现AR通道占用率超过70%而R通道占用率低于50%,通常意味着outstanding深度设置过小,主控端在等待数据返回时无法继续发送新地址。此时应增大outstanding能力或使用DMA的突发模式。

3.2 突发传输(Burst)与带宽计算

核心原理:突发长度与地址连续性的关系

AXI突发传输允许主控端在一次地址事务后连续传输多个数据节拍(Beat)。突发长度由ARLEN/AWLEN字段定义,实际节拍数为ARLEN+1。例如ARLEN=15表示16拍突发。突发大小(ARSIZE/AWSIZE)定义了每拍传输的字节数,在STM32H7上通常为4字节(32位)或8字节(64位)。一次突发传输的总字节数 = (ARLEN+1) × (ARSIZE+1)。

对于AI推理中的权重矩阵,其存储通常是连续地址。使用16拍、64位宽的突发传输,一次可读取16 × 8 = 128字节数据。相比单次读取8字节,突发传输将地址通道的占用率降低到原来的1/16,极大地释放了地址通道带宽。

操作流程:配置STM32H7的AXI突发访问

  1. 在CubeMX中确认目标外设(如DMA2D、MDMA)的AXI突发支持能力。
  2. 设置DMA控制器的突发长度(如INCR16)和数据宽度(如64位)。
  3. 确保源地址和目标地址按突发大小对齐(如64位访问需8字节对齐)。
  4. 对于LTDC显存访问,利用AXI的固定地址突发(FIXED)模式刷新行缓冲区。
// 示例:MDMA配置为16拍突发、64位宽度
MDMA_InitTypeDef mdma_init = {0};
mdma_init.Request = MDMA_REQUEST_DMA1_TC;
mdma_init.TransferTriggerMode = MDMA_BLOCK_TRANSFER;
mdma_init.SourceInc = MDMA_SRC_INC_WORD;      // 源地址递增
mdma_init.DestinationInc = MDMA_DEST_INC_WORD;
mdma_init.SourceDataSize = MDMA_SRC_DATASIZE_WORD;   // 32位
mdma_init.DestDataSize = MDMA_DEST_DATASIZE_WORD;
mdma_init.SourceBurst = MDMA_SOURCE_BURST_16BEATS;   // 16拍突发
mdma_init.DestBurst = MDMA_DEST_BURST_16BEATS;
mdma_init.BlockDataLength = 1024;  // 每次搬运1024字节

案例拆解:卷积层权重搬运的突发优化

假设一个3×3卷积层,权重大小为3×3×64×64 = 36,864字节。若使用单次读取(非突发),每次读取4字节,则需要9,216次读事务。每次事务的地址通道占用至少1个周期,数据通道占用1个周期,加上从设备响应延迟(假设10个周期),总耗时约为9,216 × 12 = 110,592个周期。若改用16拍、64位突发,每次突发读取128字节,仅需288次突发事务。每次突发地址通道占用1周期,数据通道占用16周期,加上响应延迟约10周期,总耗时约为288 × 27 = 7,776个周期。优化后带宽提升超过14倍。

关键结论:突发传输是AXI带宽优化的第一要素。在STM32H7上,应尽量使用INCR16突发(16拍)并配合64位数据宽度,使单次突发覆盖128字节连续地址。对于非连续地址(如稀疏矩阵),可考虑使用GATHER模式或软件重排数据。

3.3 Outstanding机制与带宽利用率

核心原理:隐藏访存延迟

Outstanding事务数是指主控端在未收到从设备响应前,可以发出的最大事务数量。例如,若outstanding=8,主控端可以连续发出8个读地址(AR通道),而不必等待第一个读数据返回。从设备按顺序或乱序返回数据,主控端通过ID字段识别数据归属。这一机制的核心价值在于:当从设备(如Flash或外部SDRAM)响应延迟较长时,主控端可以持续向总线注入新请求,使数据通道始终有数据流动。

在STM32H7中,Cortex-M7内核的AXI接口支持最多16个outstanding读事务。DMA控制器(如MDMA)也支持可配置的outstanding深度。对于AI推理场景,权重存储在外部Flash或SDRAM中,其访问延迟可达数十个周期。若outstanding=1,则每次读操作需等待完整延迟;若outstanding=16,则理论上可将有效带宽提升至接近峰值。

判断方法:计算最优Outstanding深度

最优outstanding深度取决于从设备延迟(L)与突发传输时间(T)的比值。假设从设备响应延迟为30个周期,一次16拍突发传输的数据传输时间为16个周期。则单个事务的总时间约为46个周期,其中有效数据传输仅16个周期,效率为34.8%。若outstanding=N,则总时间约为30 + N×16(假设流水线完全重叠),效率为N×16 / (30 + N×16)。当N=4时,效率为64/94=68%;当N=8时,效率为128/158=81%;当N=16时,效率为256/286=89.5%。可见,outstanding从1提升到8可带来显著收益,但继续增大收益递减。

Outstanding数总耗时(周期)有效数据传输(周期)带宽利用率
1461634.8%
4946468.1%
815812881.0%
1628625689.5%

实战场景:外部SDRAM上的AI推理缓冲区

在STM32H7上运行YOLO或MobileNet等模型时,若中间激活值缓冲区位于外部SDRAM,其访问延迟通常为20-40个周期。某实际项目中,初始配置使用MDMA且outstanding=2,推理帧率仅为12FPS。通过将MDMA的outstanding深度提升至8,并配合16拍突发,帧率提升至21FPS。进一步将缓冲区从SDRAM迁移至AXI SRAM(延迟约5个周期),帧率提升至28FPS。该案例表明,outstanding深度与存储介质延迟共同决定了最终带宽。

风险提示:过大的outstanding深度会增加总线仲裁压力,可能导致其他主控(如LTDC)的延迟增大,出现显示撕裂。在STM32H7中,建议为LTDC预留固定优先级,并限制DMA的outstanding不超过8。此外,乱序返回的数据需要足够的ID位宽来区分,STM32H7的AXI接口支持4位ID,最多16个不同ID。

3.4 常见误区与总结复盘

误区一:认为峰值带宽等于实际带宽

STM32H7的AXI总线理论峰值带宽为1.92GB/s,但实际应用中,由于从设备延迟、仲裁冲突、数据对齐问题,有效带宽通常只有峰值的40%-70%。在AI推理中,若未优化突发和outstanding,实际带宽可能低至200-300MB/s,成为严重瓶颈。

误区二:忽略地址对齐对突发的影响

AXI突发要求起始地址与突发大小对齐。例如,64位宽度的16拍突发要求地址按8字节对齐。若地址未对齐,总线控制器会自动拆分突发,导致效率下降。在STM32H7中,建议将权重和激活值缓冲区按32字节对齐(Cache Line大小),以充分利用突发传输。

误区三:所有外设都适合高Outstanding

对于LTDC这类实时性要求高的外设,过高的outstanding会导致其请求被DMA大量请求淹没,造成显示卡顿。应通过STM32H7的AXI QoS(服务质量)寄存器为不同主控设置优先级和带宽配额。

总结复盘

  • 通道分离是AXI并行性的基础,地址与数据通道独立使outstanding成为可能。
  • 突发传输将地址通道开销分摊到多个数据节拍,16拍+64位是最佳组合。
  • Outstanding深度应结合从设备延迟计算,通常8-16即可覆盖大多数场景。
  • 实测验证必须使用总线监视器或CubeMonitor确认实际带宽,避免理论计算偏差。
工程建议:在STM32H7的AI推理项目中,优先将频繁访问的数据放入DTCM或AXI SRAM(低延迟),外部存储使用MDMA配合16拍突发和outstanding=8。同时,利用DCache的Write-Back模式减少写事务数量。通过AXI总线监视器验证,确保有效带宽不低于峰值的70%。