【AXI】读重排序深度
我们以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的核心优势
- 并行处理能力:同时跟踪3个未完成请求,允许从设备在Bank0(高延迟)处理期间,并行完成Bank1、Bank2的低延迟请求(T0-T5期间同时处理3个请求)。
- 资源利用率提升:原本需等待Bank0完成(T7)才能处理后续请求,但通过队列缓冲,T4-T5已释放两个位置,提前处理了Req D和Req E。
- 吞吐量对比:
- 严格顺序(深度=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时,从设备如何通过有限的乱序能力,在保证协议规范的前提下,显著提升存储访问效率。