DDR內存知識小科普

文章內容較多,如有錯誤懇請指正,謝謝。

DDR的主要電壓

VDD核心供電

VDDQ IO接口供電

VPP 字線供電

VTT 位線供電(DDR5取消)

VREF 基準電壓(DDR5取消獨立引腳)

DDR內存層級

Cell-Array-Bank-BankGroup-Chip-Rank-Dimm

Cell與VPP電壓

Cell

Cell是組成內存的基本單元,由一個Nmos和一個電容組成。電容內存儲電荷越多電壓越高,反之電壓越低,我們規定電容電壓低於VDD/2表示0,高於則表示1,這樣就能夠藉助電容的電壓存儲數據,但是一個電容只能存儲1bit。

Nmos像一個開關,Gate上的電壓=VPP的時候Nmos導通,Gate上電壓=0V的時候Nmos關閉。

Array與讀寫過程

1個array

8個array

array是由數量龐大的cell組成的存儲陣列,指定行地址和列地址就能精確定位到1bit數據。

每個array都有一行Sense Amplifier感測放大器(簡稱SA),由於電容可以存儲或者釋放的電荷量很小,位線上的電壓變化很難被感測到,於是就需要SA放大這種變化。

整個讀過程爲Precharge預充電-RAS行地址激活-CAS列地址激活

Precharge:首先將word line字線電壓將至0V從而關閉Nmos,由VTT供給電壓將bit line位線的電壓充電到VDD/2,描述這個過程所消耗的時鐘週期數的時序就是tRP。

RAS行地址激活:指定一行的word line字線電壓上升至VPP電壓從而開啓Nmos,Nmos開啓之後,如果電容電壓大於bit line電壓則對外放電使得bit line位線電壓略微大於VDD/2,SA感測到這個變化就會增大這個變化,讓bit line電壓上升到VDD,如果電容電壓小於VDD/2,則在SA干預下放電到0V,自此一行的cell被打開,數據被放到了bit line,等待取用,描述這個過程所消耗的時鐘週期數的時序是tRCD。

CAS列地址激活:在已經打開的行裏面,選中一個列,這個行列同時被激活的cell數據就會被送到Brust緩衝區,經過讀驅動器輸出到主板的DQ總線,最後送入CPU的內存控制器接口。

Prefetch預取

打開一行cell要經歷預充電,行地址激活非常耗時;程序有一個重要的特性即空間侷限性,當程序使用一條數據,不久它大概率也會使用臨近的數據。根據以上兩條,我們可以在CPU指定一個行列之後,把這一位地址的數據,連同它後面的數據打包一併發送給CPU,提升緩存命中率(當然這種方式肯定是有邊際效應)DDR5預取寬度爲16n,也就是說一次尋址連續發送16批數據,DDR4和DDR3爲8n,DDR2爲4n,DDR1爲2n。

Bank與顆粒位寬

bank內由多個array組成,同一個bank內的array共享行列地址。

所以假如一個bank有8個array,指定一個bank的行列地址,8個array都會收到相同的地址,並同時將數據輸出出來,所以實際輸出總數據量就是1*8bit。

另外內存顆粒的位寬與array的數量一致,16bit位寬的顆粒意味着有每個bank由16個array組成。

BankGroup與DDR5殘血顆粒

一個bankgroup通常由4個bank組成(取決於規格)

bankgroup是DDR4引入的新技術,再此之前的DDR內存沒有這個層級,一個顆粒內的bank共享資源,同一時間只能激活一個bank無法並行。DDR4將bank劃分爲不同的組,每個bankgroup擁有獨立的資源,bankgroup之間可以並行,當然同一個bankgroup內的bank之間依舊無法並行,因爲共享資源,一個bank佔用同組內的其他bank只能等。

DDR5 2GB容量8bit位寬的顆粒,擁有8個bankgroup,每個bankgroup由4個bank組成通常是我們所說的滿血顆粒

殘血顆粒常見有兩種:

第一種1GB 8bit位寬,擁有8個bankgroup但是每個bankgroup只有2個bank,bank大小不變所以容量砍半。

第二種2GB 16bit位寬,bankgroup被砍到4個,通過上個小節可知,array數量翻倍意味着bank容量翻倍,但是bankgroup數量砍半,所以容量依舊2GB,但是bankgroup還被砍了。

Chip與專用條的由來

chip即爲我們所說的內存顆粒,DDR1-5 每內存通道內DQ通道(數據通道)位寬爲64bit,所以假如8bit位寬顆粒,就需要8個。16bit位寬顆粒需要4個。

AMD或者Intel不同代數產品的內存控制器對於內存顆粒位寬的支持不一樣,比如某個時期Intel最小可支持4bit顆粒,AMD只支持8bit顆粒,那麼就會出現拿服務器4bit顆粒做成的內存條,被稱爲英特爾內存條。

Rank雙面內存條

一根內存條的位寬所能容納的內存顆粒是有限的,物理插槽的數量也是有限的,那麼如何再提升內存容量?答案就是在一根內存條再增加一個層級rank,共享64bit的位寬,雖然DQ總線同一時間只能被一個rank佔用,無法提升並行能力,但是卻實打實提升了容量。

物理上把顆粒做到兩面不一定是雙面條,也有可能是每面4個8bit顆粒。真正的雙面條是指諸如每面8個8bit顆粒這種,多rank內存條。

DIMM與雙通道

除了APU,絕大多數消費級產品只提供兩個內存通道,一個內存通道上面可以做兩個槽稱爲

2DPC,由於內存通道屬於高速信號線,並且屬於並行總線(要求理想情況下64條數據總線的數據從輸出到輸入完全同步)佈線要求極高,所以佈線水平和用料一致的情況下主板總計只有2個槽的1DPC電氣性要顯著優於4槽的2DPC,這就是爲什麼內存超頻特化板都會設計成2槽主板。

那麼2DPC該怎麼優化,主流有兩種拓撲,分別是T走線和菊花鏈,目前主流是菊花鏈,鏈接到每條通道最後一個槽,即可消除殘線干擾,增強信號完整性,但是實際上空槽和背部針腳依舊像天線一樣損耗信號。於是你可以看到設計師的各種努力,比如使用貼片引腳槽,優化觸點,1DPC主板,加厚PCB層數降低佈線壓力,調整內存位置靠近CPU等。

優化觸點

DDR4時期一個DQ通道位寬是64bit,雙通道提升性能的本質是2個通道並行,總計128bit位寬,帶寬翻倍,延遲降低。

DDR5將64bit的DQ通道拆分成兩個,每條子通道32bit,雙子通道帶寬和完整單通道沒區別,所以並沒有完整雙通道提升那麼大,不能混爲一談。

那麼爲什麼非要把DDR5拆分成32bit?僅僅是爲了降一點延遲嗎?其實和x86架構的緩存有關,內存讀寫實際上是受限於緩存,每個通道每次操作必須完整刷新緩存行,x86架構處理器緩存行大小爲64B(512bit)。

結合DDR預取,DDR5一次輸出爲64bit*16n=1024bit,超出一個緩存行大小,多餘的數據會被浪費掉,全部做無用功。那麼把64bit拆分成32bit呢?32bit*16n=512bit正好一個緩存行大小,這便是拆分的原因。

DDR6(以下爲根據LPDDR6標準推測)

我們都已經得知DDR歷經5代終於是改通道位寬了,從64bit升級到96bit,每個通道拆分成4個24bit通道,預取提升到24n。

那麼按照上面的理論24bit*24=576bit,很明顯不對齊,這是怎麼回事?這些多餘的數據是無用數據嗎?答案是這些數據中有512bit是送給緩存的,其餘64bit是ECC校驗等功能性數據。或者你可以理解爲把以前ECC校驗的專用通道都改成DQ通道,然後把ECC和DQ一起打包發給CPU了。

頻率,時間與時序

DDR內存時序指的是某個過程所佔用或者間隔的時鐘週期數,DDR的時鐘週期即爲IO時鐘週期,也就是說6400Mhz的內存,由於這個頻率是DDR特性帶來的,實際的IO頻率爲3200Mhz,一秒內有3200*1000*1000個時鐘週期,那麼每個時鐘週期是1/3200000000=3.125e-10秒,那麼tCL爲28時,tCL佔時爲3.125e-10*28s,常用計算就是tRFC計算,比如Adie極限一般在120ns,所以在6400Mhz情況下就是120ns/(1s*1000000000/3200mhz*1000000)換算一下公式就是 (等效頻率*tRFC時間)/2000,這就是這個tRFC公式或者tCL延遲公式的由來。

一些時序的說明

tRCD:前文已經說明,行打開的週期數

tRP:預充電週期數

tCL:從列地址激活到DQS導通的週期數,意味着數據已準備傳遞到DQ總線

tRTP:讀到預充電的時間,時間上是和tCL並行計數的,因爲把選中列地址和預取的數據從bit line位線寫入到burst緩衝區需要時間,期間不能執行預充電否則bit line上的數據就全完了,所以需要規定tRTP,保證tRTP計時結束之前禁止預充電。

tRAS:行打開時間,從行地址激活開始算直到行關閉。一般最佳能效是tRCD+tRTP,也就是打開行並且把列地址選中以及預取的數據都加載進burst緩衝區裏面所需要的週期數,幹完這些就可以關閉行並執行預充電了。

tRC:行激活到完成預充電的週期數,tRAS+tRP就夠了,也就是完成了行激活,數據讀取至burst,預充電。

tWR:讀到寫延遲

tREFI:刷新指令間隔週期數,因爲Nmos會漏電不可能完全不導通,所以電容裏的電荷逐漸流失,就需要執行一次讀操作類似過程重新刷新裏面的電荷保證數據不出錯,但是刷新過程中行需要打開,佔用SA所以是沒法進行讀寫的。JEDEC要求DDR4每64ms完全刷新一次,DDR5 32ms完全刷新一次。假設顆粒有8192行,那麼DDR5每行刷新間隔應該是32/8192=3906.25ns,根據上一節的時間換算,tREFI=(頻率*時間)/2000,注意頻率是等效頻率,時間單位是ns,6400Mhz內存的話按照JEDEC的標準就是6400*3906.25/2000=12500,當然JEDEC的標準是比較保守的。

tREFI越高性能越強但是對溫度耐受性越差

tRFC1/2/sb:tREFI計時完成意味着開始執行刷新,tRFC描述完成刷新指令所需要的週期數,這三個tRFC對應三種模式:

Normal只會採納tRFC1其他兩個值無效,對全部bank都執行刷新;

FGR採納tRFC2和tRFCsb,自動減半tREFI,逐步刷新1/4的bank,其他未進入刷新的部分仍可以繼續讀寫;

Mixed模式採納tRFC2和tRFCsb,在以上兩種模式實時自動切換

tRFC對顆粒的保守要求如上圖。

激進要求如下(並非絕對要求,體質好的可能能超過這些值,計算公式tRFC=等效頻率*時間/2000)

海力士Adie-120ns,Mdie-160ns

三星Bdie-260ns,Ddie-270ns

鎂光A G-260ns,B-360ns

tRRD_S:DDR4加入bankgroup催生出的時序,用來描述激活不同bankgroup的行之間的間隔,由於DDR5是16n預取也就是16筆數據,DDR可以在一個週期傳輸兩次數據,所以16筆實際上只需要消耗8個週期,所以按照8週期間隔激活不同bankgroup即可實現,bankgroup並行無縫佔用IO,實現資源利用最大化,形成如下圖的工作流。始終有數據輸出(紅色)並且不在同一個時間搶IO。

tRRD_L:描述同一個bankgroup內激活bank的行所需時間,同一個bankgroup的bank共享資源,無法並行,所以一般要比_S長,一般設置12-16之間。

tFAW:連續4次行激活的最小時間間隔,直接取tRRD_S*4

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com