王周,祝紅彬,朱 喜,高昌壘
(深圳市國微電子有限公司,廣東深圳 518000)
多設備之間的互聯與信息交互通常使用交換機[1-3]來進行處理。三代PCIe 交換機[4]單端口帶寬在其16 條lane 時可達100 GT/s 以上[5-6],所以需要較大緩存空間進行數據存儲轉發[7]。緩存的快速消耗造成擁塞[8]通常是端口之間速率/帶寬的不同造成[9]。現有交換機通常為各端口分配固定緩存,確保一定轉發帶寬,同時設置共享緩存空間,當某端口緩存不足時使用,但端口不使能時,預先分配的固定緩存就造成了浪費。
針對此,提出一種基于鏈表管理的PCIe 交換機動態緩存技術,能夠實時監測PCIe 交換機有效端口的使能情況,動態地將未使能端口緩存空間鏈接到活躍端口,并通過空閑鏈表RAM 和鏈表節點來管理新組鏈的緩存區,緩存利用率可達100%。同時取消了傳統共享緩存空間,在滿足交換機功能和性能的同時有效節省芯片面積。
該研究中PCIe 交換機共設有12 條x4 lane 的PHY,分為3 組,每組稱為一個Station。每個Station有4 個x4 lane 的PHY,共16 個物理lane[10],可用來設置邏輯端口,即每個Station 最多可設置4 個邏輯端口,邏輯端口lane 數可配置范圍為x16/x8/x4[11-12]。
Station 內第一個端口Port0 固定連接x16-controller,第二個端口Port1 連接x8-controller,第三個端口Port2 和第四個端口Port3 均連接x4-controller。端口lane 配置組合如表1 所示。

表1 交換機的端口配置
輸入輸出側緩存模塊均設置有緩存RAM,完成報文Header 和Data 的寫入和讀出。緩存結構如圖1所示。

圖1 緩存結構
考慮到線速要求和Station 內的調度策略,存儲策略緩存采用半共享的方式,以128 bit 為單位[13]存儲數據和包頭(Header)。緩存空間根據端口lane 配置來分配4 個group 內的空閑地址,原則上不能出現讀寫沖突,并保證緩存的利用率。
group 內的緩存編址范圍為0~511,每個地址對應8 個128 bit 的存儲單元,稱為slice,即每個地址對應4 個物理block。報文存儲過程中,每個地址的8個slice 可以存儲不同報文的128 bit 數據或者Header,以充分利用緩存,同一個地址的4 個物理block 只能存儲一個隊列的報文。
PCIe 根據數據包類型Type 將報文分為三類:P、NP、CPL。不同類型的報文之間存在調度與仲裁,所以緩存管理時需要按報文類型,將同一類報文存儲在相同的緩存池內。該設計中輸入側緩存與輸出側緩存鏈表管理共享同一個模塊,但隊列數量不同。
輸入側:
單播隊列:{端口、目的端口、P/NP/CPL}
多播隊列:{端口、P}
輸出側:
單播隊列:{端口、P/NP/CPL}
多播隊列:無
輸入側隊列鏈表管理:隊列鏈表根據報文類型和入端口、輸出端口入隊;空閑鏈表管理給出空閑地址,空閑鏈表收到報文輸入有效標識即給出空閑地址,報文寫入之后,根據報文路由結果將空閑地址添加到對應的隊列鏈表的tail即可。
輸出側隊列鏈表管理:空閑鏈表向輸出buff 和報文描述符(PD)緩存提供寫入地址,根據輸入側給出的源端口和目的端口信息,將空閑地址添加到對應的輸出側隊列鏈表tail。管理輸出側隊列,接收來自輸出側排序和調度的結果,給出出隊隊列的首地址,輸出buff 將首地址作為讀地址讀出報文數據,轉發給出片處理模塊。
鏈表管理模塊(QM)設置為通用的鏈表管理,并進行參數化設置,由空閑鏈表RAM 和鏈表節點RAM組成,鏈表節點RAM 放在QM 模塊外,空閑鏈表管理模塊放在鏈表管理模塊內部。但是本質上鏈表節點RAM 也屬于鏈表管理的一部分,如圖2 空閑鏈表RAM 存儲空閑地址,空閑鏈表管理模塊管理空閑地址的分配和回收;鏈表節點RAM 存儲隊列的節點,存儲虛擬輸出隊列(VOQ)中各個隊列的節點地址。鏈表管理模塊為輸入側和輸出側共用模塊,參數化傳參。

圖2 鏈表管理的RAM
空閑地址管理分為兩組,以應對VOQ 隊列釋放2 個地址的場景。報文輸入申請地址時,將FIFO的第一個數據彈出,輪流取兩個FIFO 的空閑地址;當報文出隊后地址釋放時,空閑地址輪流寫入2 個空閑地址FIFO;當VOQ 隊尾報文出隊,需要釋放2 個地址時,將2 個地址分別寫入2 個FIFO。空閑地址FIFO 共15 個,均為預取FIFO(pre-fetch)。鏈表節點RAM 中實際存儲的地址是PD 存儲的地址,與數據存儲(DM)中數據的存儲首單元地址對應,經過映射后得到DM 存儲地址。PD 在進行報文調度的時候,每個隊列會有4 個首PD 直接寫入排序與分類模塊,隊列選中之后,向隊列鏈表管理模塊讀取下一跳PD;隊列為空時,PD 直接寫入分類模塊。
交換機初始化后讀取端口配置信息,當存在非活躍端口時,鏈表管理模塊會將非活躍端口的RAM納入活躍端口的RAM 列表,動態的擴展活躍端口的緩存池,使其能夠有較大的緩存空間用于流控交互和數據包緩存轉發。
在各種lane 通道數配置組合里,Station 內與4 個端口對應的緩存group 根據端口和lane 配置實際組合分配地址,group 內緩存地址分配如表2 所示。

表2 group內緩存地址分配
對該設 計基于SV(System Verilog)的UVM 驗證方法學搭建Module 級和System 級驗證平臺;使用SVA 進行形式驗證或協議檢查;使用covergroup進行功能覆蓋率收集。EDA 整體驗證流程如圖3所示。

圖3 驗證流程
驗證的lane 覆蓋率、FSM 覆蓋率、條件覆蓋率均可達100%。在質量活動階段進行功能點分解和TestCase 的反標,做各種專項檢查。后仿驗證階段對PR 后的設計網標進行時序反標后的功能和時序驗證。不同的工藝角最佳、最差時序下均驗證通過,功能與性能滿足需求。
同時在對該設計進行EDA 測試過程中FPGA 原型驗證會同步開展,對功能設計做進一步驗證。
在插入DFT 掃描鏈和MBIST 之后,根據后端提供的def 文件進行DCG 綜合,分析優化時序,使時序收斂。后端也可以通過插buff 的方式優化時序,或者更換低閾值Cell 等方式進一步使時序收斂。對模塊進行時序分析、一致性檢查以及COT 等檢查,均能滿足項目要求。
該文研究的基于鏈表管理的PCIe 交換機動態緩存技術采用SMIC 40 nm 工藝,使用SYNOPSYS 仿真工具進行仿真驗證。
配置交換機3 個Station 的端口,Station0 內僅端口0 有效為x16 端口,Station1 內為3 個端口有效分別為x8、x4、x4,Station2 內為4 個端口全部有效為全x4的端口。
Station1 內端口緩存資源地址管理以及x8 端口的動態鏈接仿真波形如圖4 和圖5 所示,x8 端口ram_wr_addr[127:0]動態鏈接在一起,用于數據緩存。兩個x4 端口之間緩存地址管理相互獨立。

圖4 Station1_x8x4x4模式下x8仿真波形

圖5 Station1_x8x4x4模式下x4x4仿真波形
Station0 內端口緩存資源地址管理以及端口的動態鏈接仿真波形如圖6 所示,此時僅一個端口有效,所以ram_wr_addr[255:0]全部動態鏈接在一起,由該端口獨享用于數據緩存。

圖6 Station0_x16模式下的仿真波形
Station2 內端口緩存資源地址管理仿真波形如圖7 所示,此時Station 內4 個端口全部有效,各個端口之間ram_wr_addr 相互獨立,分別管理各自的數據緩存。

圖7 Station2_full_x4模式下的仿真波形
表3 為提出的基于鏈表管理的PCIe 交換機動態緩存技術與相關文獻在交換機的緩存分配方案、不同模式下的緩存利用率對比。相較于其他文獻端口固定+共享緩存的分配方式,在固定緩存上造成了緩存空間浪費。該設計方案將固定緩存設計為動態緩存,緩存利用率可達100%,同時緩存空間的面積資源消耗相當于只消耗了固定緩存的空間,使芯片面積有所減小。

表3 該文與其他文獻的緩存處理方式
該文提出一種基于鏈表管理的PCIe 交換機動態緩存技術并進行實現,能夠根據交換端口的實際有效情況,通過鏈表管理動態的將非活躍端口的緩存鏈接到活躍端口,解決了傳統方案固定分配緩存的資源浪費問題。模塊設計經過EDA 測試、FPGA測試和綜合、布局布線并流片后成功通過測試,在各種復雜的交換機配置環境下均能滿足功能、性能及時序的要求。該技術交換機內部的緩存資源利用率可達100%,在滿足芯片各項指標要求的同時能有效減小芯片面積,降低成本。