3. Outstanding传输:Outstanding概念、Outstanding深度配置、Outstanding与乱序传输

3.1 什么是Outstanding?说白了就是“不等你”

各位做芯片设计的兄弟,咱们先聊个场景。

你给从设备发了一个读请求,然后呢?传统做法是——干等着。等从设备把数据返回来,你再发下一个。这就像你去食堂打饭,递一个盘子,等师傅打好菜,你再递第二个盘子。效率低得让人抓狂。

Outstanding传输,说白了就是“不等你”。

我一次性把多个请求扔出去,不用等每个请求的响应回来。从设备那边有个“待办清单”,它按顺序处理,处理完一个就返回一个结果。我这边呢,继续干我的活,不用傻等。

我个人习惯把Outstanding理解成“流水线上的预投料”。你想想看,如果每道工序都要等上一道做完才开始,那整条线就废了。Outstanding就是让总线保持“满负荷运转”的关键。

核心概念: Outstanding交易数 = 主设备已发出但尚未收到响应的请求总数。

这个数值越大,总线潜在的吞吐量就越高,但代价是控制逻辑更复杂,缓冲区也更大。

3.2 Outstanding深度配置:不是越大越好

很多新手一上来就问:“Outstanding深度是不是配得越大越好?”

嗯,这里要注意。我见过一个项目,工程师把Outstanding深度配到了32,结果性能反而下降了。为什么?因为从设备根本处理不过来,请求全堵在中间,反而造成了拥塞。

深度配置的核心原则:

  • 匹配从设备的处理能力:从设备能同时处理多少笔交易?这个值就是你的上限。
  • 考虑延迟:延迟越大,需要的Outstanding深度就越大,才能掩盖延迟。
  • 看你的带宽需求:带宽需求 = 数据宽度 × 频率。Outstanding深度至少要能填满这个带宽。

我曾经在一个DDR控制器项目中,把Outstanding深度从8调到16,性能提升了30%。但再往上调到32,性能只提升了2%,功耗却涨了15%。所以,深度不是越大越好,够用就行。

给大家一个经验公式:

Outstanding深度 ≈ (延迟周期数 × 带宽需求) / 数据宽度

举个例子:延迟是20个时钟周期,带宽需求是128bit/cycle,数据宽度是32bit。那么深度 ≈ (20 × 128) / 32 = 80。当然,这只是理论值,实际还要考虑从设备的处理能力。

场景 推荐深度 说明
低延迟、高带宽 4~8 比如片上SRAM,延迟小,深度不用太大
中等延迟 8~16 比如一般的DDR控制器
高延迟、低带宽 16~32 比如PCIe、外部设备
极高延迟 32~64+ 比如跨芯片通信、网络接口

避坑指南: 我曾经在一个项目中,把Outstanding深度配得很大,结果从设备返回的响应顺序乱了,导致数据错位。后来才发现,从设备不支持乱序返回,而我这边却按乱序去处理了。所以,深度配置一定要和从设备的乱序能力匹配。

3.3 Outstanding与乱序传输:一对好搭档

Outstanding和乱序传输,这两个概念经常一起出现。它们是什么关系?

简单说:Outstanding是“多发”,乱序是“乱回”。

你发了多个请求出去,从设备处理的时候,可能先处理了后面的请求,后处理了前面的请求。结果就是,返回的数据顺序和请求顺序不一样。这就是乱序传输。

为什么会这样?

你想想看,从设备内部可能有多个处理单元。比如一个DDR控制器,它有多个bank,每个bank可以独立工作。你发的请求可能落在不同的bank上,处理时间自然不一样。

乱序传输的好处:

  • 提高从设备的利用率
  • 减少等待时间
  • 提升整体吞吐量

乱序传输的代价:

  • 主设备需要支持乱序处理
  • 需要额外的缓冲区来重排序
  • 控制逻辑更复杂

我个人习惯在设计主设备时,默认支持乱序处理。因为现在的从设备,尤其是DDR和PCIe,几乎都支持乱序。你不支持,反而成了瓶颈。

小技巧: 如果你不确定从设备是否支持乱序,可以查一下它的AXI ID配置。如果从设备支持多个ID,那它大概率支持乱序。如果只支持一个ID,那它通常是按顺序返回的。

3.4 知识体系图:Outstanding与乱序的核心逻辑

下面这张图,我画了Outstanding和乱序传输的核心逻辑。你可以看到,主设备发出多个请求,从设备内部有多个处理单元,返回的顺序可能和请求顺序不同。

主设备 发出多个请求 Req1, Req2, Req3... 从设备 单元A 单元B 单元C 处理时间不同 Resp2 (先返回) Resp1 (后返回) Resp3 (最后返回) 主设备接收 需要重排序 重排序缓冲区 按ID/地址排序 图例 主设备 处理单元 乱序响应 重排序缓冲区

3.5 实战经验:如何配置Outstanding深度

说了这么多理论,咱们来点实际的。我在一个AI加速器项目中,需要配置AXI总线的Outstanding深度。当时的情况是这样的:

  • 主设备:AI计算核,带宽需求大
  • 从设备:DDR4控制器,支持乱序返回
  • 延迟:约50个时钟周期

我一开始配了16,发现性能不够。用仿真工具一测,发现总线利用率只有60%。后来调到32,利用率到了85%。再往上调,效果就不明显了。

我的配置步骤:

  1. 先估算理论值:用上面的公式算一下,大概需要多少深度。
  2. 仿真验证:用不同的深度值跑仿真,看总线利用率。
  3. 看实际场景:如果是连续传输,深度可以大一点;如果是离散传输,深度小一点反而好。
  4. 考虑资源:深度每增加一倍,缓冲区大小也翻倍。资源够不够?

我的习惯: 我会在RTL代码中把Outstanding深度做成可配置的参数。这样在验证阶段可以快速调整,找到最优值。等确定了,再固定下来。

3.6 总结一下

Outstanding传输,说白了就是让总线“忙起来”。深度配置要匹配从设备的处理能力,不是越大越好。乱序传输是Outstanding的好搭档,但需要主设备支持重排序。

嗯,这一章就到这里。记住一句话:Outstanding是手段,提升性能是目的,别为了Outstanding而Outstanding。

最后提醒: 我曾经见过一个团队,把Outstanding深度配得很大,结果从设备不支持乱序,导致数据错乱。所以,一定要确认从设备的能力,再配置深度。

可可精品资料库