密探 · 案卷 0.4:發(fā)號施令要用大喇叭喊RCD)
我們前面查了戶口、身份證、配電站。接下來我們看看怎么發(fā)號施令。要想內(nèi)存干活就得先給他下命令讀、寫、激活、刷新第幾行第幾列哪個bank。這套口令叫CACommand/Address命令/地址總線。下完命令真開始干活搬貨的那又是DQ數(shù)據(jù)線。命令和數(shù)據(jù)走的不是一條路。命令是大喇叭喊的干活是從倉庫里搬貨的。兩條路DDR5的內(nèi)存條子上信號分兩撥走不同的路。信號內(nèi)容路線CA CK命令/地址 時鐘穿過 RCD先到 RCD再由 RCD 扇出給每個顆粒DQ DQS數(shù)據(jù) 數(shù)據(jù)選通直連顆粒LRDIMM 才加 DB 重驅(qū)動發(fā)號施令要用大喇叭喊數(shù)據(jù)搬貨走倉儲專線。RCD是擴(kuò)音器RCDRegistering Clock Driver寄存時鐘驅(qū)動器JESD82-513命令/地址經(jīng)過的那顆芯片它把老板送來的口令用大喇叭廣播給所有顆粒。比如樂隊表演交響樂指揮吼一嗓子全場幾十個樂手都要聽見場地一大就不能靠嗓了得大喇叭RCD就是大喇叭。為什么要有RCD因為條子的負(fù)載越來越大。RDIMM上有多個rank、幾十顆顆粒每顆顆粒的CA時鐘腳都要接。host那點驅(qū)動能力推不動這么多負(fù)載。RCD就是那個給老板分憂的中層host只驅(qū)動RCD一顆芯片RCD再重新驅(qū)動所有顆粒天下太平。但是有得必有失RCD 天生帶來兩件事延遲口令經(jīng)RCD一進(jìn)一出就慢半拍。skewRCD到不同顆粒走線參差不齊每顆顆粒聽到口令的時刻就不一樣。怎么找到這個大喇叭RCD跟PMIC一樣也是掛在SPDHub背后。host要跟RCD說話也得先跟SPDHub打招呼穿Hub。RCD 的門牌號JESD300-5 Table 5LID器件類型1011地址 1011 HID(槽號)0x58 ~ 0x5FDIMM 槽01234567RCD 地址0x580x590x5A0x5B0x5C0x5D0x5E0x5F整體來看是這么個事器件LID地址PMIC配電站10010x48~0x4FSPD Hub前臺10100x50~0x57RCD傳令兵10110x58~0x5F溫度傳感器 TS0 / TS10010 / 01100x10 / 0x30 附近訪問方式就是老板發(fā)1011 槽號每根條子的 Hub 拿槽號跟自己對命中的那根把本地 HID 改寫111它的RCD舉起手來JESD300-5 §2.6.6。注意CA沒有貼身門鈴CA和DQ最根本的區(qū)別是CA沒有DQ的搖鈴信號DQS??空l定時有沒有貼身門鈴類比DQDQS每lane一個跟數(shù)據(jù)同行有快遞員跟著貨走貨到門鈴響CACK全局時鐘不是專屬的沒有樂手只聽指揮的節(jié)拍DQ有DQS貼身門鈴門鈴跟著數(shù)據(jù)一起走天然對齊。所以DQ的時序被DQS自動兜住一部分。CA沒有鈴只能靠全局CK打拍子。RCD把CA和CK的時序關(guān)系沒搞好顆粒就會聽岔拍了。這就是為什么CA必須單獨專門訓(xùn)練。給口令線做時序?qū)R訓(xùn)練de-skew訓(xùn)練就是逐根調(diào)整 CA 線的延遲讓每一根命令/地址線都踩準(zhǔn)CK的拍子到達(dá)顆粒。也就是掃延遲找窗口控制器發(fā)一組已知的CA口令顆粒訓(xùn)練模式下通過DQ回報聽清沒有控制器掃CA的延遲找到能聽清的窗口取窗口中心逐根鎖定眼寬是所有顆粒聽清窗口的交集木桶最短的板。還有個坑及格線按pattern難度分檔歸一化——及格線是相對這首曲子的預(yù)期眼寬、不是絕對寬度。歌難唱大家本來眼就窄要求就得放低不能當(dāng)大家都是歌神張學(xué)友否則一首難曲子全班翻車那還怎么玩CA還是DQ掛了CA 掛了DQ 掛了本質(zhì)口令沒聽清口令聽清了貨搬錯了癥狀開不了機(jī) / POST 卡死能開機(jī)但數(shù)據(jù)錯 / 藍(lán)屏 / ECC 報錯類比指揮喊開始樂手沒聽見全體愣住樂手聽見了開始有人拉錯了音看到開不了機(jī)、卡在訓(xùn)練早期先懷疑CA看到能開機(jī)但數(shù)據(jù)錯才往DQ查。CA訓(xùn)練失敗的例子CA訓(xùn)練失敗打印警告”Best Eye Width … smaller than minimum critical margin”channel被禁用。CA訓(xùn)練的眼寬是所有CA信號聽清窗口的交集眼寬太小小于臨界值就禁channel。注意CA走RCD不經(jīng)過DFECA命令方向和DQ數(shù)據(jù)方向是兩條獨立路徑DFE是讀DQ方向的回聲消除器救不了CA用錯藥是硬傷。DIMM差異類型RCDDBCA/DQ 路線UDIMM / SODIMM無無CA 直連 DRAM無 RCDRDIMM有無CA 穿 RCDDQ 直連LRDIMM有有CA 穿 RCD DQ 穿 DB「減載」MRDIMM有有(mux)再加 rank 復(fù)用DBData Buffer數(shù)據(jù)緩沖LRDIMM 才有——重驅(qū)動 DQ 數(shù)據(jù)。DB是LRDIMM的減載RCD卸掉了CA/時鐘的負(fù)載但DQ的負(fù)載還在host身上。RDIMM只到這一步能掛的rank有限。LRDIMMLoad-Reduced DIMM減載 DIMM再進(jìn)一步又加了中層經(jīng)理人DB把DQ/DQS的負(fù)載也卸下來CA/CKDQ/DQS能掛 rankRDIMM穿 RCD直連少LRDIMM穿 RCD穿 DB多8~16此時老板只對RCD、DB驅(qū)動一條channel就能掛更多rank了。加了DB以后重新驅(qū)動DQ/DQS同樣帶來延遲和偏移所以 LRDIMM 的 DQ 訓(xùn)練也得遷就 DB 引入的偏移。自己動手訪問RCD我寫了個跑在 UEFI Shell 里的工具 RCDTest照 JEDEC 公開規(guī)范JESD82-513通過 SMBus 穿 SPD Hub 訪問 RCD 的控制字RW00~RWxx。同一個 repo 里的兄弟又多了一個SpdTest 讀身份證PmicTest 讀/燒配電站RCDTest 讀/寫傳令兵。用法RCDTest.efi scan # 掃 0x58~0x5F列出在位的 RCD RCDTest.efi read -c ctrl -ch ch -d dimm # 讀全部控制字 RW00~RW5F RCDTest.efi read -c ctrl -ch ch -d dimm -r reg # 讀一個控制字 RCDTest.efi write -c ctrl -ch ch -d dimm -r reg -data 8hex # 寫一個控制字輸出大概長這樣最近手上沒有環(huán)境驗證 RCD Scan (addresses 0x58..0x5F) DIMM 0 (0x58): RCD present (RW000xXXXXXXXX) Total: 1 RCD(s) present RCD Control Words (RW00~RW5F) DIMM: Controller0 Channel0 Dimm0 (SMBus 0xB0, 7-bit 0x58) RW00 0xXXXXXXXX (Global Features) RW05 0xXXXXXXXX (DIMM Operating Speed) ... RCD不是PMIC那種寫寄存器地址去讀寫數(shù)據(jù)而是Sideband控制字的協(xié)議JESD82-513 §7.5.7?7.5.8。它是先block寫命令和設(shè)置再block讀回狀態(tài)DWord。命令字節(jié)還分 I2C0xC2和 I3C0xC0兩種RCDTest走的I2C所以用的是0xC2。RCD 的版本也能讀出來——它在分頁控制字 PG[3]RW6EVendor Revision ID里先寫 RW5F 選頁、再讀 RW6E。log 里的真實值是IDT Rev 1.0x33、Montage Rev 2.0x11。源碼在 http://github.com/peterhu/ddr5-shellkit??傊痪湓捗钭叽罄葦?shù)據(jù)走直線。命令錯開不了機(jī)數(shù)據(jù)錯會藍(lán)屏。CA是口令、DQ是數(shù)據(jù)。CA掛了全體顆粒聽不見口令直接開不了機(jī)DQ掛了口令聽清了但貨搬錯了能開機(jī)但數(shù)據(jù)錯。而CA之所以最難訓(xùn)是因為它要一幫兄弟同時踩中節(jié)拍、還沒貼身門鈴、又被RCD加了偏移。