????????NVMe協(xié)議是工作在PCIE的最上層協(xié)議層的,故需要先搞清楚PCIE。本文基于Xilinx的UltraScale+,開發(fā)工具為Vivado2021.2。學(xué)習中以spec為主,其它資料輔助參考(重點介紹學(xué)習方法及資料,有時間再加細節(jié))。請勿轉(zhuǎn)載!
1 PCIe學(xué)習與實踐
1.1 理論
? ? ?主要參考的文章是《老男孩讀PCIe》,同時參考《古貓先生》,重點學(xué)習TLP報文部分,數(shù)據(jù)鏈路層和物理層的內(nèi)容可以先不看。再買一本書《PCI Express 體系結(jié)構(gòu)導(dǎo)讀-王齊》用來查閱做筆記。
? ??
老男孩讀PCIe介紹系列_Ha-Ha-Interesting的博客-CSDN博客_老男孩讀pcie
PCIe最全科普貼流出!不說了,趕快Mark!_古貓先生的博客-CSDN博客
還有2本MindShare的英文書籍參考,備用即可。
?https://www.mindshare.com/files/ebooks/PCI%20Express%20System%20Architecture.pdf
https://www.mindshare.com/files/ebooks/PCI%20Express%20Technology%203.0.pdf
在NVMe工程中用到的TLP類型為mem讀寫、config、中斷:
- config TLP用戶不用特別關(guān)心,在Xilinx IP GUI配置,由IP維護。它用于上電時host訪問EP設(shè)備的reg,協(xié)商配置;
- 中斷TLP用戶也不直接使用,用戶僅通過IO脈沖控制IP發(fā)出完整中斷TLP,再檢查IP給出的完成狀態(tài)IO即可;?
- mem TLP是需要用戶真正掌握的,但是IP的AXI\stream口出來的TLP格式可能不是標準的TLP,它是對TLP做了進一步處理的。
1.2 工程
? ? ? ? 在Xilinx的Vivado中關(guān)于PCIe的IP有3個:PCIE4,XDMA,QDMA。后兩個IP都基于前一個,使用難度遞增、速率遞增、資源占用也遞增。
? ? ?下列文章中詳細介紹了7系列PCIE(此IP使用標準TLP格式,不同于UP系列PCIE4)、XDMA IP的基礎(chǔ)配置、官方Demo的生成、仿真分析。Demo中用Verilog代碼設(shè)計了一個RootPort來和EP通信,模擬了上電后Bar掃描、分配地址、速率寬度等協(xié)商配置。Demo中的EP代碼可以用于實際的設(shè)計中。在7系Demo與UP demo中PCIE HEAD擴展reg的偏移地址有個別不同,以實際PG為準。
開發(fā)板可以用黑金、米聯(lián)客的板子。
PCIe基礎(chǔ)知識及Xilinx相關(guān)IP核介紹_lu-ming.xyz的博客-CSDN博客_pcie ip核 xilinx
2 NVMe理論學(xué)習
2.1 理論
2.1.1 學(xué)習內(nèi)容
- ? ? NVMe的學(xué)習主要以Spec為主,官方下載鏈接如下,我使用的是spec1.2版本,此本版應(yīng)該是蛋蛋讀NVMe系列文章所用,圖表序號能對應(yīng)上。選用的功能可以先不看,并在NVMe配置reg、Controller Data Structure(4KB)中配置為關(guān)閉。
NVMe Base Specification – NVM Expresshttps://nvmexpress.org/developers/nvme-specification/
- 同時參考以下ssdfans blog,一共6篇,第5篇講數(shù)據(jù)保護(可以選擇不用),第6篇講NameSpace(可以只用一個NS,NSID=1)
蛋蛋讀NVMe之一(cmd processing)
蛋蛋讀NVMe之二?(SQ,CQ和DB)
蛋蛋讀NVMe之三?(PRP)
蛋蛋讀NVMe之四(Trace)
蛋蛋讀NVMe之五(Protection Information)
蛋蛋讀NVMe之六(Namespace)
以下的系列4篇文章也可以參考對比:
NVMe 協(xié)議詳解(一)_IFappy的博客-CSDN博客_nvme協(xié)議
NVMe詳解(四)_IFappy的博客-CSDN博客_nvme smart-log 詳解
下面文章對spec1.3做了部分翻譯,有個別內(nèi)容不準確,可以參考
【NVMe】NVMe 1.3協(xié)議中文翻譯——第一章簡介_ljyyyyyyyyy的博客-CSDN博客_nvme1.3協(xié)議
2.1.2 抓包工具trace
下面的文章實際抓取了NVMe報文,并做了分析,有助于理解NVMe工作的完整流程。PCIE協(xié)議可以使用分析儀抓取報文,分析儀串在鏈路中,抓取上行、下行報文。目前看到的文章中主要有2家:力科、Saniffer。
從PCIe trace中分析NVMe_Ingram14的博客-CSDN博客_pcie trace
【71】力科PCIe 協(xié)議分析儀常見操作_linjiasen的博客-CSDN博客_pcie協(xié)議分析儀
Saniffer公司的分析儀及軟件,可以聯(lián)系他們獲取軟件及SSD啟動抓取的完整報文、分析儀的使用培訓(xùn)教程等等。
PCIe和NVMe SSD初始化過程簡介_SSD學(xué)院_SSDtime
PCIe和NVMe SSD初始化過程簡介-面包板社區(qū)? ? ? ? ? ?同一篇文章的不同鏈接。
2.1.3 Spec中重點關(guān)注的內(nèi)容(我的調(diào)試)
1、spec1.2中7.6.1 Initialization 介紹了上電后整個通信鏈路建立的過程:host寫NVMe reg、創(chuàng)建Admin Queue,通過Admin創(chuàng)建IO Queue。之后才能進行數(shù)據(jù)的讀寫。
2、spec 7.2.1command processing 介紹了取SQ,執(zhí)行,返回CQ,中斷的詳細過程。注意在步驟4指令執(zhí)行時,可能包含多個純TLP報文完成數(shù)據(jù)讀寫,圖中并未標出;
3、第1章主要是一些名詞解釋,重點1.6節(jié)。
4、第2章是PCIE的寄存器配置,此部分內(nèi)容在使用Xilinx IP時用戶不能直接訪問,而是通過IP GUI設(shè)置參數(shù)即可。在IP中必須注意class code要改為下方協(xié)議中值,否則無法識別為NVMe控制器。電源管理PM、中斷MSI\MSI-X\等都在GUI配置,由IP負責維護reg。
?
?5、第3章重點3.1節(jié),是NVMe協(xié)議層reg,需要mem TLP來讀寫,這些reg有專門的地址,即TLP中的地址段。先不展開細說了,重點提示如下:
- INTMS,INTMC:這兩個reg不是可選,但是也可不用,屬于在協(xié)議層控制中斷屏蔽。需要在本地維護一個中斷屏蔽mask reg,置位mask<=mask | MS ,清除mask<=mask &(~MC),讀取時都返回mask的值,而不是MC or MS 自己的值。
- AQA中由host寫入的是ASQ、ACQ的隊列深度,ASQ是Admin Submission Queue,其中一條指令縮寫ASQE,占用64B。ACQE占用16B;
- ASQ中存儲AdminSQ的基地址,要讀取其中ASQE時,地址=baseaddr+head doorbell*64。而IO SQ的基地址不在這些reg中,它是在用Admin指令創(chuàng)建IO隊列時才由host分配的,需要FPGA自己維護保存;
- SQTail DBL,CQHead DBL是由host維護寫入FPGA中。編號0的是Admin,>=1是IO。Tail總是指向空,表示下一次可以寫入的指針位置。Head≠Tail則表示Queue中還有Entry沒有取走。SQHead DBL由PL自己維護,每讀走一個SQE后+1.CQTail DBL由PL維護,每向host寫一個CQE,Tail+1,注意隊列的滿空,以及從尾部返回到頭部循環(huán)時,報文中的P位要0-1反轉(zhuǎn)一次。
?
?6、第4章 Memory structure,介紹了NVMe中一些基本的定義。重點4.1SQCQ定義,4.2SQE,4.3PRP,4.6CQE格式。其他的SGL、MR、CMB、Fused Operation都不用,arbitration只用默認的RoundRobin即可。
- 注意Queue的empty、full
?
?
- ASQE,IOSQE都包含64B=16DW,兩者DW0的格式相同。一條SQE中本身包含兩個PRP,一個PRP指向4K空間,超過8K空間需要使用PRP List,一個List的最大空間為4K,一個PRP地址本身占用8B,則一個List中最多512個PRP,若還有更多的PRP則第一個list的最后一個PRP指向下一個List的存放地址。PRP計算方法,考慮4K對齊(所謂4K對齊,是指如果訪問地址不是從4K邊界開始的,那么本次對多只能操作起始地址->4K邊界尾)。
SSD NVMe核心之PRP算法_Ingram14的博客-CSDN博客
?7、第5章是Admin指令。重點關(guān)注強制cmd中紅圈部分,是初始化使用到的,順序參見spec1.2 的7.6.1 Initialization 章節(jié)。5.11 Identify command中的data structure和namespace structure特別重要,至于figure91 電源可以只要一種即可,不支持切換。先創(chuàng)建CQ,后創(chuàng)建SQ;先刪除SQ,后刪除CQ。刪除cmd就是把創(chuàng)建指令設(shè)置的各項參數(shù)都復(fù)位。
??
?8、第6章是NVM=IO 指令,重點是讀寫。flush指令若沒有用緩存,或確定數(shù)據(jù)已全部寫入外部存儲,可以不做操作,直接回復(fù)CQE即可。
?
?9、第7章重點關(guān)注7.2指令的處理流程,7.6 控制器初始化過程(整理鏈路建立過程)。
10、第8章大部分都不用看,關(guān)注8.6 Doorbell Stride。在硬件使用時=0,用在doorbell reg 地址分配上,=0則緊湊排布。
2.2 工程實現(xiàn)
三種實現(xiàn)方案NVMe協(xié)議,基于3種不同的IP,QDMA僅支持ultralscale+器件。
2.2.1 PCIE4
PCIE4是ultralscale+器件中的型號,手冊為PG213。與7 Series Integrated Block for PCI Express IP(PG054)略有不同,7系的IP用戶數(shù)據(jù)stream接口分為tx,rx兩個,報文格式基本與標準TLP相同;
PCIE4 IP的用戶接口分為4個:CQ/CC,RQ/RC。XX中前一位是用戶的角色:C代表用戶是完成方被動響應(yīng),R代表用戶請求方主動發(fā)起;后一位表示請求數(shù)據(jù)or完成數(shù)據(jù)。報文格式與標準TLP略有不同。
??
Admin,IO指令都用PL純邏輯實現(xiàn),節(jié)約資源。用于和ASMedia USB轉(zhuǎn)NVMe芯片的通信,此轉(zhuǎn)接芯片的協(xié)議嚴格遵守了NVMe spec,不需要PC端有NVMe的驅(qū)動,PC將其識別為USB設(shè)備。
Controller data structure和Namespace data structure各占用4KB的空間,可以把參數(shù)提前配好,用一個ROM+.coe初始化文件的方式,供Admin讀取。
調(diào)試時先確保PCIE層通信正常,可以使用WinDriver來調(diào)試CQ/CC口,即調(diào)試NVMe reg。注意使用金手指上的復(fù)位來復(fù)位PCIE4 IP。根據(jù)SQE中LBA的個數(shù)決定PRP List長度,讀寫數(shù)據(jù)前先讀取PRPList,并壓入FIFO中,用一個出一個。
2.2.2 XDMA
該方案用MicroBlaze核解析Admin指令,IO指令用PL邏輯實現(xiàn),MB核占用資源。該方案需要PC端驅(qū)動的配合,無法與ASMedia芯片配合使用。
Demo由復(fù)旦大學(xué)設(shè)計,并且有配套論文,硬件基于KCU105開發(fā)板。設(shè)計中創(chuàng)建了一個Admin Queue,8個IO Queue。啟用了XDMA的4條stream通道、descriptor bypass通道、AXI-master、AXI-slave。
- AXI-slave:用戶配置XDMA的內(nèi)部reg,控制中斷,數(shù)據(jù)傳輸啟動、停止等;
- ?AXI-master:host用來配置NVMe協(xié)議中的reg(維護在PL中),如doorbell head/tail;
- descriptor bypass通道:用戶寫入地址+長度,告知host要取回,或發(fā)出數(shù)據(jù)的信息。
- 4條stream通道:傳輸數(shù)據(jù)。數(shù)據(jù)可以是SQE、CQE等指令,也可以是要轉(zhuǎn)移的數(shù)據(jù)。在demo設(shè)計中,2條steam用于讀寫SQE/CQE/PRP,2條steam用于讀寫數(shù)據(jù)。
https://github.com/yhqiu16/NVMeCHA
2.2.3 QDMA
Xilinx官方提供了Demo,使用QDMA+收費的NVMeTC。其Admin指令由MB核解析,且MB上運行了linux系統(tǒng),占用大量資源。僅用于和PC通信。?
?
Documentation Portalhttps://docs.xilinx.com/r/en-US/pg329-nvme-target-controller?tocId=R9sEYjIxu5Zmhve4J9K7gg
在手冊中搜索??Download the?reference design files,下載工程。
3 測速軟件
crystal disk mark:測速更準確。文章來源:http://www.zghlxwxcb.cn/news/detail-785036.html
HD_speed:可以長時間連續(xù)測試,由寫+讀+驗證模式。文章來源地址http://www.zghlxwxcb.cn/news/detail-785036.html
到了這里,關(guān)于基于PCIe的NVMe協(xié)議在FPGA中實現(xiàn)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!