JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

DRAM:一電晶體一電容,以及不停歇的更新

一個 SRAM 單元,是六顆電晶體組成的小委員會,吵著把一個位元爭論成永恆;一個 DRAM 單元,則是裝在會漏的水桶裡的一滴電荷。就是這麼一換——六顆電晶體換成一顆電晶體加一顆[[capacitor|電容]]——讓你的手機裝得下數 GB,而不是數 MB。但水桶會漏,所以晶片必須跑一條永不止息的[[ic-refresh|更新]]跑步機,只為了記住你幾毫秒前才告訴它的東西。十二分鐘內,你會看到單一電容如何存下一個位元、為何讀取它會*摧毀*它、[[ic-sense-amplifier|感測放大器]]如何在每次存取時施行一場微型復活術,以及 DRAM 為何用原始速度換來令人屏息的密度。

六顆電晶體,對上一顆電晶體加一顆電容

在第 3 階,你認識了 SRAM 位元單元:六顆電晶體接成兩個交叉耦合的反相器,靠著純粹的固執守住一個位元。給它通電,它就鎖住——一個反相器驅動另一個,另一個再驅動回來,這個迴路把 0 或 1 永遠鎖在原地。它快、通電期間絕不忘記、也永遠不必維護。問題只有一個:六顆電晶體存一個位元,太佔矽了。當你想存下八個 GB,這份額外開銷就成了整盤棋的關鍵。

DRAM 做了一筆激進的交易。把六顆電晶體裡的五顆丟掉,連同那個自我維持迴路的整個想法。留下一顆電晶體當作閘門,再加上一顆[[capacitor|電容]]當作真正的記憶。位元不再是反相器之間的固執爭論;它就只是*那顆電容是充了電還是空的。*一桶滿的電荷是 1,一桶空的是 0。電晶體只是一個閥門,當你想讀或寫時,把這桶電荷接通到外面的世界。這就是整個1T1C 單元——一顆電晶體、一顆電容——而它大概是人類歷史上被製造最多次的電路。

SRAM 6T CELL  vs  DRAM 1T1C CELL

  SRAM bitcell (6 transistors)        DRAM cell (1T + 1C)
  ----------------------------        --------------------
        WL                                    WL (wordline)
         |                                     |
     +---+---+                                 |
     |       |                          [access transistor]
   |inv| <-> |inv|   (cross-coupled)           |
     |       |                            node ===  C  (storage
     +---+---+                                 |       capacitor)
      |     |                                 GND
     BL    BL_bar                          |
                                          BL (bitline)
   holds bit by feedback;            bit = charge on C;
   static, never decays,             leaks away -> must be
   ~6T of area per bit               REFRESHED; ~1T of area

  Area per bit: SRAM ~ 6 devices   |   DRAM ~ 1 device + 1 cap
  -> DRAM packs roughly 4-8x more bits in the same silicon.
結構上的對調:SRAM 的六電晶體鎖存器,對上 DRAM 那顆守著單一儲存電容的孤單電晶體。

會漏的水桶:DRAM 為何必須跑更新跑步機

這裡有個讓 DRAM 得名的玄機——D 代表的是*dynamic(動態)*。一顆儲存電容並不是完美的水桶。你存進去的電荷會慢慢滲走:一點點透過存取電晶體在關閉時仍存在的微小漏電、一點點透過接面流進矽裡、一點點散到周遭。電容值小得驚人——只有數十飛法(femtofarad),現代單元約 25 fF——而儲存的電荷是一小灘少到幾乎消失的電子。在短短幾毫秒之內,一個剛寫入的 1 就已經漏到接近 0 的電壓,這個位元正瀕臨被遺忘的邊緣。

SRAM 單元從來沒有這個問題——它的迴授迴路會持續重新驅動位元,所以只要通電就永遠守住。DRAM 沒有迴路、沒有人重新驅動它,所以除非有人不斷提醒它,否則它就會忘記。那個提醒就是[[ic-refresh|更新(refresh)]]:記憶體控制器按固定排程逐列走過整個陣列——通常每一列至少每 64 毫秒更新一次(高溫下 32 ms)——讀出每個單元,再把值原封不動寫回去,把已經開始漏掉的水桶補滿。更新,是 DRAM 永遠走不下來的跑步機。

ONE CELL FORGETTING, AND BEING REMINDED

  V on storage node
   Vdd |1*                          1*           1*
       | \                          /\           /
       |  \   leaks down            / \         /
       |   \  (~ms)               /   \       /
  Vdd/2|----\-------- sense ------/-----\-----/----  decision
       |     \       threshold   /       \   /        line
       |      \                 /         \ /
     0 |_______*_______________*___________*___________ t
               ^               ^           ^
            refresh!        refresh!     refresh!
          (read + write-back tops the bucket back to Vdd)

  Every cell must be refreshed before its charge drifts past
  the sense threshold (~Vdd/2).  Miss the window -> bit lost.
  Refresh budget: ALL rows, at least once per 64 ms.
一個儲存的 1 會在數毫秒內衰退到接近感測門檻;每次更新都讀出單元並把完整的值寫回,讓那段下滑重新開始。

破壞性讀取:讀一個 DRAM 單元會把它抹掉

現在來談 DRAM 最奇怪的一件事,也是第 3 階的位元線感測放大器以新角色回歸的地方。要讀一個單元,控制器拉高它的字線,打開存取電晶體,把那顆微小的儲存電容接上貫穿整個陣列高度的長位元線。但相較於單元,這條位元線巨大無比——它的寄生電容比儲存電容*大上數十倍*。當閥門打開,單元那一小灘電荷就傾倒進那條廣闊的位元線,在兩者之間把自己均分掉。讀取這個動作,把水桶抽乾了。原本存的東西如今被攤得極薄、幾乎消失——這就是破壞性讀取。

你要怎麼從一個會摧毀自己的訊號裡讀出東西?這個訣竅——和第 3 階一模一樣的訣竅——是差動地讀,並且在塵埃落定之前讀。就在打開單元之前,位元線被預充電到剛好一半的電源電壓 Vdd/2,端坐在 0 與 1 之間的籬笆上。接著字線打開。如果單元存的是 1,它的電荷把位元線往 Vdd/2 之上推*一髮之差*;如果存的是 0,單元把位元線往下拉*一髮之差*。這個偏移極小——也許一百毫伏,有時遠小於此。一條鄰近的「虛設」位元線維持在 Vdd/2 不動,作為參考。單元存了什麼,這整個問題如今就活在這兩條線裡哪一條稍微高一點。

感測放大器的復活術:先放大,再寫回

一百毫伏的差距不是一個數位答案;它是一則傳聞。把這則傳聞變成扎實的 0 或 1,這份工作屬於[[ic-sense-amplifier|感測放大器]]——而它在這裡身兼兩職,這在 SRAM 裡沒有對應。感測放大器本身就是一對跨在兩條位元線上的交叉耦合反相器,一個跟你已認識的 SRAM 單元很像的鎖存器。一旦那微小差距出現,控制器就啟動感測放大器。正回授接手:原本高一髮的那條線被一路拽到 Vdd,原本低一髮的那條線被砸到 0。傳聞瞬間定格成一個滿擺幅、毫不含糊的數位值。

而這裡有個漂亮之處,把破壞性讀取的問題收尾了。當感測放大器把位元線推到滿、乾淨的軌位時,存取電晶體*仍然開著*——它的字線還是高的。所以感測放大器驅上位元線的那個滿強度訊號,會直接從開著的閥門流回去,把儲存電容重新充電到俐落的 Vdd(代表 1)或乾淨的 0。這次讀取不只取回了位元;它把位元還原了。每一次讀取,都自動是對那一個單元的更新。感測放大器,一半是神諭,一半是電擊去顫器。

  1. 位元線與它的參考夥伴預充電到 Vdd/2 並讓它們穩定下來——兩條線都平衡地坐在籬笆上。
  2. 拉高[[ic-wordline|字線]]:存取電晶體打開,儲存電容把電荷分給位元線,把它往 Vdd/2 之上或之下推幾十毫伏(這會抽乾單元——破壞性讀取)。
  3. 啟動[[ic-sense-amplifier|感測放大器]]:它的交叉耦合鎖存器靠正回授把那微小差距放大,把一條線整個推到 Vdd、另一條整個推到 0。
  4. 寫回是免費附帶的:因為字線還開著,那個被還原的滿值流回儲存電容,治好了剛被讀取抽乾的單元。
  5. 拉低字線、再次預充電,準備好下一次存取。位元已經回到它的水桶裡,滿強度,彷彿什麼都沒發生過。

把電容摺起來:溝槽、堆疊與 HBM

儲存電容裡,藏著一個安靜的矛盾。微縮要每個結構都更小——但*更小*的電容存*更少*的電荷,而我們剛看到電荷太少會讓感測訊號消失在雜訊裡。為了在縮小佔地面積的同時保住足夠的電容(大約感測放大器所需的 ~25 fF),DRAM 製造商做了一件近乎雕塑的事:他們把電容摺進第三維度。電容隨極板面積增加,所以與其用一塊平板,他們蓋一個又高又窄的結構,把一大片表面藏進極小的佔地裡。

於是出現了兩大家族。溝槽電容(trench capacitor)往矽裡直直挖一個又深又窄的洞,把洞壁鋪上一層——想像一口井,井的內壁就是電容極板。堆疊電容(stacked capacitor)則反其道而行,在存取電晶體*上方*往上長出一個高高的杯子或圓柱。現代的堆疊電容有著驚人的長寬比——柱子也許比它的寬度高上五十倍——所以這個儲存單元看起來不太像平面電路,反而更像一片站在電晶體上方的微觀煙囪森林。正是這個垂直把戲,讓 DRAM 在每個位元的表面佔地縮向原子尺度時,仍能持續把密度翻倍。

HIDING A BIG CAPACITOR IN A TINY FOOTPRINT

  TRENCH cap (dig DOWN)         STACKED cap (build UP)
  ---------------------         ----------------------
   transistor                      _____  tall cup /
     |  surface                   |     | cylinder
  ===|========                    |  C  |  (high
     |  | | |                     |     |   aspect
     |  | | |  deep narrow        |_____|   ratio)
     |  | | |  well; walls          | |
     |  |_|_|  = capacitor          | |  access transistor
     |          plates           ===|=|=========
   silicon                        surface

  Both pack ~25 fF of capacitance into a footprint only
  a few tens of nm wide -- by using VERTICAL surface area.
  Aspect ratios of stacked caps can exceed ~50:1.
溝槽(往矽裡下挖)與堆疊(往電晶體上方上長)電容,都靠走向垂直來贏得面積。

把*單元*往上摺,解決的是單一晶片內的密度——但它對 DRAM 的第二個大難題毫無幫助:把那麼多位元夠快地送*出*晶片。一個寬而平的列緩衝若必須透過一束細細的封裝接腳細水長流地滴出去,那它就毫無用處。前沿的答案是把*整個系統*也往上摺。[[high-bandwidth-memory|高頻寬記憶體]](HBM)把一疊 DRAM 晶粒堆成一座塔——四層、八層、十二層高——並用數千條稱為矽穿孔(TSV)的垂直導線直直貫穿這疊塔。這座塔就坐在離處理器幾毫米處的矽中介層上,用一個一千位元甚至更寬的龐大介面,取代了狹窄的 64 位元通道。

DRAM 在翹翹板上的位置

退一步看,第 1 階的整個記憶體階層就各就各位,成了繞著一座翹翹板打轉的一組取捨:密度對速度。暫存器與 SRAM 快取坐在又快又貴的頂端——一個位元六顆電晶體、不必更新、單一奈秒級的存取,但因為每個位元都昂貴,所以只有 KB 到 MB。DRAM 坐在寬廣而負擔得起的中段——一個位元一顆電晶體加一顆電容,所以 GB 很便宜,代價是更新、破壞性讀取,以及數十奈秒(而非個位數)的隨機存取延遲。它下面,更慢的,坐著快閃記憶體與磁碟。每一層,都用一點點速度換來一大堆容量。

為什麼除了漏電之外,DRAM 的*隨機*存取比 SRAM 慢這麼多?三個原因都回溯到 1T1C 單元。第一,訊號微弱——那道毫伏級的電荷分享擺幅,要花掉感測放大器實實在在的時間去分辨,而 SRAM 的滿強度鎖存器幾乎瞬間就翻轉。第二,存取以列為粒度——你必須先開一整頁(可能還得關掉前一頁、把它寫回),才能挑一個欄。第三,更新偶爾會撞上你的請求,把它卡住。這三點 SRAM 一個都沒有。DRAM 全盤接受這三者,因為那份獎賞——把數 GB 塞進一片指甲蓋——值得。