「博文連載」DDR掃盲——關於prefetch與Burst的深入討論

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

學習DDR有一段時間了,期間看了好多的資料(部分公司的培訓資料、幾十篇的博文,Micron的Datasheet,JESD79規範等)。但是有一個問題,想了好久(很多資料都沒有說明白),至今才算搞明白,所以寫一篇文章和大家分享一下。

如題,接下來要討論的主要是關於Prefetch和Burst相關的內容。

1、Prefetch介紹

首先,簡單介紹一下Prefetch技術。所謂prefetch,就是預加載,這是DDR時代提出的技術。在SDR中,並沒有這一技術,所以其每一個cell的存儲容量等於DQ的寬度(芯片數據IO位寬)。【關於什麼是cell(存儲單元,可以去看一下,我之前的博文:http://blog.chinaaet.com/justlxy/p/5100051913)】

進入DDR時代之後,就有了prefetch技術,DDR是兩位預取(2-bit Prefetch),有的公司則貼切的稱之為2-n Prefetch(n代表芯片位寬)。DDR2是四位預取(4-bit Prefetch),DDR3和DDR4都是八位預取(8-bit Prefetch)。而8-bit Prefetch可以使得內核時鐘是DDR時鐘的四分之一,這也是Prefetch的根本意義所在。

補充說明:芯片位寬的另一種說法是配置模式(Configuration

),在DDR3時代,一般有x4,x8,x16。

下面以DDR3為例,下圖是個簡單 一個簡單Read預取示意圖,Write可以看做是 個逆向過程。

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

當DDR3 為x8 Configuration時,一個Cell的容量為8x8bits,即8個字節。換一句話說,在指定bank、row地址和col地址之後,可以往該地址內寫入(或讀取)8 Bytes。

2、如何計算DDR3 SDRAM的容量

以Mircon的某型號DDR3 SDRAM為例:

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

以圖中紅色部分的內容作為分析案例(8個bank,x8的Configuration):

計算方式一(錯誤):

64K*8*1K*8(Row Addressing * Bank Addressing * Column Addressing * x8 Configuration)= 4Gb(512 Megx8)。

大部分材料給出的都是這種錯誤的計算方法,誤導了很多的初學者。這種計算方法咋一看好像是對的。但是,仔細推敲一下,便可以發現,按照計算方式一的邏輯,則認為每一個Cell的容量是1bit*8(x8 Configuration),即8bit。這與我們在第一部分所討論的結果(一個Cell的容量為64bits,x8 Configuration下)不符。

當然,從某種角度來說,計算方式一也是正確的,因為分離出的Column Address的位數實際上是和prefetch對應的。比如DDR3 8-bit Prefetch對3bits的Column Address,DDR2 4-bit Prefetch對應的是2bits的Column Address。只是如果直接按照計算方式一來計算的話,對於初次接觸DDR的人來說,理解起來存在一定的困難,這也是我寫這一篇博文的原因。

下面給出正確的計算方式,並說明原因。

計算方式二(正確):

64K*8*(1K/8)*8*8(Row Addressing * Bank Addressing * (Column Addressing / 8) * x8 Configuration * 8-bit Prefetch)= 4Gb(512 Megx8)。

很多人都會問,為什麼要把列地址尋址(Column Addressing)除以8呢?似乎計算方式二看起來更加不合理。接下來,我們先來回顧一下DDR3 SDRAM的結構框圖(還是以Mircon的某型號為例):

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

大圖可能看的不太清楚,下面來幾個特寫:

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

沒錯!你沒有看錯!10bit的Column Address的尋址能力只有128!!!剛好差了8倍(這就是我們在計算方式二中將Column Addressing除以8的原因)!

那麼問題又來了,為什麼Column Address的尋址能力只有128呢?莫急,請繼續看下圖:

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

在上圖中,可以清晰地發現,10bits的Column Address只有7bits用於列地址譯碼!列地址0,1,2並沒有用!!!

那麼,問題又來了!……

列地址0,1,2,這3bits被用於什麼功能了?或者是Mircon的設計者腦殘,故意浪費了這三個bits?顯然不是。

在JESD79-3規範中有如下的這個表格:

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

可以發現,Column Address的A2,A1,A0三位被用於Burst Order功能,並且A3也被用於Burst Type功能。由於一般情況,我們採用的都是順序讀寫模式(即{A2,A1,A0}={0,0,0}),所以此時的A3的取值並無直接影響。

那麼,問題又來了!……

Burst又是什麼鬼呢?且看第三部分。

3、DDR中的Burst Length

Burst Lengths,簡稱BL,指突發長度,突發是指在同一行中相鄰的存儲單元連續進行數據傳輸的方式,連續傳輸所涉及到存儲單元(列)的數量就是突發長度(SDRAM),在DDR SDRAM中指連續傳輸的週期數。上一部分講到的Burst Type和Burst Order實際上就是關於Burst Length的讀寫順序的配置。

【注:不瞭解相關名詞的可以去看一下,我之前的博文:http://blog.chinaaet.com/justlxy/p/5100051913】

在DDR3 SDRAM時代,內部配置採用了8n prefetch(預取)來實現高速讀寫.這也導致了DDR3的Burst Length一般都是8。當然也有Bursth ength為4的設置(BC4),是指另外4筆數據是不被傳輸的或者被認為無效而已。

在DDR2時代,內部配置採用的是4n prefetch,Burst length有4和8兩種,對於BL=8的讀寫操作,會出現兩次4n Prefetch的動作。

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论

上圖是JESD79-3規範中給出的DDR3 SDRAM的Command Truth Table。可以看到,讀取和寫入都有三種基本模式(Fixed BL8 or BC4,BC4 on the fly,BL8 on the fly)。這一部分的內容,在我之前的博文中有所提及,此處不再詳細介紹。

「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论「博文连载」DDR扫盲——关于prefetch与Burst的深入讨论


分享到:


相關文章: