我們將介紹:
DDR x4 x8 x16 chip width
DDR bank &?rank
DDR bankgroup
DDR Prefetch
DDR Page Size
DDR?Row Buffer
DDR Bank Interleaving
DDR Cell & Command Sequence
DDR x4 x8 x16
x4 x8 x16 指的上圖黑色的chip輸出的位寬,正常的DDR bus width 需要64bit,所以
chip width | x4 | x8 | x16 |
黑色chip數量 | 16 | 8 | 4 |
上圖是最常見的x8,也就有8個黑色的chip顆粒。x16的性能和x8的性能相比怎么樣呢?
更差,因為x16的bankgroup更少。
DDR4 x8 ?4 bankgroup
圖自 https://www.micron.com/-/media/client/global/documents/products/data-sheet/dram/ddr4/8gb_ddr4_sdram.pdf
DDR4 x16 ?2 bankgroup
DDR bank rank
DDR 正面就是一個rank,背面如果也有顆粒,那就又是一個rank。實物圖中的8個顆粒組成了一個rank。
其中的一個顆粒的架構圖如上面兩個圖所示,內部分成bankgroup,bankgroup內又分成bank。
我們每次發送的讀寫命令都是操作的各個顆粒里面同一個位置的bank。比如chip0的bank3,chip1的bank3,chip2的bank3…
DDR bankgroup
DDR的bankgroup可以理解為是將顆粒分成了group進行操作,也可以抽象成是把黑色顆粒chip內又獨立成了各個單獨的小顆粒,即各個bankgroup。
增加bank的數量就意味著可以增加各個bank之間pipeline操作,因此bank數量越多,吞吐率越大。
為什么有bankgroup?
解決這個問題我們先要理解prefetch。
DDR每更新一代,外面管腳pin的傳輸速度都翻倍。但是其實DDR內部真正memory的速度和latency是沒有變化的,DDR通過預取完成這個假象。
DDR3 x8的預取的本質:
x8即每個顆粒輸出8bit,DDR內部慢速的memory通過每次輸出64bit,在外部快速的pin管腳上連續輸出,即可以得到8倍頻。
如果xW W為每個顆粒的位寬,DDR memory和外部管腳的速度相差為M,那么每個顆粒預取WxN bit。
截自 1 Gig x 8的圖,右側的64即為預取的64bit。
?
DDR N | DDR | DDR2 | DDR3 | DDR4 | DDR5 |
Prefetch | 2 | 4 | 8 | 8 | 16 |
?
8倍頻的DDR3的Prefetch 8,bus width 64bit,正好對應64B。
16倍頻的DDR4如果繼續prefetch16,那么就會對應128B,與cacheline的64byte對應不上,因此DDR4采用了上文說的bankgroup,在不同的bankgroup間切換輸出,來避免連續的輸出128Byte。
32倍頻的DDR5 prefetch16,難道就不會有輸出128B的問題了嗎?
確實沒有這個問題。如果想要繼續使用bankgroup的方法,在多個bankgroup之間切換,也很難做到。因此DDR5的64bit bus切成了兩半,32bit x 16 仍然是64B。
實際上64bit額外還有ECC bit,不過我們不必理解。
DDR Page Size
DDR Page Size實際上是每次激活DDR時,輸出到row buffer中的數據大小,具體的計算方式是2^column_width * chip_width / 8 Byte.
如果DDR的column address 10 bit, 那么chip_width是4的 page size對應512B,chip_width是8的 page size對應1KB。
DDR Row Buffer
每次activation激活命令發送到DDR時,將DDR的一整行輸出到row buffer中,如上圖所示。row buffer中的一小部分當前請求的被預取的數據被輸出到外部。 如果我們下一次需要讀取另一行,那么就需要先寫回這一行,然后precharge bit line,再去打開新的一行,這樣代價還是挺大的。
所以比較理想的情況是繼續讀取當前這一行的下一個部分數據,這樣不需要寫回,可以持續的從row buffer中讀取。
圖自https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6853217
上圖中,row size即page size為2KB,本次預取chip3中的128b,如果下一次能繼續讀取后面的128b,那么只需要發送一個command命令就可以了。
我們借著這張圖回顧一下上面介紹過的內容:
每個chip位寬16bit,需要4個chip組成64bit
外部時鐘800Mhz,因為DDR double rate傳輸,所以實際上是1600Mhz,內部時鐘200Mhz,時鐘相差8倍。所以我們每次需要預取16x8=128bit.
注意看上圖中的每個chip都有一個紅色的橫條,也就是每次讀取的時候都是不同chip的同一個位置的bank被讀取。
那么為什么Chip3中的不同的bank的紅色橫條的位置不一樣?
DDR Bank Interleaving
DDR 同一個bank內不同的row之間切換需要上文說的 restore寫回和precharge。
但是不同bank之間,共享命令地址數據總線,但是內部的memory是獨立的,所以我們可以訪問bank0的第1行之后,訪問bank1的第7行,再訪問bank3的第2行,bank之間的pipeline輸出,最大程度的利用數據總線。
如下圖所示,
DDR Cell & Command Sequence
上文說的DDR需要寫回,是因為DDR是電容組成,存在泄露,除了寫回,也需要定期刷新。上圖中的Cs存儲真正的memory。為了簡單,我們將電壓理解成0/1 V.
圖自https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7446096
上一次操作結束后,會對DRAM precharge,將Cbl charge到0.5v的電位。
我們如果發起讀命令,activation操作,會激活一行,即拉高WL線,這時Cs的電位0/1 V和Cbl0.5v的電壓會發生charge sharing
Sensing階段會將電壓差經過sense amplifier 存儲這一行的數據到row buffer中
Read 命令會從row buffer中,預取對應長度的數據,輸出到外側
在sense amplifier 完成工作后,會將Vdd的電壓充至1V,即為restore,此時被破壞了的數據得到了恢復
斷開wordline,充電bitline至0.5v,即為precharge操作。
簡單的說
Activate 激活對應行 word line,數據輸出到row buffer
Read 列命令對應從row buffer中讀取數據
Precharge命令恢復bitline至一半電壓
審核編輯:湯梓紅
評論
查看更多