:數(shù)據(jù)通路的調(diào)度中心)
但凡玩過(guò)幾塊SSD的人都會(huì)遇到類似的問(wèn)題新加了一塊固態(tài)硬盤想把原來(lái)D盤的系統(tǒng)遷過(guò)去或者下載了慧榮SM2258XT主控的量產(chǎn)工具想自己開(kāi)卡。折騰硬件之前很多人沒(méi)意識(shí)到?jīng)Q定這一步順利與否的其實(shí)是主控SoC和它旁邊的DRAM顆粒。SSD主控SoC整體架構(gòu)如果沒(méi)有概念很多人會(huì)把“不穩(wěn)定”怪到固件上把“掉速”怪到顆粒上卻很少懷疑DDR子系統(tǒng)在數(shù)據(jù)通路里扮演的角色。這篇文章想以主控SoC內(nèi)部的數(shù)據(jù)通路為主線講清楚DDR子系統(tǒng)到底承擔(dān)什么任務(wù)作為系統(tǒng)架構(gòu)師或維修/開(kāi)卡愛(ài)好者又該怎么去理解帶DRAM和不帶DRAM方案的差異。別覺(jué)得“DDR”只是顆粒選型表里一個(gè)頻率和容量參數(shù)它在整個(gè)SSD里的角色比你想象的復(fù)雜得多。1. 主控SoC其實(shí)是一臺(tái)以“搬數(shù)據(jù)”為唯一目的的專用計(jì)算機(jī)1.1 先看清主控SoC的硬件全家福很多教程一上來(lái)就講FTL算法、垃圾回收但連主控SoC內(nèi)部有哪些模塊都沒(méi)交代清楚。這里先把家底盤一遍。主控SoC并不是什么神秘的東西去掉“存儲(chǔ)”這個(gè)屬性它跟普通嵌入式SoC沒(méi)有本質(zhì)區(qū)別照樣本有CPU核心、總線矩陣、外設(shè)接口。特殊的是它所有外設(shè)和加速器都圍繞同一個(gè)目標(biāo)把用戶數(shù)據(jù)在主機(jī)和NAND之間搬運(yùn)得又快又穩(wěn)。CPU核心以ARM Cortex-R系列為主流也有用自研RISC-V核的。CPU負(fù)責(zé)FTL邏輯、指令解析、壞塊管理、磨損均衡這些“決策類”工作但不直接參與大量數(shù)據(jù)拷貝。主機(jī)接口SATAAHCI協(xié)議或者PCIeNVMe協(xié)議負(fù)責(zé)跟PC、服務(wù)器通信。目前主流消費(fèi)級(jí)NVMe盤的PCIe Gen3 x4帶寬上限大約3500MB/sGen4 x4翻倍到7000MB/s。NAND閃存接口主控拉出若干條閃存通道常見(jiàn)8通道、12通道、16通道甚至更高每個(gè)通道掛多顆NAND die。通道越多閃存并行度越高這個(gè)并行度直接決定主控能跑多高帶寬。ECC/LDPC引擎硬件編解碼器寫的時(shí)候給數(shù)據(jù)加上校驗(yàn)冗余讀的時(shí)候把錯(cuò)誤糾回來(lái)。TLC/QLC時(shí)代LDPC軟解碼對(duì)主控算力要求極高這一塊做不好盤就會(huì)頻繁掉速。DMA引擎這是數(shù)據(jù)通路的真主力。DMA負(fù)責(zé)把數(shù)據(jù)從一個(gè)接口搬到另一個(gè)接口整個(gè)過(guò)程不需要CPU逐字節(jié)干預(yù)CPU只要事先配好描述符和目的地址就行。SRAM與DDR接口內(nèi)部SRAM快但容量很小通常幾十KB到幾MB外部DDR才是主存儲(chǔ)容量從幾十MB到1GB以上不等承擔(dān)絕大多數(shù)像映射表、數(shù)據(jù)緩沖這類需要大容量暫存的活兒??偩€矩陣內(nèi)部互聯(lián)容易被忽略但它和DDR子系統(tǒng)同樣關(guān)鍵。主控內(nèi)部常用AXI總線或者類似NoC的多平面互聯(lián)位寬從32位到64位頻率從幾百M(fèi)Hz到1GHz不等。如果你的內(nèi)部總線只有一個(gè)單出口主機(jī)數(shù)據(jù)、閃存數(shù)據(jù)、DDR訪問(wèn)、ECC編碼全部搶一條路那么外部DDR即使再快也會(huì)被“卡脖子”。很多FPGA做控制器原型驗(yàn)證的人會(huì)遇到“DDR帶寬明明夠但整機(jī)性能就是上不去”的情況一半的根因出在內(nèi)部總線仲裁而不是DDR本身。1.2 寫請(qǐng)求和讀請(qǐng)求在SoC內(nèi)部的完整旅程了解了模塊構(gòu)成就可以把一條真實(shí)的數(shù)據(jù)請(qǐng)求放進(jìn)通路里跑一遍。先看寫路徑主機(jī)通過(guò)NVMe/SATA協(xié)議發(fā)送寫命令伴隨數(shù)據(jù)包進(jìn)入主控的主機(jī)接口。DMA引擎把數(shù)據(jù)從主機(jī)側(cè)接收FIFO搬到內(nèi)部緩沖SRAM或DDR。此時(shí)數(shù)據(jù)已經(jīng)帶上了邏輯塊地址LBA。固件查詢FTL映射表決定這批數(shù)據(jù)該寫到哪些物理頁(yè)。注意這里FTL映射表通常就住在DDR里所以光“查表”這一步就已經(jīng)產(chǎn)生了一次DDR訪問(wèn)。決定物理地址后數(shù)據(jù)不會(huì)立刻落閃存。固件會(huì)依據(jù)磨損均衡、垃圾回收狀態(tài)和當(dāng)前NAND忙閑情況把數(shù)據(jù)先在DDR的寫緩沖區(qū)分組、合并。等到NAND通道空閑且聚合的數(shù)據(jù)量足夠固件才發(fā)起寫操作數(shù)據(jù)從DDR緩沖區(qū)流向LDPC編碼引擎加完校驗(yàn)后按通道和片選分配到對(duì)應(yīng)NAND顆粒。物理寫入完成后FTL映射表在DDR中更新。這部分更新的映射記錄還要定期固化到NAND的映射備份區(qū)否則斷電就會(huì)丟失。再看讀路徑讀路徑的邏輯稍微“輕”一點(diǎn)但同樣繞不開(kāi)DDR主機(jī)發(fā)出讀命令固件先查DDR里的映射表把LBA翻譯成物理頁(yè)地址。主控向?qū)?yīng)NAND通道發(fā)起讀命令從NAND讀回原始數(shù)據(jù)經(jīng)過(guò)LDPC譯碼獲取正確數(shù)據(jù)。由于NAND頁(yè)大小常見(jiàn)16KB或32KB和主機(jī)讀寫粒度典型4KB不對(duì)等主控經(jīng)常需要把若干段數(shù)據(jù)在DDR或SRAM里重新拼接湊成主機(jī)期望的邏輯塊再用DMA返回主機(jī)。一條數(shù)據(jù)從進(jìn)到出至少兩次經(jīng)過(guò)DDR。這個(gè)“至少”在隨機(jī)小寫、垃圾回收并發(fā)時(shí)會(huì)翻倍增長(zhǎng)。所以結(jié)論已經(jīng)很明顯了DDR子系統(tǒng)不是“可選配件”而是數(shù)據(jù)通路上的十字路口。2. DDR子系統(tǒng)在數(shù)據(jù)通路里的四種身份2.1 它是FTL映射表的常駐內(nèi)存FTLFlash Translation Layer是SSD的靈魂。它維護(hù)一張“邏輯地址到物理地址”的映射表。主機(jī)只認(rèn)邏輯塊地址LBA但閃存物理頁(yè)是不斷在磨損、回收、重寫的所以主控內(nèi)部必須有一張隨時(shí)能查的表。這張表有多大可以做一次很樸素的估算假設(shè)映射粒度為8KB即每8KB邏輯空間對(duì)應(yīng)一個(gè)映射條目單條映射信息打包壓縮后占用4字節(jié)。那么一塊512GB的盤映射表大小就是512GB÷8KB×4B算下來(lái)正好256MB。如果映射粒度更細(xì)4KB或條目更寬8字節(jié)512GB盤就可能需要512MB甚至1GB的DRAM來(lái)裝映射表。這里就能解釋很多產(chǎn)品現(xiàn)象為什么老款120GB/240GB固態(tài)盤只配64MB或128MB DDR而高端2TB盤要配512MB或1GB DDR。因?yàn)槿萘吭酱笥成浔碓酱驞DR不夠就裝不下足夠多的映射表熱數(shù)據(jù)。有了DDR常駐映射表主控處理一次讀命令時(shí)查表只需要一個(gè)短延時(shí)的內(nèi)存訪問(wèn)如果沒(méi)DDR或者DDR容量太小映射表就只能部分駐留查不到的部分要去NAND里讀這個(gè)開(kāi)銷是災(zāi)難級(jí)別的4K隨機(jī)性能會(huì)直接崩塌。2.2 它是讀寫合并時(shí)用的臨時(shí)堆場(chǎng)NAND閃存的工作方式跟機(jī)械硬盤完全不一樣它以頁(yè)為單位讀寫一個(gè)頁(yè)通常是16KB或32KB。但主機(jī)下發(fā)數(shù)據(jù)的粒度很靈活可能是極其瑣碎的4KB、8KB甚至更小。為了讓NAND寫效率更高主控不會(huì)來(lái)一條就寫一條而是把零碎的寫請(qǐng)求先在DDR緩沖里攢一攢湊成完整的NAND頁(yè)再寫入。這個(gè)過(guò)程在固件術(shù)語(yǔ)里叫“寫合并”或“批量組頁(yè)”。讀方向同樣需要合并。主機(jī)可能只讀一個(gè)頁(yè)里的前半部分但NAND讀出來(lái)的是整個(gè)物理頁(yè)。主控要么只保留有效部分要么把整頁(yè)數(shù)據(jù)放進(jìn)DDR緩存以便后續(xù)相鄰LBA的讀取直接命中。垃圾回收時(shí)更夸張GC要把一個(gè)塊里的有效數(shù)據(jù)先讀進(jìn)DDR再把它們跟正在寫的熱數(shù)據(jù)一起重新分配、重寫。這一進(jìn)一出DDR的帶寬壓力瞬間翻倍。所以有很多主控在順序?qū)懭霑r(shí)表現(xiàn)尚可一旦進(jìn)入“半盤以上空間被占滿”狀態(tài)性能會(huì)出現(xiàn)斷崖式下跌。除了NAND本身寫放大很大程度也源于DDR緩沖和固件GC策略在實(shí)際數(shù)據(jù)通路中調(diào)度不過(guò)來(lái)。2.3 它是固件自己的運(yùn)行內(nèi)存很多人只把DDR理解成“緩存”其實(shí)它同時(shí)也是固件的運(yùn)行內(nèi)存。SSD主控里跑的是一套完整的實(shí)時(shí)操作系統(tǒng)固件棧包括FTL模塊、命令調(diào)度、壞塊管理、磨損均衡、溫控策略還有各種后臺(tái)任務(wù)。這些模塊的代碼在運(yùn)行前會(huì)被從NAND或外掛NOR Flash加載到內(nèi)存里執(zhí)行。固件用到的數(shù)據(jù)結(jié)構(gòu)比如命令隊(duì)列、壞塊表、磨損計(jì)數(shù)、日志系統(tǒng)、上下文狀態(tài)全部需要一大塊可讀寫的RAM空間。內(nèi)部SRAM通常只有幾百KB撐不起這么多東西所以DDR才是固件的“主存”。如果DDR子系統(tǒng)不穩(wěn)定比如顆粒虛焊、供電紋波偏大、訓(xùn)練時(shí)序不對(duì)SSD最典型的表現(xiàn)就是“掉盤”——固件運(yùn)行過(guò)程中訪問(wèn)DDR出錯(cuò)觸發(fā)看門狗復(fù)位盤從系統(tǒng)里消失過(guò)一會(huì)又出現(xiàn)。這種案例在維修和開(kāi)卡圈子里非常常見(jiàn)很多人誤以為是固件bug其實(shí)根源在DDR。2.4 它是掉電保護(hù)時(shí)最后搶救的數(shù)據(jù)安全島DDR是易失性存儲(chǔ)一斷電數(shù)據(jù)就沒(méi)了。但恰恰因?yàn)镈DR里住著映射表和寫緩存SSD掉電時(shí)最怕的就是DDR內(nèi)容來(lái)不及保存。帶掉電保護(hù)PLP的企業(yè)級(jí)盤會(huì)在主板上焊一排大電容或鉭電容檢測(cè)到外部電源跌落時(shí)利用電容殘存電量繼續(xù)給主控、DDR和NAND供一小段時(shí)間的電。主控利用這段時(shí)間把DDR里的FTL映射表快照和新寫入但還沒(méi)來(lái)得及落盤的數(shù)據(jù)緊急寫進(jìn)NAND的臨時(shí)區(qū)域。消費(fèi)級(jí)盤大多沒(méi)有完整PLP靠的是固件定期把映射表持久化到NAND同時(shí)保證DDR里只保留可以重新推導(dǎo)或重建的數(shù)據(jù)。但無(wú)論哪一類DDR的角色都一致它是數(shù)據(jù)最集中、最新鮮的地方掉電保護(hù)的本質(zhì)就是在搶救DDR里的資產(chǎn)。這里也能看出DRAM-less方案的一個(gè)優(yōu)勢(shì)——少一個(gè)DDR掉電時(shí)需要搶救的數(shù)據(jù)量會(huì)小很多失效模型更簡(jiǎn)單。3. 從計(jì)算角度看DDR選型帶寬、容量、時(shí)序三個(gè)硬指標(biāo)3.1 DDR帶寬要多少才夠用在方案設(shè)計(jì)階段你要回答的第一個(gè)問(wèn)題不是“用多大容量DDR”而是“DDR帶寬夠不夠”。DDR在數(shù)據(jù)通路里要同時(shí)服務(wù)主機(jī)數(shù)據(jù)、NAND數(shù)據(jù)、FTL查詢、固件CPU讀寫所以它的總線帶寬必須留足余量。做一次粗略預(yù)算。假設(shè)做一塊PCIe Gen3 x4接口的NVMe盤主機(jī)接口理論帶寬約3500MB/s。為了達(dá)到這個(gè)上限NAND接口側(cè)必須同樣具備接近甚至超過(guò)3500MB/s的聚合帶寬而數(shù)據(jù)搬移過(guò)程中DDR常常要當(dāng)中間跳板。經(jīng)驗(yàn)做法是讓DDR可用帶寬達(dá)到主機(jī)接口理論帶寬的1.5到2倍以上才能保證順序大文件讀寫、隨機(jī)小寫和GC并發(fā)時(shí)不會(huì)被內(nèi)存訪問(wèn)卡住。舉個(gè)例子常見(jiàn)的DDR3-1600顆粒數(shù)據(jù)線寬16bit它的峰值帶寬是1600MT/s×2字節(jié)≈3200MB/s。這個(gè)值單看跟Gen3 x4接口差不多但實(shí)際包含了行激活、預(yù)充電、讀寫切換等開(kāi)銷可用帶寬會(huì)打折扣。所以稍微講究一點(diǎn)的控制器會(huì)選用DDR3/DDR4 1866/2133頻率或者把DDR數(shù)據(jù)線擴(kuò)展到32bit把峰值帶寬推到6.4GB/s以上。不做這一步順序?qū)懭牒蟀攵瓮鶗?huì)出現(xiàn)周期性掉速。我實(shí)際在FPGA原型上踩過(guò)這個(gè)坑DDR顆粒型號(hào)沒(méi)變只是把突發(fā)數(shù)據(jù)調(diào)度策略從“每筆請(qǐng)求獨(dú)立訪問(wèn)”改成“同Bank連續(xù)地址聚合訪問(wèn)”整機(jī)隨機(jī)寫性能就提升了約20%。這充分說(shuō)明DDR帶寬不止看顆粒規(guī)格更看控制器怎么組織和利用總線事務(wù)。這里順帶回答一個(gè)很多初學(xué)者會(huì)查的問(wèn)題DDR的burst length是什么意思DDR3/4顆粒默認(rèn)突發(fā)長(zhǎng)度BL8意味著一次突發(fā)連續(xù)傳輸8個(gè)數(shù)據(jù)字。以16bit位寬的顆粒為例一次BL8突發(fā)會(huì)傳輸16×8128bit數(shù)據(jù)對(duì)應(yīng)內(nèi)部預(yù)取8n位??刂破髦挥邪凑者B續(xù)地址、盡量集中在同一行Row Buffer Hit的方式組織訪問(wèn)才能把突發(fā)效率跑滿。如果你去讀DDR協(xié)議規(guī)范會(huì)發(fā)現(xiàn)ACT、READ、WRITE命令之間的時(shí)序約束tRCD、tRAS、tWR等非常嚴(yán)格這都是在為突發(fā)傳輸?shù)母咝史?wù)。3.2 DDR容量與NAND容量的換算關(guān)系容量問(wèn)題前面提到過(guò)這里給出可復(fù)用的公式映射表所需空間 ≈ (SSD用戶容量 ÷ 映射粒度) × 單條映射大小以512GB容量、8KB粒度、每條映射4字節(jié)為例512GB 536870912KB除以8KB得到67108864條映射再乘4字節(jié)等于256MB。所以不帶DDR的主控如果想保證映射表完整駐留至少配256MB內(nèi)存。實(shí)際工程中還要預(yù)留寫緩存和固件運(yùn)行空間512GB盤配256MB DDR其實(shí)已經(jīng)非常緊張很多設(shè)計(jì)會(huì)配到512MB。1TB往上要看映射粒度是否增大、映射條目壓縮是否激進(jìn)不然DDR成本會(huì)壓不住。從選型角度大家可以直接拿這個(gè)公式反推看到一塊盤的DRAM顆粒容量就能估算它主控的映射管理策略大概是什么等級(jí)從而判斷它在高負(fù)載下會(huì)不會(huì)出現(xiàn)映射抖動(dòng)。3.3 burst length、位寬與頻率如何組合很多主控規(guī)格表只寫“支持DDR3/DDR4”但不寫位寬。主控SoC的DDR控制器接口位寬通常有16bit和32bit兩種少見(jiàn)64bit。位寬直接決定同樣頻率下帶寬翻倍代價(jià)是SoC封裝引腳數(shù)和PCB布線面積顯著上升。DDR頻率選擇還要考慮跟主控內(nèi)部總線頻率的匹配。內(nèi)部AXI總線主頻假設(shè)是400MHz、64bit位寬理論帶寬也是3.2GB/s那么DDR3-1600 16bit的3.2GB/s正好匹配但余量不足。好的架構(gòu)設(shè)計(jì)會(huì)讓DDR接口帶寬略高于內(nèi)部總線帶寬而不是剛好卡在同一個(gè)數(shù)否則總線滿負(fù)載時(shí)會(huì)產(chǎn)生反壓導(dǎo)致主機(jī)接口出現(xiàn)額外延遲。時(shí)序?qū)用鍰DR3/DDR4顆粒的CL、tRCD、tRP這些參數(shù)同樣影響實(shí)際性能。顆粒頻率往上提CL值往往同步放大延遲反而沒(méi)降多少。SSD主控對(duì)延遲尤其敏感尤其是隨機(jī)4K讀每次查映射表的延遲都能直接影響IOPS。所以做SSD主控選DDR顆粒時(shí)別看峰值帶寬花眼還要關(guān)注在目標(biāo)頻率下的實(shí)際讀寫延遲。4. 帶外部DDR與DRAM-less的分叉口同為SSD內(nèi)部差著一個(gè)架構(gòu)時(shí)代4.1 帶DDR方案旗艦產(chǎn)品的穩(wěn)定器我們先說(shuō)經(jīng)典方案主控帶著一顆外置DDR顆粒。典型代表包括大家熟悉的慧榮SM2258注意不是XT版、SM2262/SM2263群聯(lián)E12/E16聯(lián)蕓MAP1202等。這些主控方案幾乎都外掛一顆DDR3L或DDR4顆粒容量從64MB到1GB不等。帶DDR方案的優(yōu)勢(shì)非常明顯FTL映射表完整駐留任意LBA查表都是固定低延遲。寫緩存空間充裕即使隨機(jī)小寫也能大量聚合大大減少NAND寫入次數(shù)降低寫放大。固件運(yùn)行空間富余可以做復(fù)雜的后臺(tái)GC、磨損均衡和熱冷數(shù)據(jù)分離。掉電保護(hù)只需要聚焦DDR和NAND之間的數(shù)據(jù)搬移邏輯相對(duì)清晰。缺點(diǎn)也直白成本高BOM里多一顆DDR顆粒多一個(gè)失效點(diǎn)DDR本體虛焊、老化、供電異常都會(huì)導(dǎo)致不開(kāi)卡或掉盤。不過(guò)對(duì)性能和穩(wěn)定性要求高的人來(lái)說(shuō)這些代價(jià)值得。4.2 DRAM-less HMB方案用主機(jī)內(nèi)存“蹭”出性能近幾年低價(jià)位NVMe盤大量采用DRAM-less主控比如慧榮SM2258XT、SM2263XT。這類方案在主控SoC上直接省掉DDR控制器外訪通路不焊外置DRAM顆粒成本大幅下降。但前面說(shuō)得很清楚沒(méi)有DDR映射表住哪兒寫緩存用什么解決辦法叫HMBHost Memory Buffer主機(jī)內(nèi)存緩沖。NVMe協(xié)議允許主控通過(guò)PCIe BAR空間去訪問(wèn)主機(jī)系統(tǒng)DDR的一段固定區(qū)域。也就是說(shuō)主控可以“借”一部分主機(jī)內(nèi)存來(lái)緩存FTL映射表和少量寫數(shù)據(jù)。HMB的妙處在于借用的是PC上性能極強(qiáng)的大容量?jī)?nèi)存而且延遲只比主控自帶DDR高一點(diǎn)點(diǎn)多了一次PCIe往返。對(duì)日常使用來(lái)說(shuō)HMB方案在讀寫大文件、跑分軟件里甚至能跟帶DDR方案打平。但實(shí)際體驗(yàn)中存在幾個(gè)不那么漂亮的地方老舊主板BIOS不支持HMB分配或PCIe ASPM省電策略太激進(jìn)導(dǎo)致主機(jī)內(nèi)存響應(yīng)不穩(wěn)定盤有時(shí)會(huì)卡成幻燈片。映射緩存放主機(jī)內(nèi)存每次查詢都要走PCIe鏈路雖然延遲不高但高隊(duì)列深度下并發(fā)沖突明顯隨機(jī)性能波動(dòng)比帶DDR方案大。寫緩存受限小文件寫入合并能力弱垃圾回收壓力會(huì)更早暴露。所以DRAM-less方案適合預(yù)算敏感、以順序讀寫為主的用戶如果重負(fù)載隨機(jī)寫、長(zhǎng)時(shí)間渲染或虛擬機(jī)多開(kāi)還是優(yōu)先考慮帶DDR方案。拆分這一點(diǎn)很多“為什么同容量盤價(jià)格差一半”的疑問(wèn)就解開(kāi)了。4.3 開(kāi)卡和量產(chǎn)時(shí)怎么判斷主控是否帶緩存如果你玩開(kāi)卡工具會(huì)在量產(chǎn)工具界面看到“Cache”“DDR”之類的選項(xiàng)。比如慧榮SM2258XT對(duì)應(yīng)的量產(chǎn)工具跟SM2258固件包往往不通用因?yàn)橐粋€(gè)是DRAM-less架構(gòu)一個(gè)是帶DDR外置架構(gòu)。開(kāi)卡前先看板子上有沒(méi)有獨(dú)立的DDR顆粒不要憑主控型號(hào)硬刷。很多開(kāi)卡失敗案例都源于糊涂地拿帶DDR固件往無(wú)緩存板子上刷。判斷方法很簡(jiǎn)單外觀上看主控旁邊有沒(méi)有一顆稍大的、引腳密集的顆粒更準(zhǔn)確的做法是查主控datasheet的封裝引腳表看有沒(méi)有完整DDR接口信號(hào)。像SM2258XT這種型號(hào)后綴帶XT的本身就是無(wú)緩存版本選錯(cuò)固件很容易報(bào)錯(cuò)。5. 固件與硬件配合中的DDR細(xì)節(jié)啟動(dòng)訓(xùn)練、掉電保護(hù)與排查經(jīng)驗(yàn)5.1 上電之后DDR是怎么被“喚醒”的這個(gè)環(huán)節(jié)做固件的人深有體會(huì)但普通玩家往往不知道。SSD上電后主控SoC并不是立刻就能用DDR的。此時(shí)DDR還沒(méi)有初始化內(nèi)部時(shí)序參數(shù)未知物理層信號(hào)對(duì)齊也沒(méi)建立。所以BootROM先靠?jī)?nèi)部SRAM運(yùn)行這段極早期的代碼只能用少量SRAM做基本硬件初始化鎖相環(huán)、時(shí)鐘、主機(jī)接口PHY、關(guān)鍵IO。完成基礎(chǔ)初始化后固件才進(jìn)入DDR初始化流程也就是常說(shuō)的DRAM Training。DDR控制器要在目標(biāo)頻率下對(duì)DQS/DQ信號(hào)做延遲掃描找到每個(gè)字節(jié)通道最可靠的采樣窗口然后寫入時(shí)序寄存器。這一步如果失敗盤的表現(xiàn)就是“主控不識(shí)別”“顆粒焊接沒(méi)問(wèn)題但依舊抓不到盤”實(shí)際顆粒本身往往是好的純粹是訓(xùn)練參數(shù)沒(méi)通過(guò)。我見(jiàn)過(guò)很多維修案例盤掉盤后重新開(kāi)卡又好了本質(zhì)就是重新上電后DRAM Training過(guò)了。但殘留問(wèn)題還在因?yàn)轭w?;蚬╇娨呀?jīng)老化訓(xùn)練余量極小跑幾天又會(huì)復(fù)現(xiàn)。這種情況建議直接更換DDR或降壓處理而不是反復(fù)刷機(jī)。5.2 掉電保護(hù)在固件層面的實(shí)現(xiàn)層次前面講過(guò)PLP的硬件基礎(chǔ)這里看固件怎么利用DDR做數(shù)據(jù)安全。第一級(jí)固件定期比如幾百毫秒或幾秒內(nèi)一次把DDR里的FTL映射表快照寫入NAND的映射備份區(qū)。每次完整寫映射表比較耗時(shí)所以通常只做“臟映射項(xiàng)”增量備份。第二級(jí)發(fā)生掉電時(shí)主控轉(zhuǎn)入緊急處理流程關(guān)閉主機(jī)接口禁止NAND新任務(wù)然后集中把DDR里的寫緩存數(shù)據(jù)和最新映射變更寫進(jìn)NAND臨時(shí)塊。等下次上電固件啟動(dòng)時(shí)先從臨時(shí)塊恢復(fù)現(xiàn)場(chǎng)。這里要注意DDR的容量越大掉電時(shí)需要搬移的數(shù)據(jù)也越多。如果DDR位寬窄、頻率低搬移時(shí)間就會(huì)拉長(zhǎng)對(duì)PLP電容的電量?jī)?chǔ)備要求就更高。這就是為什么有些大容量DDR方案的盤反而更容易在掉電中出問(wèn)題因?yàn)樗凹耶?dāng)”太多來(lái)不及搬完。在做產(chǎn)品定義時(shí)DDR容量不是越大越好還要評(píng)估在目標(biāo)掉電窗口內(nèi)能否完成數(shù)據(jù)固化。5.3 調(diào)試DDR常見(jiàn)問(wèn)題從“讀有效信號(hào)一直為低”說(shuō)起很多做FPGA原型驗(yàn)證或芯片驗(yàn)證的朋友會(huì)遇到一個(gè)問(wèn)題控制DDR時(shí)DDR的讀有效信號(hào)一直拉不高。這個(gè)現(xiàn)象可以拆出好幾個(gè)可能方向。第一檢查DDR控制器初始化狀態(tài)。控制器完成training并進(jìn)入正常態(tài)之前根本不會(huì)產(chǎn)生有效的讀數(shù)據(jù)返回讀有效信號(hào)保持低電平是正常的。不要一上來(lái)就懷疑讀時(shí)序先看控制器狀態(tài)寄存器是否從IDLE進(jìn)入ACTIVE。第二檢查命令是否真正發(fā)出。FPGA或膠邏輯里經(jīng)常犯的錯(cuò)是只配了地址沒(méi)有按DDR協(xié)議先發(fā)ACT命令打開(kāi)行就直接發(fā)READ命令或者REF自動(dòng)刷新沒(méi)有及時(shí)觸發(fā)。DDR要求先激活行再讀列命令次序錯(cuò)一個(gè)周期控制器就永遠(yuǎn)等不到有效數(shù)據(jù)。第三核對(duì)DFI接口的返回時(shí)序。控制器和PHY之間通常用DFI接口通信PHY讀回來(lái)的數(shù)據(jù)要經(jīng)過(guò)若干周期的內(nèi)部延遲才拉到DFI總線上。很多“讀有效一直為低”的case其實(shí)是PHY側(cè)返回路徑的采樣延遲沒(méi)配對(duì)控制器在錯(cuò)誤的時(shí)鐘沿采樣誤以為沒(méi)有有效數(shù)據(jù)。調(diào)試時(shí)可以沿著DFI總線把rddata_valid和rddata相對(duì)于dqs的相位打一拍、兩拍、三拍逐一觀察常常能找到正確窗口。第四用邏輯分析儀或示波器看物理DQS/DQ邊沿。如果命令、地址、時(shí)序寄存器都正常但DQS上根本沒(méi)出現(xiàn)讀前導(dǎo)信號(hào)read preamble優(yōu)先查時(shí)鐘穩(wěn)定性和PHY的訓(xùn)練結(jié)果。顆粒供電紋波大、參考電壓Vref偏了也會(huì)導(dǎo)致物理層眼圖閉合訓(xùn)練過(guò)程直接卡住。處理這類問(wèn)題經(jīng)驗(yàn)法則是“先狀態(tài)機(jī)后物理層再協(xié)議層”。把控制器狀態(tài)和DFI時(shí)序理清楚絕大多數(shù)“讀有效信號(hào)異?!倍寄芏ㄎ弧_@一套排查鏈路在SSD固件和芯片驗(yàn)證崗位面試?yán)镆步?jīng)常被拿出來(lái)問(wèn)可見(jiàn)它多么基礎(chǔ)又關(guān)鍵。DDR子系統(tǒng)在整個(gè)SSD主控SoC里的角色往小說(shuō)是內(nèi)存顆粒選型往大了說(shuō)其實(shí)是數(shù)據(jù)通路的調(diào)度中心。理解它之后再去看那些“帶緩存好還是無(wú)緩存好”“為什么掉盤”“為什么開(kāi)卡報(bào)錯(cuò)”的問(wèn)題思路會(huì)清晰很多。我自己做固件調(diào)優(yōu)時(shí)也養(yǎng)成一個(gè)習(xí)慣遇到性能或穩(wěn)定性問(wèn)題先看DDR控制器統(tǒng)計(jì)數(shù)據(jù)讀命中率、行命中率、寫合并命中率三個(gè)數(shù)一番組合下來(lái)往往比盲目調(diào)GC參數(shù)有效得多。希望這篇梳理能給你在選型、開(kāi)卡或調(diào)試的路上省下一點(diǎn)試錯(cuò)時(shí)間。