
1. 从一次性能瓶颈排查说起为什么需要关注Outstanding Transfer最近在调试一个基于AXI总线的视频处理系统时遇到了一个让人头疼的问题。系统在连续处理高分辨率图像帧时理论带宽明明足够但实测的吞吐率却远低于预期帧率上不去还时不时出现数据断流。用逻辑分析仪抓取总线波形发现主设备Master发出读请求后总线上有很大一段“空白期”从设备Slave的响应返回得“不紧不慢”总线利用率低得可怜。这显然不是从设备本身慢因为它的单次访问延迟是固定的。问题的症结在于主设备在发出一个请求后就“傻等”在那里直到收到对应响应才发出下一个请求。这种“一问一答”的串行模式在需要连续、大数据量传输的场景下成为了绝对的性能瓶颈。这个问题的本质就是总线传输机制中“Outstanding”能力的缺失。Outstanding Transfer中文常译为“未完成传输”或“超前传输”是衡量一个AXI主设备性能的关键指标。它描述的是主设备在未收到前一个事务的响应时能够继续发起新事务的能力。简单来说就是主设备可以“不等回音连续发令”。这个能力对于挖掘系统并发潜力、提升总线利用率和整体吞吐率至关重要。无论是做FPGA逻辑设计、ASIC前端验证还是嵌入式驱动开发只要涉及到高性能数据传输比如DMA、视频编解码、网络包处理理解并善用Outstanding机制都是绕不开的一课。2. AXI协议基础回顾通道、握手与事务要彻底搞懂Outstanding我们必须先回到AXI协议本身。AXIAdvanced eXtensible Interface是ARM推出的高性能片上总线协议其核心思想是通过分离的通道和握手机制来实现高带宽和低延迟。2.1 五通道分离架构AXI将一次完整的数据传输事务Transaction分解到五个独立的通道上写地址通道AW主设备发送写操作的地址和控制信息。写数据通道W主设备发送要写入的数据。写响应通道B从设备返回本次写操作的状态成功、错误等。读地址通道AR主设备发送读操作的地址和控制信息。读数据通道R从设备返回读取到的数据及本次读操作的状态。这五个通道彼此独立拥有自己的VALID/READY握手信号对。这种分离带来了巨大的灵活性读和写操作可以同时进行地址和数据可以分开传输尤其利于突发传输更重要的是它为“流水线”和“超前”操作奠定了基础。2.2 握手机制与事务ID每个通道的传输都基于简单的VALID/READY握手。源端如主设备发地址在数据有效时拉高VALID目的端如从设备或互联在可以接收时拉高READY当同一时钟周期内两者都有效时完成一次传输。AXI协议允许一个主设备同时发起多个事务。为了区分这些并发事务的响应归属AXI引入了事务ID。读事务IDARID和写事务IDAWID由主设备在发起事务时指定从设备必须在其响应RID/BID中带回相同的ID。这样即使响应乱序返回主设备也能正确地将响应与之前发起的事务对应起来。事务ID是实现Outstanding传输和乱序返回的基石。2.3 突发传输BurstAXI支持突发传输主设备通过一次地址握手可以传输一“批”连续地址的数据。突发长度Burst Length、大小Burst Size和类型Burst Type都在地址通道中指定。这减少了地址握手的开销是提升效率的重要手段。但请注意即使使用突发传输如果主设备没有Outstanding能力它仍然需要等待整个突发事务的所有响应完成后才能发起下一个事务。3. Outstanding Transfer 深度解析机制、类型与实现现在我们进入核心。Outstanding Transfer指的是主设备在某个通道上已经发出但尚未收到对应响应的“在途”事务的数量。3.1 工作机制与性能模型我们可以把AXI总线想象成一条快递流水线。主设备是发货方从设备是收货/处理方互联Interconnect是物流网络。无OutstandingOutstanding0发货方发出一个包裹事务后必须等到签收确认响应回来才能发下一个包裹。物流车的空载率会很高。有OutstandingOutstandingN发货方可以连续发出N个包裹然后再等待确认。物流车始终满载整体送货效率大幅提升。从数学上看一次事务的完成时间T_total T_latency T_transfer。其中T_latency是从发出地址到收到第一个数据/响应的固定延迟包括路径延迟、从设备准备时间等T_transfer是实际传输数据的时间。如果没有Outstanding系统的有效带宽会被T_latency严重稀释。当Outstanding能力为N时理论上可以将N个事务的T_latency重叠起来理想情况下使总线利用率接近100%。3.2 Outstanding 的类型Outstanding能力通常从两个维度来考量按通道区分读 Outstanding主设备在未收到前一个读事务的所有数据响应时能继续发起的读地址事务的最大数量。这直接决定了读操作的流水线深度。写 Outstanding主设备在未收到前一个写事务的响应B通道时能继续发起的写地址事务的最大数量。注意写数据W通道通常需要跟随或稍晚于写地址但多个写事务的数据可以交织Interleave这需要主设备和互联都支持写交织Write Interleaving。按目标区分全局 Outstanding主设备对所有从设备接口总共能支持的未完成事务数。这是主设备自身的硬件队列深度。Per-ID Outstanding针对每个唯一的事务IDAWID/ARID主设备能支持的未完成事务数。这通常由协议规定如AXI4要求每个ID的读/写响应必须按顺序返回但不同ID之间可以乱序并且受到互联结构的影响。3.3 在IP核与系统中的实现在实际的IP核如Xilinx的AXI DMA、AXI CDMA或用户自定义的AXI Master中Outstanding能力是一个关键配置参数。在Xilinx Vivado的AXI配置界面你经常会看到诸如Number of Read/Write Outstanding Transactions的选项。这个值直接决定了IP内部用于缓存未完成事务地址/控制信息的FIFO深度。例如将读Outstanding设置为8意味着DMA控制器可以连续向内存发出8个读请求而不必等待第一个读的数据返回。在代码中如Verilog/VHDL实现Outstanding的核心是维护一个事务状态表或队列。这个队列需要记录每个已发出但未完成事务的ID、地址、长度等信息。当主设备想发起新事务时需要检查队列是否已满即是否达到Outstanding上限。当从设备返回响应时根据响应中的ID从队列中查找并清除对应条目。注意盲目增大IP核的Outstanding数值并不总是好事。首先这会消耗更多的FPGA内部存储资源BRAM或寄存器。其次如果下游的从设备或互联无法处理如此多的并发请求例如目标DDR控制器的读写命令队列深度有限多出来的请求只会被阻塞在互联中无法进一步提升性能反而可能因为复杂的仲裁和背压增加时序收敛的难度。一个经验法则是将主设备的Outstanding能力设置为与目标存储设备如DDR控制器的命令队列深度相匹配通常能取得较好的效果。4. Outstanding 与乱序返回Out-of-OrderOutstanding 常常与另一个概念乱序返回Out-of-Order Completion相伴出现但它们不是一回事却紧密协作。Outstanding是因是主设备发起并发请求的能力。乱序返回是果是从设备或互联处理这些并发请求后响应可以不按请求顺序返回的现象。为什么需要乱序返回考虑一个主设备先后请求读取地址A访问慢速外设和地址B访问高速SRAM。如果没有乱序返回即使B的数据早就准备好了也必须等A的数据返回后才能返回B这会造成不必要的等待。AXI协议通过事务ID来支持乱序返回对于同一个ID的事务响应必须按顺序返回读数据R通道必须按地址顺序写响应B通道必须按地址顺序。这保证了事务内的顺序性。对于不同ID的事务响应可以以任意顺序返回。这极大地提升了系统的整体效率。因此一个高性能的AXI系统往往是这样的主设备利用其Outstanding能力同时发起多个不同ID的事务互联和从设备并行处理这些请求处理完的请求以其ID为标签乱序地返回给主设备主设备根据ID将响应归位。这构成了一个高效的并行处理流水线。5. 实战在仿真与系统中观察与优化Outstanding理论说得再多不如动手看看波形调调参数。5.1 在仿真中识别Outstanding行为使用仿真工具如VCS、QuestaSim或Vivado自带的仿真器抓取AXI总线信号是理解Outstanding最直观的方式。一个无Outstanding读操作的波形特征主设备拉高ARVALID发出ARADDR和ARID。从设备/互联拉高ARREADY完成地址握手。然后ARVALID和ARREADY进入长时间的“沉默”期。直到从设备拉高RVALID返回第一个数据RDATA和RID并且最后一个数据包的RLAST拉高完成整个读事务。此后主设备才可能再次拉高ARVALID发起下一个读请求。两个读事务的地址握手之间有明显的时间间隔。一个有Outstanding例如N2读操作的波形特征主设备连续拉高ARVALID两次快速完成两个读地址的握手ARID可能相同也可能不同。两个地址请求在波形上紧密相连甚至可能完全连续。从设备返回的RVALID/RDATA/RID数据包其顺序可能与地址请求顺序不同如果ID不同且支持乱序。在第一个读事务的数据还未返回完毕时第二个读事务的数据可能已经开始返回。在波形上你会看到地址通道和数据通道上都有持续不断的活动总线“很忙”。5.2 系统级优化策略在设计或集成系统时如何设置和优化Outstanding** profiling 与瓶颈分析**首先确定性能瓶颈是否在总线访问延迟上。使用芯片内的性能监测单元如ARM CoreSight, Xilinx AXI Performance Monitor IP或仿真统计查看总线利用率、平均延迟、事务排队长度等指标。如果地址通道空闲率很高而数据吞吐不足提高读Outstanding可能有效。如果写响应B通道经常阻塞则需检查写Outstanding和从设备的写响应延迟。匹配上下游深度这是最关键的原则。主设备的Outstanding能力其内部队列深度应该与直接下游的接收能力匹配。如果主设备直接连接一个从设备如BRAM控制器那么主设备的Outstanding值不应超过该从设备能同时接收的命令数。如果中间经过互联Interconnect则需要考虑互联的缓冲能力。互联本身也可能有每个端口的Outstanding限制。最终的目标存储设备如DDR SDRAM控制器有其行缓冲Row Buffer和命令队列深度。这是整个存储访问路径的最终瓶颈。通常将发起DDR访问的主设备如DMA的Outstanding设置为DDR控制器命令队列深度的1到2倍是一个合理的起点。事务ID策略的运用合理使用多个事务ID可以更好地利用乱序返回提升效率。例如一个视频处理DMA可以将Y分量和UV分量的读取分配不同的ARID。这样当Y数据被DDR控制器优先准备好时可以先返回而不必等待UV数据使得后续处理单元可以更早地开始工作。避免过度配置将Outstanding设置得过大比如远超过DDR控制器的命令队列深度除了浪费资源还可能带来负面效果。过多的未完成请求会在互联中积压增加仲裁延迟在最坏情况下可能导致死锁或活锁。此外在验证阶段过深的队列可能掩盖一些时序边界问题。5.3 一个具体的调试案例AXI DMA 数据吞吐不达标回到开头我遇到的那个视频系统问题。主设备是Xilinx的AXI DMA从设备是DDR内存。初始状态DMA配置为Scatter-Gather模式读通道Outstanding2。实测带宽只有理论值的30%。波形分析发现AR通道上两个请求之间间隔了数十个周期。R通道数据返回缓慢。排查过程检查DDR控制器配置和校准正常。检查AXI互联的时钟和复位正常。使用Vivado的AXI Protocol Checker IP未报告协议错误。仔细查看DMA的配置寄存器发现其C_INCLUDE_MM2S_DRE读数据实时对齐功能被启用而C_M_AXI_MM2S_DATA_WIDTH为64位但我的数据流并不需要字节对齐。怀疑此功能引入了额外延迟。查阅文档并尝试性修改将DMA读通道的Outstanding增加到8并禁用了C_INCLUDE_MM2S_DRE功能。优化结果重新编译下载后AR通道上的请求变得密集总线利用率显著提升实测带宽达到理论值的85%以上。这个案例说明Outstanding的优化需要结合具体IP的特性和数据流特点有时需要调整相关辅助功能的配置。6. 不同场景下的Outstanding设计考量Outstanding并非一个放之四海而皆准的固定值需要根据应用场景灵活设计。高吞吐流式数据处理视频流、网络包这是Outstanding最能大显身手的场景。数据量大且连续访问模式通常可预测顺序或固定步长。应将Outstanding值设置得较高如8、16甚至32并配合使用最大突发长度Burst Length以充分压榨总线带宽。事务ID策略可以简单通常顺序访问使用同一ID即可。低延迟随机访问CPU指令/数据缓存、寄存器配置此类访问延迟敏感但并发度可能不高。过高的Outstanding意义不大反而可能因为队列仲裁增加最坏情况延迟。通常Outstanding设置为2-4即可满足需求。重点在于优化访问路径和减少固定延迟。多主设备竞争场景当多个具有高Outstanding能力的主设备如多个DMA、多个CPU核通过互联访问同一从设备如共享DDR时需要格外小心。每个主设备过高的Outstanding会导致在互联和从设备端产生大量的未完成请求加剧仲裁冲突可能导致所有主设备的性能都下降。此时需要进行系统级的带宽和延迟预算可能需要对不同主设备设置不同的QoS服务质量优先级或限制其Outstanding能力。安全与可靠性关键系统在一些功能安全或高可靠系统中设计的确定性和可分析性比峰值性能更重要。过深的Outstanding队列和复杂的乱序返回会增加系统状态的不确定性使最坏执行时间WCET分析变得困难。在这类系统中可能会刻意限制甚至禁用Outstanding和乱序返回采用更简单、更确定的顺序访问模式。7. 验证与测试如何确保Outstanding机制正确工作设计好了Outstanding参数如何验证它是否按预期工作且没有引入错误协议一致性检查使用VIPVerification IP如Synopsys的AXI VIP或开源检查器如Vivado AXI Protocol Checker。这些工具能自动检测包括Outstanding相关在内的协议违规例如超出声明的Outstanding限制主设备发出的未完成事务数超过了其配置或接口信号如AXI4的AWUSER/ARUSER中可能包含的QoS字段所声明的能力。ID使用错误对于同一ID响应顺序错误或者响应中包含了从未发出过的ID。握手信号违规在复位后VALID在READY之前断言等基本错误。压力测试构造极端测试场景。满负荷测试让主设备以最大Outstanding能力持续发起请求观察系统是否稳定响应是否都能正确返回有无数据丢失或错误。背压测试故意让从设备或互联的READY信号长时间无效模拟下游阻塞。观察主设备是否能够正确处理背压是否会丢失已发出的请求在READY恢复后是否能继续正确传输。乱序深度测试对于支持多ID乱序的系统测试其乱序返回的深度极限。例如发起ID为0~7的共8个事务然后让从设备以完全相反的顺序7~0返回响应检查主设备能否正确重组数据。性能统计与覆盖率收集在仿真或真实硬件上收集性能计数器数据如不同Outstanding水平下的实际带宽、平均延迟、队列占用率等。同时收集功能覆盖率模型确保各种Outstanding数量、ID组合、乱序场景都被测试到。我个人的经验是在项目初期就集成一个轻量级的AXI监控模块到设计中非常有用。这个模块可以实时统计事务计数、延迟分布和带宽在硬件调试阶段能快速定位性能热点和瓶颈比单纯依赖仿真要直观和高效得多。理解AXI的Outstanding Transfer不仅仅是记住一个概念或参数更是掌握了一种优化系统数据流的思想。它要求我们从全局的、并发的视角去看待总线上的数据流动理解主设备、互联、从设备这一整条链路上的协同工作方式。当你下次再遇到总线性能问题时不妨先从波形上看一看地址通道是不是在“偷懒”也许调整一下那个叫做“Outstanding”的旋钮就是打开性能之门的钥匙。在实际项目中我习惯于将Outstanding作为一个关键的可调参数在资源、时序和性能之间寻找那个最佳的平衡点而不是一味地追求最大值。