【AXI】读重排序深度

发布于:2025-07-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

我们以DDR4存储控制器为例,设计一个读重排序深度为3的具体场景,展示从设备如何利用3级队列优化访问效率:


基础设定

  • 从设备类型:DDR4存储控制器(支持4个存储体Bank0-Bank3)
  • 读重排序深度:3(允许同时跟踪3个未完成读请求)
  • 访问延迟特征
    • Bank激活后访问:3周期(低延迟)
    • Bank预充电后访问:7周期(高延迟)
  • 主机请求序列(按时间顺序发送):
    时间点 请求标识 ARID值 目标Bank 地址 描述
    T0 Req A 1 Bank0 0x1000 首次访问Bank0(需预充电)
    T1 Req B 2 Bank1 0x2000 Bank1已激活(低延迟)
    T2 Req C 3 Bank2 0x3000 Bank2已激活(低延迟)
    T3 Req D 1 Bank0 0x1004 连续地址(同ARID=1)
    T4 Req E 4 Bank3 0x4000 Bank3已激活(低延迟)

从设备处理逻辑(深度=3)

从设备内部有一个容量为3的请求队列,用于暂存未完成的读请求(pending addresses),允许对不同ARID的请求重排序,但严格保证同ARID的顺序。

阶段1:队列填充(T0-T2)
  • T0:接收Req A(ARID=1),队列为空 → 入队,开始处理Bank0预充电(耗时7周期)。
  • T1:接收Req B(ARID=2),队列剩余容量2 → 入队,立即处理Bank1(3周期完成)。
  • T2:接收Req C(ARID=3),队列剩余容量1 → 入队,立即处理Bank2(3周期完成)。

此时队列状态:[Req A(ARID=1), Req B(ARID=2), Req C(ARID=3)](已满)。

阶段2:队列释放与新请求(T3-T4)
  • T3:主机发送Req D(ARID=1),但队列已满(容量3),需等待至少一个请求出队才能入队。
  • T4:主机发送Req E(ARID=4),队列仍满,无法入队(需等待)。
阶段3:响应返回与队列更新(T4-T10)
  • T4(B完成):Bank1完成Req B → 返回数据B(RID=2),队列释放位置,Req D入队(ARID=1)。
  • T5(C完成):Bank2完成Req C → 返回数据C(RID=3),队列再释放位置,Req E入队(ARID=4)。
  • T7(A完成):Bank0完成Req A(预充电+访问耗时7周期)→ 返回数据A(RID=1),队列释放位置。
  • T8(D处理):Req D(ARID=1,目标Bank0)已激活(无需预充电)→ 3周期完成(T11返回数据D)。
  • T9(E处理):Bank3完成Req E(3周期)→ 返回数据E(RID=4)。

最终数据返回顺序

时间点 返回数据 原始请求 说明
T4 Data B Req B 最早完成的低延迟请求(ARID=2)
T5 Data C Req C 次早完成的低延迟请求(ARID=3)
T7 Data A Req A 高延迟请求(ARID=1,必须先返回)
T9 Data E Req E 新入队的低延迟请求(ARID=4)
T11 Data D Req D 同ARID=1的后续请求(必须在A之后)

深度=3的核心优势

  1. 并行处理能力:同时跟踪3个未完成请求,允许从设备在Bank0(高延迟)处理期间,并行完成Bank1、Bank2的低延迟请求(T0-T5期间同时处理3个请求)。
  2. 资源利用率提升:原本需等待Bank0完成(T7)才能处理后续请求,但通过队列缓冲,T4-T5已释放两个位置,提前处理了Req D和Req E。
  3. 吞吐量对比
    • 严格顺序(深度=1):需依次处理A→B→C→D→E,总耗时≈7(A)+3(B)+3(C)+3(D)+3(E)=19周期。
    • 深度=3:实际总耗时≈11周期(T0-T11),吞吐量提升约42%。

关键约束验证

  • 同ARID保序:Req D(ARID=1)必须在Req A(ARID=1)之后返回(T11在T7之后)。
  • 跨ARID乱序:B、C、E(不同ARID)的返回顺序与请求顺序(B→C→E)无关(实际返回顺序B→C→E)。
  • 深度限制:队列容量3,T3-T4时因队列已满,Req D和E需等待队列释放后才能入队。

此例直观展示了读重排序深度为3时,从设备如何通过有限的乱序能力,在保证协议规范的前提下,显著提升存储访问效率。


网站公告

今日签到

点亮在社区的每一天
去签到