SDRAM(Synchronous dynamic random access memory),同步動態隨機訪問內存,通常包括 SDR (Single Data Rate) SDRAMs以及DDR (Double Data Rate) SDRAMs.在顯卡中常用的是GDDR SDRAMs以及HBM。
如圖一所示,左邊就是PC系統中常用的內存條,該內存條是雙通道2G內存(dual inline Memory Module),通常簡稱為DIMM。我們可以看到內存條上黑色的128MB內存芯片,這些內存芯片簡稱為IC。該內存條是雙面內存,就是說正反兩面都有8個IC,總共16個IC,16*128M=2GB。DIMM的單面稱作rank,比如下圖的2GB內存條,它就是由rank1,rank2兩個單面組成,每個面有8個IC。
圖一,DRAM的組成
每個IC內部通常由8個bank組成(DDR3通常為8個bank,GDDR5通常有16個bank),這些bank共享一個memory I/O controller, 但是在每個bank內部的讀寫可以並行進行。
每個bank內部包括行地址解碼器,列地址解碼器,傳感放大器,以及DRAM內存陣列。如圖2所示,這些內存陣列由行列組成,每個行列交叉的單元,表示n bit,通常是8bit或者16位【每一位都是由一個晶體管和一個電容組成,在GDDR5和HBM內存中,通常為32Byte】,表示一個字節或者一個word。bank中的每一行組成一個page,每一行又包括很多列(這兒列是指單個交叉單元)。內存讀寫的最小單位就是這些交叉單元,通常只有這些單元被放入傳感放大器的時候,才能夠被讀寫,所以通常要不斷在行和傳感放大器之間移動數據。
把一行放入傳感放大器稱作"activate”,因為這個操作會激活bank。把傳感放大器的內容放入行,稱作“precharge”。有時候Read或者write的時候會隱含着 precharge的操作,稱作AP-read,或者AP-write,AP(auto precharge)。
圖二 bank內部結構
在圖一中每個bank由16k的page組成,每個page包括1k的列,每列是8bit的byte,所以總共16,384 rows/bank x 1,024 columns addresses/row x 1 byte/column address x 8 stacked banks=128M
對於DDR3,我們通常說它是8n-prefetch(這兒n是指每個rank的bank數目),因為DDR3,每個IC有8個bank,每個bank讀取數據的最小單位是8bit,一個byte。每次數據讀取request,都會讀取8*8bit=64bitdata,而不管這些數據是否都是我們所需要的,比如我們只需要其中的某個byte,但讀request會讀取8個byte。
如果圖三所示, SDRAM讀寫通常能用一個簡單的狀態機來描述,它的狀態包括idle, active, precharging一個或多個bank。和任何其它狀態機一樣,從一個狀態轉換到另一個狀態,並在新的狀態開始數據操作,都需要一些最小等待時間,這些時延會影響SDRAM讀寫數據的性能,從而影響整個計算機系統的性能。
SDARM bank中的內存單元行列交叉(通常稱作cell )點,用來存儲數據,它通常都是一些電容和放大器組成,由於電容的特性,它的電量會隨着時間衰減,比如溫度等因素都會影響它的衰減速度,所以需要周期性進行加電刷新操作,維持其中的數據。刷新頻率通常依賴於內存die的工藝以及cell本身的設計。對內存cell的讀寫和內存刷新有相同的效果,但是在電容電量衰減到必須刷新之前,並不是所有的內存cell都有讀寫操作,所以定時刷新仍是需要的。通常刷新操作是按行或者說page進行的,刷新之后,該行cell的電容就會被充電。通常的刷新操作周期是幾百clocks到幾千clocks。
在刷新命令之前,每個bank必須要先precharged,然后處於idle狀態,這需要消耗一個tRP時延(The minimum number of clock cycles required between the issuing of the precharge command and activating a different row within the same bank)。在一個刷新命令完成后,所有的bank處於precharge (idle)狀態,在刷新命令和下一個activate命令(ACT)之間cycles數目必須大於等於tRFC(the Row Refresh Cycle Time )。
圖三, SDRAM數據傳輸狀態機
由於數據傳輸時候,都有一定的時延,所以有下面的一些符號描述bank內數據傳輸的各個階段時延。
參數 |
符號 |
注釋 |
Row Active Time |
TRAS |
The minimum number of clock cycles required between a bank active command and issuing the precharge command. |
Row Address to Column Address Delay |
TRCD |
The minimum number of clock cycles required between the activation of a row and accessing columns within it. |
CAS latency |
CL |
The time between sending a column address to the memory and the beginning of the data in response. This is the time it takes to read the first bit of memory from a DRAM with the correct row already open. |
Row Precharge Time |
TRP |
The minimum number of clock cycles required between the issuing of the precharge command and activating a different row within the same bank. |
Activate to Activate in same bank. |
TRC |
The minimum number of clock cycles required between the activation of a row activting another row in the same bank. |
Burst |
The number of data beats in a column access. This is usually 8 for recent DDR3/GDDR5 devices. |
SDRAM在響應讀寫命令之前,bank必須處於激活狀態,內存控制器通過發送activate命令,指定被訪問的rank,bank以及page(row)。激活一個bank的時間稱作tRCD,the Row-Column (or Command) Delay ,它表示激活發送active命令,program控制邏輯以及把內存行列單元讀取到傳感放大器中以便讀寫的cycles數目。
bank激活之后,傳感放大器中有完整page內容,這個時候,可以發射讀寫命令,指定從某列開始讀寫數據。從某個激活的page(放在傳感放大器中)中讀取一個byte數據消耗的時間稱作, the Column Address Strobe (CAS) Latency ,通常間歇位CL 或者tCAS, 它包括在讀寫接口發送讀寫命令,program控制邏輯,把傳感放大器的內容傳輸入到輸入輸出緩沖,並把數據的第一個word放在內存總線上總共消耗的時間。
一個bank每次只能打開一個page(這兒打開是指把page內容放入到傳感放大器),對於處於打開狀態的page,我們可以進行讀寫操作,如果不需要再對該page進行讀寫操作,可以關閉該page, 把該page內容寫入bank的行列單元對應的page中,以便對其它page進行讀寫操作。這個關閉操作通過發射一個Precharge命令實現,precharge命令可以關閉某一個bank,也可以關閉rank中所有打開的bank。
Precharge命令可以和bank中的上一個讀寫操作進行綁定,從而進行一個組合操作,這時發送一個Read with Auto-Precharge (RDA) 或 Write with Auto-Precharge (WRA)代替單獨的讀寫操作命令。只要滿足一定的條件,這將允許SDRAM控制邏輯自動的打開或者關閉bank。需要滿足的條件包括:(1) A minimum of RAS Activation Time (tRAS) has elapsed since the ACT command was issued, and (2) a minimum of Read to Precharge Delay (tRTP) has elapse since the most recent READ command was issued。
precharge命令把傳感放大器中的數據寫入bank中對應的page中,然后DRAM core能夠准備下一個數據訪問。 precharge一個打開的bank所消耗的時間稱作the Row Access Strobe (RAS) Precharge Delay ,通過寫作tRP。同一個bank兩個activate命令之間所消耗的時間稱作tRC,它等於tRAS+tRP。不同bank的ACT命令間隔時間稱作the Read-to-Read Delay (tRRD)。
下面的時序圖標出了各個階段時延: