LINUX DDR驅動知識

一、DDR原理

 

DDR 內存 既然叫做雙倍速率SDRAM(Dual date rate SDRSM),就是說是SDRAM的升級換代產品。從技術上分析,DDR SDRAM最重要的改變是在界面數據傳輸上,其在時鐘信號上升緣與下降緣時各傳輸一次數據,這使得DDR的數據傳輸速率爲傳統SDRAM的兩倍。那麼大家就應該知道了,我們所說的DDR400,DDR333,DDR266,他們的工作頻率其實僅爲那些數值的一半,也就是說DDR400工作頻率爲200MHz。

FSB與內存頻率的關係

  首先請大家看看錶一:FSB(Front Side Bus:前端總線)和內存比率與內存實際運行頻率的關係。

FSB/MEM比率

實際運行頻率

1/01

200MHz

1/02

100MHz

2/03

133MHz

3/04

150MHz

3/05

120MHz

5/06

166MHz

7/10

140MHz

9/10

180MHz

  對於大多數玩家來說,FSB和內存同步,即1:1(DFI 用1/01表示)是使性能最佳的選擇。而其他的設置都是異步的。同步後,內存的實際運行頻率是FSBx2,所以,DDR400的內存和200MHz的FSB正好同步。如果你的FSB爲240MHz,則同步後,內存的實際運行頻率爲240MHz x 2 = 480MHz。

表2更詳盡列出了FSB與不同速度的DDR內存之間正確的設置關係

  強烈建議採用1:1的FSB與內存同步的設置,這樣可以完全發揮內存帶寬的優勢。

Command Per Clock(CPC)

  可選的設置:Auto,Enable(1T),Disable(2T)。

  Command Per Clock(CPC:指令比率,也有翻譯爲: 首命令延遲 ),一般還被描述爲DRAM Command Rate、CMD Rate等。由於目前的DDR內存的尋址,先要進行P-Bank的選擇(通過DIMM上CS片選信號進行),然後纔是L-Bank/行激活與列地址的選擇。這個參數的含義就是指在P-Bank選擇完之後多少時間可以發出具體的尋址的L-Bank/行激活命令,單位是時鐘週期。

  顯然,也是越短越好。但當隨着主板上內存模組的增多,控制芯片組的負載也隨之增加,過短的命令間隔可能會影響穩定性。因此當你的內存插得很多而出現不太穩定的時間,才需要將此參數調長。目前的大部分主板都會自動設置這個參數。

  該參數的默認值爲Disable(2T),如果玩家的內存質量很好,則可以將其設置爲Enable(1T)。

CAS Latency Control(tCL)  

  可選的設置:Auto,1,1.5,2,2.5,3,3.5,4,4.5。

  一般我們在查閱內存的時序參數時,如“3-4-4-8”這一類的數字序列,上述數字序列分別對應的參數是“CL-tRCD-tRP-tRAS”。這個3就是第1個參數,即CL參數。

  CAS Latency Control(也被描述爲tCL、CL、CAS Latency Time、CAS Timing Delay),CAS latency是“ 內存讀寫操作前列地址控制器的潛伏時間  CAS控制從接受一個指令到執行指令之間的時間 。因爲CAS主要控制十六進制的地址,或者說是內存矩陣中的列地址,所以它是最爲重要的參數,在穩定的前提下應該儘可能設低。

  內存是根據行和列尋址的,當請求觸發後,最初是tRAS(Activeto Precharge Delay),預充電後,內存才真正開始初始化RAS。一旦tRAS激活後,RAS(Row Address Strobe )開始進行需要數據的尋址。首先是行地址,然後初始化tRCD,週期結束,接着通過CAS訪問所需數據的精確十六進制地址。期間從CAS開始到CAS結束就是CAS延遲。所以CAS是找到數據的最後一個步驟,也是內存參數中最重要的。

  這個參數控制內存接收到一條數據讀取指令後要等待多少個時鐘週期才實際執行該指令。同時該參數也決定了在一次內存突發傳送過程中完成第一部分傳送所需要的時鐘週期數。這個參數越小,則內存的速度越快。必須注意部分內存不能運行在較低的延遲,可能會丟失數據,因此在提醒大家把CAS延遲設爲2或2.5的同時,如果不穩定就只有進一步提高它了。而且提高延遲能使內存運行在更高的頻率,所以需要對內存超頻時,應該試着提高CAS延遲。

  該參數對內存性能的影響最大,在保證系統穩定性的前提下,CAS值越低,則會導致更快的內存讀寫操作。CL值爲2爲會獲得最佳的性能,而CL值爲3可以提高系統的穩定性。注意,WinbondBH-5/6芯片可能無法設爲3。

RAS# to CAS# Delay(tRCD)

  可選的設置:Auto,0,1,2,3,4,5,6,7。

  該值就是“3-4-4-8”內存時序參數中的第2個參數,即第1個4。RAS# to CAS# Delay(也被描述爲:tRCD、RAS to CAS Delay、Active to CMD),表示" 行尋址到列尋址延遲時間",數值越小,性能越好。對內存進行讀、寫或刷新操作時,需要在這兩種脈衝信號之間插入延遲時鐘週期。在JEDEC規範中,它是排在第二的參數,降低此延時,可以提高系統性能。建議該值設置爲3或2,但如果該值設置太低,同樣會導致系統不穩定。該值爲4時,系統將處於最穩定的狀態,而該值爲5,則太保守。

  如果你的內存的超頻性能不佳,則可將此值設爲內存的默認值或嘗試提高tRCD值。

Min RAS# Active Timing(tRAS)

  可選的設置:Auto,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15。

  該值就是該值就是“3-4-4-8”內存時序參數中的最後一個參數,即8。Min RAS# Active Time (也被描述爲:tRAS、Active to Precharge Delay、Row Active Time、Precharge Wait State、Row Active Delay、Row Precharge Delay、RAS Active Time),表示“ 內存行有效至預充電的最短週期 ,調整這個參數需要結合具體情況而定,一般我們最好設在5-10之間。這個參數要根據實際情況而定,並不是說越大或越小就越好。

  如果tRAS的週期太長,系統會因爲無謂的等待而降低性能。降低tRAS週期,則會導致已被激活的行地址會更早的進入非激活狀態。如果tRAS的週期太短,則可能因缺乏足夠的時間而無法完成數據的突發傳輸,這樣會引發丟失數據或損壞數據。該值一般設定爲CAS latency + tRCD + 2個時鐘週期。如果你的CAS latency的值爲2,tRCD的值爲3,則最佳的tRAS值應該設置爲7個時鐘週期。爲提高系統性能,應儘可能降低tRAS的值,但如果發生內存錯誤或系統死機,則應該增大tRAS的值。

  如果使用DFI的主板,則tRAS值建議使用00,或者5-10之間的值。

Row Precharge Timing(tRP)

  可選的設置:Auto,0,1,2,3,4,5,6,7。

  該值就是“3-4-4-8”內存時序參數中的第3個參數,即第2個4。Row Precharge Timing (也被描述爲:tRP、RAS Precharge、Precharge to active),表示 " 內存行地址控制器預充電時間 ",預充電參數越小則內存讀寫速度就越快。

  tRP用來設定在另一行能被激活之前,RAS需要的充電時間。tRP參數設置太長會導致所有的行激活延遲過長,設爲2可以減少預充電時間,從而更快地激活下一行。然而,想要把tRP設爲2對大多數內存都是個很高的要求,可能會造成行激活之前的數據丟失,內存控制器不能順利地完成讀寫操作。對於桌面計算機來說,推薦預充電參數的值設定爲2個時鐘週期,這是最佳的設置。如果比此值低,則會因爲每次激活相鄰緊接着的bank將需要1個時鐘週期,這將影響DDR內存的讀寫性能,從而降低性能。只有在tRP值爲2而出現系統不穩定的情況下,將此值設定爲3個時鐘週期。

  如果使用DFI的主板,則tRP值建議2-5之間的值。值爲2將獲取最高的性能,該值爲4將在超頻時獲取最佳的穩定性,同樣的而該值爲5,則太保守。大部分內存都無法使用2的值,需要超頻纔可以達到該參數。

Row Cycle Time(tRC)  

  可選的設置:Auto,7-22,步幅值1。

  Row Cycle Time(tRC、RC),表示“ SDRAM行週期時間 ,它是 包括行單元預充電到激活在內的整個過程所需要的最小的時鐘週期數 

  其計算公式是:

row cycle time (tRC) = minimum row active time(tRAS) + row precharge time(tRP)

因此,設置該參數之前,你應該明白你的tRAS值和tRP值是多少。如果tRC的時間過長,會因在完成整個時鐘週期後激活新的地址而等待無謂的延時,而降低性能。然後一旦該值設置過小,在被激活的行單元被充分充電之前,新的週期就可以被初始化。

  在這種情況下,仍會導致數據丟失和損壞。因此,最好根據tRC = tRAS + tRP進行設置,如果你的內存模塊的tRAS值是7個時鐘週期,而tRP的值爲4個時鐘週期,則理想的tRC的值應當設置爲11個時鐘週期。

Row Refresh Cycle Time(tRFC)

  可選的設置:Auto,9-24,步幅值1。

  Row Refresh Cycle Time(tRFC、RFC),表示  SDRAM行刷新週期時間 ,它是行單元刷新所需要的時鐘週期數。該值也表示向相同的bank中的另一個行單元兩次發送刷新指令(即:REF指令)之間的時間間隔。tRFC值越小越好,它比tRC的值要稍高一些。

  如果使用DFI的主板,通常tRFC的值不能達到9,而10爲最佳設置,17-19是內存超頻建議值。建議從17開始依次遞減來測試該值。大多數穩定值爲tRC加上2-4個時鐘週期。

Row to Row Delay(RAS to RAS delay)(tRRD)

  可選的設置:Auto, 0-7,每級以1的步幅遞增。

  Row to Row Delay,也被稱爲RAS to RAS delay (tRRD),表示" 行單元到行單元的延時 "。該值也表示向相同的bank中的同一個行單元兩次發送激活指令(即:REF指令)之間的時間間隔。tRRD值越小越好。

  延遲越低,表示下一個bank能更快地被激活,進行讀寫操作。然而,由於需要一定量的數據,太短的延遲會引起連續數據膨脹。於桌面計算機來說,推薦tRRD值設定爲2個時鐘週期,這是最佳的設置,此時的數據膨脹可以忽視。如果比此值低,則會因爲每次激活相鄰緊接着的bank將需要1個時鐘週期,這將影響DDR內存的讀寫性能,從而降低性能。只有在tRRD值爲2而出現系統不穩定的情況下,將此值設定爲3個時鐘週期。

  如果使用DFI的主板,則tRRD值爲00是最佳性能參數,4超頻內存時能達到最高的頻率。通常2是最合適的值,00看上去很奇怪,但有人也能穩定運行在00-260MHz。

Write Recovery Time(tWR)

   可選的設置:Auto,2,3。

  Write Recovery Time (tWD),表示“ 寫恢復延時 。該值說明在一個激活的bank中完成有效的寫操作及預充電前,必須等待多少個時鐘週期。這段必須的時鐘週期用來確保在預充電發生前,寫緩衝中的數據可以被寫進內存單元中。同樣的,過低的tWD雖然提高了系統性能,但可能導致數據還未被正確寫入到內存單元中,就發生了預充電操作,會導致數據的丟失及損壞。

  如果你使用的是DDR200和266的內存,建議將tWR值設爲2;如果使用DDR333或DDR400,則將tWD值設爲3。如果使用DFI的主板,則tWR值建議爲2。

Write to Read Delay(tWTR)

  可選的設置:Auto,1,2。

  Write to Read Delay (tWTR),表示“ 讀到寫延時 。三星公司稱其爲“TCDLR (last data in to read command)”,即最後的數據進入讀指令。它設定向DDR內存模塊中的同一個單元中,在最後一次有效的寫操作和下一次讀操作之間必須等待的時鐘週期。

  tWTR值爲2在高時鐘頻率的情況下,降低了讀性能,但提高了系統穩定性。這種情況下,也使得內存芯片運行於高速度下。換句話說,增加tWTR值,可以讓內容模塊運行於比其默認速度更快的速度下。如果使用DDR266或DDR333,則將tWTR值設爲1;如果使用DDR400,則也可試着將tWTR的值設爲1,如果系統不穩定,則改爲2。

Refresh Period(tREF)

  可選的設置:Auto, 0032-4708,其步進值非固定。

  Refresh Period (tREF),表示“ 刷新週期  它指內存模塊的刷新週期 

  先請看不同的參數在相同的內存下所對應的刷新週期(單位:微秒,即:一百萬分之一秒)。?號在這裏表示該刷新週期尚無對應的準確數據。

  1552= 100mhz(?.??s)

  2064= 133mhz(?.??s)

  2592= 166mhz(?.??s)

  3120= 200mhz(?.??s) 

  ---------------------

  3632= 100mhz(?.??s)

  4128= 133mhz(?.??s)

  4672= 166mhz(?.??s)

  0064= 200mhz(?.??s)

  ---------------------

  0776= 100mhz(?.??s)

  1032= 133mhz(?.??s)

  1296= 166mhz(?.??s)

  1560= 200mhz(?.??s)

  ---------------------

  1816= 100mhz(?.??s)

  2064= 133mhz(?.??s)

  2336= 166mhz(?.??s)

  0032= 200mhz(?.??s)

  ---------------------

  0388= 100mhz(15.6us)

  0516= 133mhz(15.6us)

  0648= 166mhz(15.6us)

  0780= 200mhz(15.6us)

  ---------------------

  0908= 100mhz(7.8us)

  1032= 133mhz(7.8us)

  1168= 166mhz(7.8us)

  0016= 200mhz(7.8us)

  ---------------------

  1536= 100mhz(3.9us)

  2048= 133mhz(3.9us)

  2560= 166mhz(3.9us)

  3072= 200mhz(3.9us)

  ---------------------

  3684= 100mhz(1.95us)

  4196= 133mhz(1.95us)

  4708= 166mhz(1.95us)

  0128= 200mhz(1.95us)

  如果採用Auto選項,主板BIOS將會查詢內存上的一個很小的、名爲“SPD”(Serial Presence Detect )的芯片。SPD存儲了內存條的各種相關工作參數等信息,系統會自動根據SPD中的數據中最保守的設置來確定內存的運行參數。如過要追求最優的性能,則需手動設置刷新週期的參數。一般說來,15.6us適用於基於128兆位內存芯片的內存(即單顆容量爲16MB的內存),而7.8us適用於基於256兆位內存芯片的內存(即單顆容量爲32MB的內存)。注意,如果tREF刷新週期設置不當,將會導致內存單元丟失其數據。

  另外根據其他的資料顯示,內存存儲每一個bit,都需要定期的刷新來充電。不及時充電會導致數據的丟失。DRAM實際上就是電容器,最小的存儲單位是bit。陣列中的每個bit都能被隨機地訪問。但如果不充電,數據只能保存很短的時間。因此我們必須每隔15.6us就刷新一行。每次刷新時數據就被重寫一次。正是這個原因DRAM也被稱爲非永久性存儲器。一般通過同步的RAS-only的刷新方法(行刷新),每行每行的依次刷新。早期的EDO內存每刷新一行耗費15.6us的時間。因此一個2Kb的內存每列的刷新時間爲15.6?s x2048行=32ms。

  如果使用DFI的主板,tREF和tRAS一樣,不是一個精確的數值。通常15.6us和3.9us都能穩定運行,1.95us會降低內存帶寬。很多玩家發現,如果內存質量優良,當tREF刷新週期設置爲3120=200mhz(?.??s)時,會得到最佳的性能/穩定性比。

Write CAS# Latency(tWCL)  

  可選的設置:Auto,1-8

  Write CAS Latency (tWCL),表示“ 寫指令到行地址控制器延時 。SDRAM內存是隨機訪問的,這意味着內存控制器可以把數據寫入任意的物理地址,大多數情況下,數據通常寫入距離當前列地址最近的頁面。tWCL表示寫入的延遲,除了DDRII,一般可以設爲1T,這個參數和大家熟悉的tCL(CAS-Latency)是相對的,tCL表示讀的延遲。

DRAM Bank Interleave

  可選的設置:Enable, Disable

  DRAM Bank Interleave,表示“ DRAM Bank交錯 。這個設置用來控制是否啓用內存交錯式(interleave)模式。Interleave模式允許內存bank改變刷新和訪問週期。一個bank在刷新的同時另一個bank可能正在訪問。最近的實驗表明,由於所有的內存bank的刷新週期都是交叉排列的,這樣會產生一種流水線效應。

  雖然interleave模式只有在不同bank提出連續的的尋址請求時纔會起作用,如果處於同一bank,數據處理時和不開啓interleave一樣。CPU必須等待第一個數據處理結束和內存bank的刷新,這樣才能發送另一個地址。目前所有的內存都支持interleave模式,在可能的情況下我們建議打開此項功能。

  對於DFI主板來說,任何情況下該設置都應該是Enable,可以增大內存的帶寬。Disable對將減少內存的帶寬,但使系統更加穩定。

DQS Skew Control

  可選的設置:Auto,Increase Skew,Decrease Skew

  DQS Skew Control,表示“ DQS時間差控制 。穩定的電壓可以使內存達到更高的頻率,電壓浮動會引起較大的時間差(skew),加強控制力可以減少skew,但相應的DQS(數據控制信號)上升和下降的邊緣會出現電壓過高或過低。一個額外的問題是高頻信號會引起追蹤延遲。DDR內存的解決方法是通過簡單數據選通脈衝來增加時鐘推進。

  DDRII引進了更先進的技術:雙向的微分I/O緩存器來組成DQS。微分表示用一個簡單脈衝信號和一個參考點來測量信號,而並非信號之間相互比較。理論上提升和下降信號應該是完全對成的,但事實並非如此。時鐘和數據的失諧就產生了DQ-DQS skew。

  如下圖所示。

  對於DFI主板來說,建議設置爲Increase Skew可以提升性能,而Decrease Skew在犧牲一定性能的情況下,可以增加穩定性。

DQS Skew Value

  可選的設置:Auto,0-255,步進值爲1。

  當我們開啓了DQS skew control後,該選項用來設定增加或減少的數值。這個參數對系統的影響並不很敏感。 對於DFI主板來說,開啓"Increase Skew"選項後,可以將該值設爲50-255之間的值。值越大,表示速度越快。

DRAM Drive Strength

  可選的設置:Auto,1-8,步進值爲1。

  DRAM Drive Strength(也被稱爲:driving strength),表示“ DRAM驅動強度 。這個參數用來控制內存數據總線的信號強度,數值越高代表信號強度越高,增加信號強度可以提高超頻的穩定性。但是並非信號強度高就一定好,三星的TCCD內存芯片在低強度信號下性能更佳。

  如果設爲Auto,系統通常會設定爲一個較低的值。對使用TCCD的芯片而言,表現會好一些。但是其他的內存芯片就並非如此了,根據在DFI NF4主板上調試和測試的結果,1、3、5 、7都是性能較弱的參數,其中1是最弱的。2、4、6、8是正常的設置,8提供了最強的信號強度。TCCD建議參數爲3、5或7,其他芯片的內存建議設爲6或8。

  DFI用戶建議設置:TCCD建議參數爲3、5、7,其他芯片的內存建議設爲6或8。

DRAM Data Drive Strength

  可選的設置:Auto,1-4,步進值爲1。

  DRAM Data Drive Strength表示“ DRAM數據驅動強 度”。這個參數決定內存數據總線的信號強度,數值越高代表信號強度越高。它主要用於處理高負荷的內存讀取時,增加DRAM的駕馭能力。因此,如果你的系統內存的讀取負荷很高,則應將該值設置爲高(Hi/High)。它有助於對內存數據總線超頻。但如果你並沒有超頻,提升內存數據線的信號強度,可以提高超頻後速度的穩定性。此外,提升內存數據總線的信號強度並不能增強SDRAM DIMM的性能。因此,除非你內存有很高的讀取負荷或試圖超頻DIMM,建議設置DRAM Data Drive Strength的值爲低(Lo/Low)。

  要處理大負荷的數據流時,需要提高內存的駕馭能力,你可以設爲Hi或者High。超頻時,調高此項參數可以提高穩定性。此外,這個參數對內存性能幾乎沒什麼影響。所以,除非超頻,一般用戶建議設爲Lo/Low。

   DFI用戶建議設置:普通用戶建議使用level 1或3,如果開啓了CPC,可能任何高於1的參數都會不穩定。部分用戶開啓CPC後能運行在3。更多的人關閉CPC後2-4都能夠穩定運行。當然最理想的參數是開啓CPC後設爲level4。

Strength Max Async Latency

  可選的設置:Auto,0-15,步進值爲1。

  Strength Max Async Latency目前還沒能找到任何關於此項參數的說明,不知道其功能。感覺網友的經驗,在進行Everest的LatencyTest時,可以看出一些差別。在我的BH-6上,參數從8ns到7ns在Latency Test的測試結果中有1ns的區別。從7ns調低6ns後,測試結果又減少了2ns。

  DFI主板建議設置:BIOS中的默認值爲7ns,建議大家在5-10之間調節。6ns對內存的要求就比較高了,建議使用BH-5和UTT芯片的用戶可以嘗試一下,但對TCCD不適用。7ns的要求低一些,UTT和BH-5設爲7n比較適合超頻。8ns對UTT和BH-5就是小菜一碟,8ns時TCCD通常能穩定運行在DDR600,如果想超頻到DDR640就必須設爲9ns甚至更高了。

Read Preamble Time

  可選的設置:Auto,2.0-9.5,步進值爲0.5。

  Read Preamble Time這個參數表示DQS(數據控制信號)返回後,DQS又被開啓時的時間間隔。Samsung早期的顯存資料顯示,這個參數是用以提升性能的。DQS信號是雙向的,無論從圖形控制器到DDR SGRAM還是從DDR SGRAM到圖形控制器都起作用。

  DFI主板建議設置:BIOS中的該值設置爲Auto時,實際上此時執行的是默認值5.0。建議大家在4.0-7.0之間調節,該值越小越好。

Idle Cycle Limit

  可選的設置:Auto,0-256,無固定步進值。

  Idle Cycle Limit這個參數表示“ 空閒週期限制” 。這個參數指定強制關閉一個也打開的內存頁面之前的memclock數值,也就是讀取一個內存頁面之前,強制對該頁面進行重充電操作所允許的最大時間。

  DFI主板建議設置:BIOS中的該值設置爲Auto時,實際上此時執行的是默認值256。質量好的內存可以嘗試16-32,華邦(WINBOND)BH-5顆粒的產品能穩定運行在16。Idle Cycle Limit值越低越好。

Dynamic Counter

  可選的設置:Auto, Enable, Disable。

  Dynamic Counter這個參數表示“ 動態計數器 。這個參數指定開啓還是關閉動態空閒週期計數器。如果選擇開啓(Enable),則會每次進入內存頁表(Page Table)就強制根據頁面衝突和頁面錯誤(conflict/page miss:PC/PM)之間通信量的比率而動態調整Idle Cycle Limit的值。這個參數和前一個Idle Cycle Limit是密切相關的,啓用後會屏蔽掉當前的Idle Cycle Limit,並且根據衝突的發生來動態調節。

  DFI主板建議設置:BIOS中的該值設置爲Auto和關閉和一樣的。打開該設置可能會提升性能,而關閉該設置,可以使系統的更穩定。

R/W Queue Bypass

  可選的設置:Auto,2x,4x,8x,16x。

  R/W Queue Bypass表示“ 讀/寫隊列忽略 。這個參數指定在優化器被重寫及DCI (設備控制接口:Device Control Interface)最後一次的操作被選定前,忽略操作DCI的讀/寫隊列的時間。這個參數和前一個Idle Cycle Limit是相類似,只是優化器影響內存中的讀/寫隊列。

  DFI主板建議設置:BIOS中的該值默認爲16x。如果你的系統穩定,則保留該值。但如果不穩定,或者要超頻,就只有降低到8x甚至更低的4x或2x。該值越大,則說明系統性能越強,該值越小,則會是系統越穩定。

Bypass Max

  可選的設置:Auto, 0x-7x, 步進值爲1。

  Bypass Max表示“ 最大忽略時間 。這個參數表示優化器選擇否決之前,最後進入DCQ(Dependence Chain Queue)的可以被優化器忽略的時間。仔細研究後,我覺得這個參數會影響內存到CPU內存控制器的連接。

  DFI主板建議設置:BIOS中的該值默認爲7x。建議4x或7x,兩者都提供了很好的性能及穩定性。如果你的系統穩定,則保留該值。但如果不穩定,或者要超頻,就只有降低到8x甚至更低的4x或2x。該值越大,則說明系統性能越強,該值越小,則會是系統越穩定。

32 Byte Granulation

  可選的設置:Auto,Disable (8burst),Enable(4burst)。

  32 Byte Granulation表示" 32位顆粒化 "。當該參數設置爲關閉(Disable)時,就可以選擇突發計數器,並在32位的數據存取的情況下,最優化數據總線帶寬。因此該參數關閉後可以達到最佳性能的目的。

  DFI主板建議設置:絕大多數情況下,建議選擇Disable(8burst)選項。開啓Enable (4burst)可以使系統更穩定一些。

第三部分 超強的內存芯片

  上述參數的設置不可能適用於每位用戶。不同的內存芯片的電壓、參數都不同,所以超頻能力也不一樣。下面給出超頻能力很強的一些內存芯片,建議大家在選購時多加以留意。

·Winbond(華邦)系列顆粒::BH-5、CH-5、BH-6、CH-6 、UTT;

·Hynix(現代)系列顆粒:D43、D5;

·Micron(鎂光)系列顆粒:-5B C、-5B G;

·Infineon(英飛凌)系列顆粒:B5、BT-6、BT-5、CE-5、BE-5;

·Samsung(三星)系列顆粒:TCB3、TCCC、TCC4、TCC5、TCCD。

 

二:DDR操作

 

1 相關原理

DDR3內部相當於存儲表格,和表格的檢索相似,需要先指定

行地址(row),再指定列地址(column),這樣就可以準確的找到需要的單元格。對於DDR3內存,單元格稱爲基本存儲單元(也就是每次能從該DDR3芯片讀取的最小數據),存儲表格稱爲邏輯bank(DDR3內存芯片都是8bank,也就是說有8個這樣的存儲表格)

所以尋址的流程是先指定bank地址,再指定行地址(row),最後指列地址(column)來確定基本存儲單元,每個基本存儲單元的大小等於該DDR3芯片的數據線位寬,也就是每次能從單個DDR3芯片讀取的最小數據長度

2 地址線和內存容量分析

由上文可知要尋址DDR3芯片的基本存儲單元需要指定3個地址:

bank地址,行地址(row),列地址(column)

下面以三星MT41J1G4MT41J512M8MT41J256M16進行分析

MT41J1G4 128 Meg x 4 x 8 banks

MT41J512M8 64 Meg x 8 x 8 banks

MT41J256M16 32 Meg x 16 x 8 banks

三個型號的容量都是一樣,僅僅只是數據線位寬不一樣,從上述擴展命名可以分析DDR3芯片的地址線數量,數據線位寬,整體容量

比如:

MT41J256M16 - 32 Meg x 16 x 8 banks

單個DDR3芯片內部有8banks因此有3bank地址線BA0,BA1,BA2

每個bank大小是32M*16 bit = 64MB

16根數據線即基本存儲單元是16bit

每個bank32M個基本存儲單元,總共有32M*8=256M個地址

datasheet分析有15bit row地址和10bit column地址。但是芯片只提供了15根地址線,不夠25根。

其實原因是行地址線RA0-RA14和列地址線CA0-CA9地址線分時共用(反正是先取行地址再取列地址)所以只需要15根地址線就可以

每個bank總共有2^15 * 2^10 = 32M個基本存儲單元

然後每個基本單元的大小是16bit所以總大小是32M*16bit*8 = 4Gbit

MT41J512M8 64 Meg x 8 x 8 banks 

單個DDR3芯片內部有8banks因此有3bank地址線BA0,BA1,BA2

每個bank大小是64M*8bit = 64MB

8根數據線即基本存儲單元是8bit

每個bank64M個基本存儲單元,總共有64M*8=512M個地址

datasheet分析有16bit row地址和10bit column地址。但是芯片只提供了16根地址線,不夠26根。

原因也是行地址線RA0-RA15和列地址線CA0-CA9地址線分時共用

所以只需要16根地址線就可以

每個bank總共有2^16* 2^10 = 64M個基本存儲單元

然後每個基本單元的大小是8bit所以總大小是64M * 8bit*8 = 4Gbit

MT41J1G4 128 Meg x 4 x 8 banks

單個DDR3芯片內部有8banks

每個bank大小是128M* 4bit = 64MB

4根數據線即基本存儲單元是4bit

每個bank128M個基本存儲單元,總共是128M*8=1G個的地址

datasheet分析有16bit row地址和11bit column地址

由於行地址線RA0-RA15和列地址線CA0-CA9CA11地址線分時共用

所以只需要16根地址線就可以

每個bank總共有2^16* 2^11 = 128M個基本存儲單元

然後每個基本單元的大小是4bit所以總大小是128M *4bit*8 = 4Gbit

 

注意DDR3芯片的PAGESIZE = 2^column * 數據線位寬/8

由此可知

MT41J1G4 128 Meg x 4 x 8 banks

PAGESIZE = 2^11 * 4/8 = 1KB

MT41J512M8 64 Meg x 8 x 8 banks

PAGESIZE = 2^10 * 8/8 = 1KB

MT41J256M16 32 Meg x 16 x 8 banks

PAGESIZE = 2^10 * 16/8 = 2KB

 

 

3  DDR3控制器16bit/32bit概念

這兒所說的16bit/32bit指的是整個內存控制器以多長爲單位進行存儲,而不是單個DDR3芯片的基本存儲單元

32bit表示內存控制器以32bit爲單位訪問內存,即給定一個內存地址。內存芯片會給內存控制器 32bit的數據到數據線上,當然該32bit數據可能不來自同一個DDR3芯片上,16bit與此類似

下面分析用兩個16bitDDR3內存如何拼成32bitDDR3

第一片16bit DDR3BA0,BA1,BA2連接CPUBA0, BA1, BA2
第二片16bit DDR3 BA0,BA1,BA2連接CPU BA0, BA1, BA2
第一片16bit DDR3A0~A13連接CPUA0~A13
第二片16bit DDR3A0~A13連接CPUA0~A13
第一片16bit DDR3D0~D15連接CPUD0~D15
第二片16bit DDR3D0~D15連接CPUD16~D31

分析下該實例。
bank地址線是3bit所以單個16bit DDR3內部有8bank.
行地址(row)A0~A1314bit說明每個bank2^14
列地址(column)A0~A910bit說明每個bank2^10

每個bank大小是2^14 * 2^10 * 16 = 16M * 16bit = 32MB

每個bank16M個基本存儲單元,總共有16M*8=128M個地址

單個芯片總大小是 32MB * 8 = 256MB      



從前面的連線可知兩塊16bit DDR3BA0~BA2D0~D14是並行連接到內存控制器,所以內存控制器認爲只有一塊內存,訪問的時候按照BA0~BA2A0~A13給出地址。兩塊16bit DDR3都收到了該地址,給出的反應是要麼將給定地址上的2個字節讀到數據線上,要麼是將數據線上的兩個字節寫入到指定的地址。

此時內存控制認爲自己成功的訪問的了一塊32bit的內存,

所以內存控制器每給出一個地址,將訪問4個字節的數據,讀取/寫入。這4字節數據對應到內存控制器的D0~D31,又分別被連接到兩片DDR3芯片的D0~D15,這樣32bit就被拆成了兩個16bit分別去訪問單個DDR3芯片的基本存儲單元。

注意:儘管DDR3芯片識別的地址只有128M個,但由於內存控制器每訪問一個內存地址,將訪問4個字節數據,所以對於內存控制器來說,能訪問的內存大小仍是512M,只不過在內存控制器將地址傳給DDR3芯片時,低兩位被忽略,也就是說DDR3芯片識別的地址只有128M個。
比如內存控制器訪問地址0x000000000x000000010x000000020x00000003,但對DDR3來說,都是訪問地址0x00000000

4 內存映射的概念

上文中的內存尋址主要講的是內存控制器如何去訪問DDR3芯片基本存儲單元

 

本文中的內存映射主要講的是如何將內存控制器管理的DDR3芯片地址空間映射到SOC芯片爲DDR3預留的地址範圍。比如基於ARMSOC芯片,DDR3的預留地址一般都是0x80000000,如果沒有使用內存映射,SOC去訪問0x80000000地址時會造成整個系統崩潰,因爲訪問的地址並不存在實際的內存

 

DDR3控制器有兩種映射模式:非交織映射和交織映射(interlave).

交織映射,即雙通道內存技術,當訪問在控制器A上進行時,控制器B爲下一次訪問做準備,數據訪問在兩個控制器上交替進行,從而提高DDR吞吐率。支持128byte,256byte,512byte的交織模式。如果要使用交織模式,要保證有兩個內存控制器以及兩個內存控制器有對稱的物理內存(即兩塊內存大小一致;在各自的控制器上的地址映射一致)

非交織映射,即兩個內存控制器的內存映射在各自的映射範圍內線性遞增。對於只存在1個內存控制器或者只使用1個內存控制器時則只能使用非交織的線性映射模式。

5 內存映射具體介紹

下面以DM385DM8168來介紹內存映射

DM3851DDR控制器EMIF0支持JEDEC標準的DDR2,DDR3芯片.

當然DM385只能使用非交織映射模式

數據總線支持16bit32bit.

DM3854個內存映射寄存器,所以最多可以映射4段地址空間

DMM_LISA_MAP__0, DMM_LISA_MAP__1,

DMM_LISA_MAP__2, DMM_LISA_MAP__3

下圖是該寄存器的具體介紹

SYS_ADDR:  映射到SOC系統上的物理地址,

比如需要映射到0x8000000SYS_ADDR = 80

SYS_SIZE:   映射的內存大小,講的是主要給系統映射了多大的內存

SDRC_INTL: 是否使用交織模式,以及使用何種交織模式映射

SDRC_MAP: 交織映射則爲3,否則爲1或者2

SDRC_ADDR:內存控制器的高位地址即沒有映射前他的內存地址

           一般都是從0x00000000開始

下面是我們DM385板卡的內存映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80400100

#define DDR3_DMM_LISA_MAP__4  0xB0400110

使用了兩個映射寄存器,所以主要映射了兩段地址空間

           

從上圖可以看出來

第一段映射是將EMIF00x00000000映射到SOC系統地址0x8000000上,映射長度爲256MB

第二段映射是將EMIF00x10000000映射到SOC系統地址0xB000000上,映射長度爲256MB

下圖是訪問模式,線性訪問物理地址

 

由於DM385只有一個內存控制器EMIF0所以只能非交織映射

當然對於上述映射方式可以變爲如下映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x00

#define DDR3_DMM_LISA_MAP__4  0x80500100

EMIF00x00000000映射到SOC系統地址0x80000000,映射長度是512MB

 

6 DM8168內存映射

2DDR控制器EMIF0EMIF1,支持JEDEC標準的DDR2,DDR3芯片

DM8168支持非交織模式映射和交織模式映射

數據總線支持16bit32bit.

DM81684個內存映射寄存器,所以最多可以映射4段地址空間

下面是我們DM8168板卡的內存映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80640300

#define DDR3_DMM_LISA_MAP__4  0xC0640320

使用了兩個映射寄存器,所以主要映射了兩段地址空間

    

從上圖可知

第一段映射是將EMIF0EMIF10x0000000交織映射到SOC系統的0x80000000,對於系統來說了總共映射了1GB的大小,從EMIF0映射了512MB,EMIF1映射了512MB

第二段映射是將EMIF0EMIF10x2000000交織映射到SOC系統的0xC0000000,對於系統來說了總共映射了1GB的大小,從EMIF0映射了512MB,EMIF1映射了512MB

下圖是訪問模式,交織訪問物理地址,128字節交替映射,在交織訪問模式下,系統送出的物理地址在兩個內存控制器上交替訪問

當然也可以使用如下非交織映射

 

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80600100

#define DDR3_DMM_LISA_MAP__4  0xC0600200

EMIF00x00000000映射到SOC系統地址0x80000000,映射長度是1GB

EMIF10x00000000映射到SOC系統地址0xC0000000,映射長度是1GB

使用下圖的線性訪問模式

 

7 DDR3引腳描述

4bit8bit位寬芯片一般採用78FBGA封裝

16bit位寬芯片一般採用96FBGA封裝

下列信號方向都是針對DDR3芯片來說的

A0-A9,A10/AP,A11,A12/BC#,A13,A14    input

地址輸入信號,行地址線和列地址線分時使用

A10/AP 表示PRECHARGE命令期間對某個bank預充電auto-precharge

A10爲低則有BA[0,2]來決定哪個bank進行auto-prechargeA10爲高電平表示對所有bank進行auto-precharge

 

BA0,BA1,BA2                       input

bank地址輸入信號,三個bank地址線表明該DDR3內部有8bank

LOAD MODE命令期間定義DDR3芯片使用哪個模式(MR0,MR1,MR2)

 

CK,CK#                            input

差分時鐘輸入,所有控制和地址輸入信號在CK上升沿和CK#的下降沿交叉處被採樣,輸出數據選通(DQS,DQS#)參考CKCK#的交叉點

 

CKE                               input

時鐘使能信號,高電平有效,CKE爲低電平時提供PRECHARGE POWN-DOWNSELF REFRESH操作(對所有bank裏行有效)

CS#                               input

片選使能信號當CS#爲高的時候,所有的命令被屏蔽,CS#提供了多RANK系統的RANK選擇功能,CS#是命令代碼的一部分

 

DM(mask)                           input

數據輸入屏蔽,每8bit數據對應一個DM信號,在寫期間,當伴隨輸入數據的DM信號被採樣爲高的時候,這8bit的輸入數據視爲無效。

DM信號相當於就是掩碼控制位,該信號在讀操作時沒有用:比如在讀32bit數據,但只需要8bit數據,在軟件裏將高24bit0就行,有沒有DM信號都關係不大,但執行寫操作時,如果沒有DM信號,可能程序只需要寫8bit數據,但是物理連接是32bitDDR3,只要WR信號有效,32bit數據就全部寫到DDR3裏邊去了,高24bit數據就被覆蓋了,有了DM信號它對應的8bit數據就會被忽略,這樣就不會覆蓋其他數據了

對於4bit位寬DDR3,兩個芯片共用一個DM信號,對於8bit位寬DDR3芯片一個芯片佔用一個DM信號,對於16bit位寬DDR3芯片則需要2DM信號

雖然DM僅作爲輸入腳,但是,DM負載被設計成與DQDQS腳負載相匹配。DM的參考是VREFCADM可選作爲TDQS

 

ODT                                 input

片上終端使能。ODT使能(高)和禁止(低)片內終端電阻。在正常操作使能的時候,ODT僅對下面的管腳有效:DQ[15:0],DQS,DQS#DM。如果通過LOAD MODE命令禁止,ODT輸入被忽略

 

RAS#,CAS#,WE#                        input

命令輸入,這三個信號,連同CS#用來定義一個命令

 

RESET#                               input

復位,低有效,參考是VSS

 

DQ0-DQ7/ DQ0-DQ15                   I/O

數據輸入/輸出。雙向數據

 

DQS,DQS#                             I/O

數據選通。讀時是輸出,邊緣與讀出的數據對齊。寫時是輸入,中心與寫數據對齊。

DQSDDR中的重要功能,它的功能主要用來在一個時鐘週期內準確的區分出每個傳輸週期,並便於接收方準確接收數據。每8bit數據都有一個DQS信號線,它是雙向的,在寫入時它用來傳送由內存控制器發來的DQS信號,讀取時,則由芯片生成DQS向內存控制器發送。完全可以說,它就是數據的同步信號。 

在讀取時,DQS與數據信號同時生成(也是在CKCK#的交叉點)。而DDR內存中的CL也就是從CAS發出到DQS生成的間隔,DQS生成時,芯片內部的預取已經完畢了,由於預取的原因,實際的數據傳出可能會提前於DQS發生(數據提前於DQS傳出)。

DQS在讀取時與數據同步傳輸

而在接收方,一切必須保證同步接收,不能有偏差。這樣在寫入時,芯片不再自己生成DQS,而以發送方傳來的DQS爲基準,並相應延後一定的時間,在DQS的中部爲數據週期的選取分割點(在讀取時分割點就是上下沿),從這裏分隔開兩個傳輸週期。這樣做的好處是,由於各數據信號都會有一個邏輯電平保持週期,即使發送時不同步,在DQS上下沿時都處於保持週期中,此時數據接收觸發的準確性無疑是最高的。 

 

TDQS,TDQS#                           output

終端數據選通。當TDQS使能時,DM禁止,TDQSTDDS提供終端電阻。

VDD

電源電壓,1.5V+/-0.075V

VDDQ

DQ電源,1.5V+/-0.075V。爲了降低噪聲,在芯片上進行了隔離

VREFCA

數據的參考電壓。VREFDQ在所有時刻(除了自刷新)都必須保持規定的電壓

VSS

VSSQ

DQ地,爲了降低噪聲,在芯片上進行了隔離

ZQ

輸出驅動校準的外部參考。這個腳應該連接240ohm電阻到VSSQ

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章