隊(duì)列管理模塊是整個(gè)NVMe Host控制器的核心模塊,該模塊實(shí)現(xiàn)了提交隊(duì)列與完成隊(duì)列的管理,多隊(duì)列請(qǐng)求的仲裁判決等功能。隊(duì)列管理模塊中含有數(shù)據(jù)選擇單元、SQ、CQ、和仲裁器等模塊。其中Admin SQ與IO SQ的內(nèi)部結(jié)構(gòu)一致,包含狀態(tài)機(jī)、BRAM、Tail REG和Head REG。Admin CQ與IO CQ的內(nèi)部結(jié)構(gòu)一致,包含狀態(tài)機(jī)、Tail REG和Head REG。
隊(duì)列管理模塊框圖如圖1所示。
圖1 隊(duì)列管理模塊框圖
在NVMe協(xié)議中,使用隊(duì)列來傳輸、緩存和處理命令條目,以實(shí)現(xiàn)Host端和NVMe SSD端之間的通信。在CPU上運(yùn)行NVMe軟件協(xié)議棧,其Host端生成提交命令的速度遠(yuǎn)大于NVMe SSD的執(zhí)行速度,同時(shí)由于CPU的指令是順序執(zhí)行的,需要通過中斷來通知CPU去處理完成信息。因此,通過增加提交隊(duì)列和完成隊(duì)列的深度可以提高系統(tǒng)的傳輸性能。
設(shè)計(jì)中可以利用FPGA的并行處理能力來加速NVMe Host端的控制流程。相較于軟件協(xié)議棧,通過硬件電路生成提交命令的速度更快,并且能夠通過并行操作去實(shí)時(shí)檢查返回的完成信息,從而避免了采用中斷來通知CPU去處理完成信息而造成延遲較大的問題。本設(shè)計(jì)主要針對(duì)順序讀寫場景進(jìn)行了資源方面的優(yōu)化??紤]到在順序讀寫情況下,傳輸性能與隊(duì)列深度的大小無關(guān),且硬件邏輯生成NVMe命令的速度要遠(yuǎn)大于軟件協(xié)議棧生成NVMe命令的速度,因此通過增加提交隊(duì)列和完成隊(duì)列的深度來提高系統(tǒng)的傳輸性能的方法不再可行,本設(shè)計(jì)將提交隊(duì)列深度設(shè)置為NVMe SSD一次突發(fā)讀取的數(shù)據(jù)量大小,這樣在保證性能的前提下,可以盡可能的減少資源的消耗。此外,取消了完成隊(duì)列緩存的設(shè)計(jì),對(duì)完成信息的解析工作通過組合邏輯電路對(duì)其進(jìn)行實(shí)時(shí)檢測,而不用通過中斷來通知NVMe Host檢查,從而可以提高NVMe命令的執(zhí)行效率,并節(jié)省了大量的存儲(chǔ)資源。
提交隊(duì)列內(nèi)部由一個(gè)雙端口RAM、兩個(gè)寄存器和一個(gè)狀態(tài)機(jī)構(gòu)成。其中,提交隊(duì)列分為Admin提交隊(duì)列和I/O提交隊(duì)列,分別用于管理Admin命令和I/O命令。雖然這兩個(gè)隊(duì)列針對(duì)的命令條目不同,但其內(nèi)部結(jié)構(gòu)相同。因此,通過采用相同的設(shè)計(jì)來實(shí)現(xiàn)兩個(gè)隊(duì)列,以提高代碼的復(fù)用性和可維護(hù)性。雙端口RAM使用BRAM資源實(shí)現(xiàn),包括兩個(gè)128位寬、深度可配置的端口,用于實(shí)現(xiàn)NVMe命令的緩存。四個(gè)控制寄存器用于監(jiān)測隊(duì)列狀態(tài),包括Head指針和Tail指針。Head指針指向隊(duì)列中下一個(gè)被執(zhí)行的命令的位置,Tail指針指向隊(duì)列中下一個(gè)空位置,新產(chǎn)生的命令條目總是被寫入Tail所指向的位置。當(dāng)同一個(gè)隊(duì)列的Head指針等于Tail指針加1時(shí),表示隊(duì)列為滿;當(dāng)Head指針等于Tail指針時(shí),表示隊(duì)列為空。該模塊中的狀態(tài)機(jī)用來實(shí)現(xiàn)門鈴寄存器信息更新的流程控制工作。隊(duì)列管理狀態(tài)機(jī)的跳轉(zhuǎn)圖如圖2所示。
圖2 隊(duì)列管理狀態(tài)機(jī)的跳轉(zhuǎn)圖
各狀態(tài)說明如下:
IDLE:空閑狀態(tài),該狀態(tài)為模塊上電后的初始化狀態(tài),該狀態(tài)下檢測到s_axis_entry_valid信號(hào)有效時(shí),表示有提交命令傳輸至隊(duì)列管理模塊,狀態(tài)跳轉(zhuǎn)至RD_SQ_REG狀態(tài),否則維持當(dāng)前IDLE狀態(tài)。
RD_SQ_REG:讀提交隊(duì)列寄存器狀態(tài),該狀態(tài)下讀取提交隊(duì)列中的cmd_cnt寄存器,cmd_cnt寄存器負(fù)責(zé)記錄隊(duì)列中緩存的命令數(shù),即SQ Head指針與SQ Tail指針之差,當(dāng)cmd_cnt寄存器的值大于10時(shí)向仲裁器發(fā)起更新門鈴寄存器請(qǐng)求,這里設(shè)置為10主要是考慮到減少NVMe Host控制器和NVMe SSD之間的數(shù)據(jù)交互次數(shù),讓其通過突發(fā)傳輸一次讀取多條命令,來達(dá)到提升系統(tǒng)性能的效果,同時(shí),為了解決長時(shí)間沒有接收到新的提交命令使得小于10條命令無法發(fā)送的情況,添加了超時(shí)機(jī)制,當(dāng)計(jì)時(shí)計(jì)數(shù)器達(dá)到一定值時(shí),不再等待cmd_cnt滿足條件,直接跳轉(zhuǎn)至SC_REQ狀態(tài),否則維持當(dāng)前狀態(tài)。
SC_REQ:仲裁請(qǐng)求狀態(tài),該狀態(tài)下將sq_req信號(hào)置為高電平來向仲裁器發(fā)起仲裁請(qǐng)求,若接收到仲裁授權(quán),狀態(tài)跳轉(zhuǎn)至SEND狀態(tài),否則維持當(dāng)前狀態(tài)。
SEND:發(fā)送狀態(tài),該狀態(tài)下向接口轉(zhuǎn)換模塊發(fā)送當(dāng)前的隊(duì)列信息,接口轉(zhuǎn)換模塊將內(nèi)部信號(hào)轉(zhuǎn)換為AXI4接口信號(hào),通過訪問PCIe的BAR空間來實(shí)現(xiàn)對(duì)NVMe SSD門鈴寄存器的更新,等待返回應(yīng)答信號(hào),狀態(tài)跳轉(zhuǎn)至IDLE狀態(tài)。
相關(guān)視頻感興趣的,請(qǐng)移步B站,搜用戶名 專注與守望 或 內(nèi)容 NVMe IP
審核編輯 黃宇
-
FPGA
+關(guān)注
關(guān)注
1643文章
21925瀏覽量
612627 -
控制器
+關(guān)注
關(guān)注
114文章
16876瀏覽量
182449
發(fā)布評(píng)論請(qǐng)先 登錄
NVMe控制器IP設(shè)計(jì)系列之接口轉(zhuǎn)換模塊

NVMe控制器IP設(shè)計(jì)之接口轉(zhuǎn)換
NVMe控制器之完成信息解析模塊
NVME控制器之指令控制模塊設(shè)計(jì)
NVME控制器設(shè)計(jì)之指令控制

NVMe控制器設(shè)計(jì)1

NVME控制器設(shè)計(jì)1
一文詳解 ALINX NVMe IP 特性

LM5177降壓/升壓控制器評(píng)估模塊

評(píng)論