背景
為滿足實驗室橫向項目需求,在2024年12月中下旬導師提出基于FPGA的NVMe SSD控制器研發項目。項目核心目標為:通過PCIe 3.0 x4接口實現單盤3000MB/s的持續讀取速率。
實現過程
調研
花了半個月的時間查閱了一些使用FPGA實現NVME SSD控制器的論文、博客,確認了實現思路和路線,主要明確以下幾點:
1、架構角色轉換:區別于傳統FPGA作為Endpoint設備(如數據采集卡),本項目需將FPGA配置為Root Complex(RC),主動管理作為Endpoint(EP)的NVMe SSD設備
2、協議棧解析:建立NVMe協議與PCIe協議的層級關系認知,確認需基于Xilinx AXI PCIe IP核構建Root Port架構
3、PCIe配置空間:重點研究BAR寄存器組的地址映射機制,在實現過程中,FPGA需要對SSD的PCIE 配置空間進行配置。
4、學習NVMe協議隊列機制實現:參考《蛋蛋讀NVMe》技術博客,構建基于門鈴寄存器的SQ/CQ隊列管理系統。NVMe寄存器組:深入學習CAP(控制器能力)、CC(控制器配置)、CSTS(控制器狀態)等核心寄存器
硬件選擇
自己想了兩個方案,第一種是通過PCIE金手指轉M.2接口。類似于下圖這種(該圖來源于一篇碩士論文)
我當時買的那個轉接板不知道哪里有問題,PCIE鏈路建立不起來。
第二種方案是使用FMC轉M.2接口,此方案可以正常建立起PCIE鏈路連接。
FPGA邏輯設計
由于課題組并沒有相關的設計參考,所以不得不從零開始,在AXI PCIE IP官方給的example design的基礎上進行“魔改”。
1、學習AXI PCIE IP使用,知道IP核的接口是干嘛用的,主要是以下接口:S_AXI、S_AXI_CTRL、M_AXI。
2、學習IP核的配置,AXI BAR選項卡比較重要,涉及到AXI地址到PCIE地址的轉換。
3、配置SSD PCIE 配置空間的相關寄存器,比如BAR0、BAR1寄存器、Command寄存器等。設置IP核使能。
4、讀取SSD中和NVME協議寄存器,寄存器的偏移量是相對于PCIE BAR寄存器的地址偏移的。比較關鍵的是CAP寄存器。
5、進行NVME SSD的初始化,設置管理和完成隊列的深度、基地址等,并設置CC.EN=1,等待CSTS.RDY為1。
6、發送Admin命令,進行SSD的識別、配置I/O隊列數,以及對應的I/O完成隊列和提交隊列的ID、基地址、深度等。命令的實現方式和流程按照協議要求來就行了,基于狀態機進行設計。
7、發送I/O命令,進行數據讀寫,要確認好SSD一次傳輸的最大數據量是多少,以及一個扇區的大小。
總結
碎碎念:說真的,剛開始做的時候,我是沒有想到自己能做出來的,而且這個控制器方案也沒有太多可借鑒的開源的設計,該方案都是被拿來售賣的。沒想到自己能用兩個月的時間給初步實現出來。不過,目前這個方案還不夠完善,后續還需要進行優化調整,使其更加易用。比如,通過幾個簡單的控制信號,就能完成大批量的數據讀取,這方面我打算參考商業 IP 的接口設計思路。
后面有時間可以用一個專欄講解一下實現思路,但是應該不會免費開源,因為該項目完全可以作為一個高端項目供大家深入學習研究,我并不希望它因為過度傳播而失去其獨特性 ,變得過于泛濫(爛大街)。