我們以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時,從設備如何通過有限的亂序能力,在保證協議規范的前提下,顯著提升存儲訪問效率。