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

讀取、寫入與感測放大器:讓微小訊號現形

記憶體儲存格以一對交叉耦合的電壓保存一個位元——但要把它讀出來,卻是一場既微小又驚險的量測。一個儲存格只能把又長又重的位元線推動幾毫伏,接著這個答案就必須被放大、鎖存,再以乾淨的 1 或 0 送出。這一級會跟著那幾毫伏的低語穿過感測放大器,看著寫入驅動器壓制儲存格、翻轉其狀態,並帶你掌握「裕度」的語彙——讀取裕度、寫入裕度與靜態雜訊裕度——它們決定一顆晶片在 0.6 V 能否運作,或是否會在十億個儲存格中壞掉一個。

重線上的一聲低語

想像你要求一隻螢火蟲照亮整座體育場。記憶體儲存格每次被讀取時,大致就面臨這樣的窘境。在第 2 級你認識了 6T SRAM 儲存格:兩個交叉耦合的反相器保存一個位元,並由兩顆 存取電晶體把內部節點接到一對 位元線上。這些位元線並不是短短的線頭——它們縱貫整個欄的高度,經過數百甚至數千個其他儲存格,而每個掛在線上的儲存格都會增加電容。一條位元線輕易就承載 100–400 fF 的負載。而試圖把它放電的,只是一顆寬度或許只有幾百奈米的電晶體。

所以我們不等。若要逼儲存格把沉重的位元線從 VDD 一路擺盪到接地,會耗時太久、燒掉太多能量。取而代之的是,儲存格只被要求在它的兩條位元線——真值線與互補線——之間製造一個微小的電壓差,再由下游一個專責電路把這個差值轉成真正的數位準位。這個電路就是 感測放大器,而高速記憶體的全部工藝,就藏在膽怯的儲存格與躍躍欲試的放大器之間的這場交接裡。

位元線發展:把讀取放慢來看

一次讀取依循精確的編排。首先,當這一欄閒置時,兩條位元線都被預充電到 VDD(或接近 VDD 的偏壓),並短接在一起,使它們起點完全相等。這是最關鍵的準備步驟:放大器稍後只在意差值,所以我們從乾淨的零差值開始。接著列解碼器拉高一條 字元線,開啟該列每個儲存格的存取電晶體。此時儲存格才得以動作。

在儲存格內部,一個內部節點停在 0、另一個停在 VDD。透過它的存取電晶體,保存 0 的那個節點緩緩把*它的*位元線往下拉,而另一條位元線維持在高準位。兩條位元線之間的電壓差逐漸擴大——工程師稱之為位元線發展。我們會刻意提早讓它停下。一旦差值達到安全門檻,通常只有 50–150 mV,我們就拉高字元線的搭檔訊號:感測放大器致能。沒有理由讓儲存格繼續慢慢磨低位元線;那只會浪費時間與能量。

         precharge       WL rises        SA fires
            |               |               |
  VDD ──────┐               .               .
  BL  ......└───────────────\______          (BL was high, stays high-ish)
            :               :     \____
            :               :         \___________  full swing -> VDD
  BLB ......└───────────────\__                       (this one wins to 0)
            :               :  \__
            :               :     \____________________  full swing -> 0
            :               :        ^
            :               :        |
            :<- equalized ->:<-dev.-> | ~50-150 mV split when SA enables
            :    (=0 diff)  :  ~1 ns  |

  Read of a stored 0 on the internal node tied to BLB.
  Cell only opens a small gap; the sense amp slams it to the rails.
讀取期間的差動位元線發展:儲存格先撐開一個小縫隙,感測放大器再把它解析成全幅擺盪。

感測放大器:以正迴授當裁判

感測放大器是儲存格的擴音器。SRAM 與 DRAM 中的主力是鎖存型(交叉耦合)感測放大器:本質上就是兩個輸出接輸入互相纏繞的反相器,就像位元儲存格一樣,但在這裡被當成一個再生式比較器使用。當它的致能電晶體觸發時,這對反相器具有正迴授。哪一條位元線哪怕只高出一點點,就會被拉得更高;哪一條稍低,就會被往接地拖。幾毫伏的不平衡,會在遠不到一奈秒的時間內雪崩般擴大成完整的軌到軌判決。

把鎖存型感測放大器想成一顆平衡在刀刃上的球會很有幫助。致能之前,它停在亞穩定的中點,對最輕微的推動都極度敏感。位元線差值就是那一推。放大器的工作不是精準*量出*差值——它只需決定差值的*正負號*,然後狠狠地定案。這正是把 差動對推到再生極端時的行為:它不產生比例式輸出,而是猛然跳到一個數位裁決並鎖住。

        VDD
         |
    +----+----+
    |         |
  [PMOS]   [PMOS]
    |         |
    o---+ +---o        <- two cross-coupled inverters:
    |   X X   |           each output drives the other's gate
  BL o---+ +---o BLB     (BL, BLB tap the inverter inputs/outputs)
    |         |
  [NMOS]   [NMOS]
    |         |
    +----+----+
         |
      [ EN ]   <- sense-amp enable: closes the tail, lights the feedback
         |
        GND

  Before EN: BL ~ BLB - dV  (dV ~ 50-150 mV, the developed signal)
  After  EN: feedback regenerates -> BL -> GND, BLB -> VDD (a stored 0)
鎖存型感測放大器:交叉耦合的反相器,一旦致能就把幾毫伏的差值再生成完整的數位擺盪。

寫入:當週邊電路必須壓制儲存格

讀取是溫和的勸說;寫入則是一場受控的鬥毆。位元儲存格在設計上是*穩定*的——它交叉耦合的反相器會奮力守住所存的值。要把 1 改成 0,你必須把內部節點強推過反相器的切換點,使迴授翻轉並反過來幫你收尾。寫入驅動器的做法是放棄讀取時那種差動低語:它把一條位元線狠狠拉到接地(一個強 0),同時把另一條維持在 VDD,再開啟字元線,讓存取電晶體把這個蠻力值耦合進儲存格。

  1. 把位元線驅動成新值。寫入驅動器把目標位元線完全拉到接地,並讓其互補線浮升(或維持)在高準位——這是一次全幅、單端的推動,而非微小的差動推動。
  2. 拉高字元線。存取電晶體把位元線連到內部節點。強勢的位元線此刻透過存取元件與儲存格內部的上拉相抗。
  3. 贏得拔河。存取電晶體必須壓制儲存格的 PMOS 上拉,把處於高準位的內部節點拖到對側反相器切換門檻以下。
  4. 讓迴授收尾。一旦某個節點越過跳變點,儲存格自身的正迴授就會把另一個節點一鼓作氣推到底。新位元此時已能自我維持;字元線便可關閉。

裕度與蝴蝶曲線

我們如何給「這個儲存格能不能撐過一次讀取、又接受一次寫入」標上一個數字?我們用裕度讀取與寫入裕度以伏特為單位,量化一個儲存格在做出錯事之前能容忍多少擾動。靜態雜訊裕度(SNM)是這些指標中最受喜愛的一個,而且它有一幅優美的幾何圖像:蝴蝶曲線

拿儲存格那兩個交叉耦合的反相器。畫出反相器 A 的電壓轉移曲線(輸入為 x 軸、輸出為 y 軸)。再畫出反相器 B 的轉移曲線,但*把軸對調*,因為它的輸出餵給 A 的輸入。把兩條曲線疊在一起,你會得到兩片看似蝴蝶翅膀的瓣。儲存格的穩定狀態就是外側的兩個交叉點。在每片翅膀內,你都可以內嵌一個正方形:能塞進去的最大正方形的邊長,就是靜態雜訊裕度。正方形越大,代表儲存格在曲線不再三點相交、位元崩潰之前,能吸收更多其內部節點上的雜訊。

  VB / out_A
   ^
   |   ___________
   |  /           \
   | /   +-----+   \        the inscribed square's side = SNM
   |/    | []  |    \___    (largest box that fits inside a wing)
   |     +-----+        \
   |  stable             \
   |  state               \______
   |                      +-----+ \
   |                ___   | []  |  |
   |               /   \  +-----+  |  <- two crossings = two stable
   |  ____________/     \__________|     bits (a '1' and a '0')
   +------------------------------> VA / out_B

  HOLD (wordline off): wide-open wings, large square -> strong SNM.
  READ (wordline on):  access device lifts the '0' node; the wings
                       PINCH, the square shrinks -> READ SNM is the
                       worst case. If a wing closes, the bit flips:
                       a READ-DISTURB failure.
蝴蝶曲線。內嵌於翅膀中的最大正方形即為靜態雜訊裕度;一次讀取會夾擠翅膀、縮小該正方形。

關鍵洞見在於:翅膀會*隨著儲存格正在做的事而移動*。在保持(字元線關閉)時翅膀大大張開、SNM 很大——所存的位元穩固。在讀取期間,存取電晶體把預充電到高準位的位元線連到內部的 0 節點,使它略微抬升到接地之上。這會把翅膀向內夾擠、縮小內嵌的正方形:這個較小的值就是讀取 SNM,也是保存資料的最壞情況。若一次讀取把該節點推過跳變點,翅膀閉合、位元翻轉,你就遇上了讀取擾動失效——你只是看了它一眼,就毀掉了資料。

裕度為何蒸發:變異與低電壓

在課本裡單一個儲存格上,裕度看起來很充裕。記憶體設計的恐怖之處在於:一顆晶片有*數十億*個儲存格,而它們並不相同。兩種效應聯手吞噬你的裕度。第一是製程變異:在最小的製程節點,一顆電晶體的臨界電壓取決於其通道中摻雜原子的實際數量——隨機摻雜起伏——以及線邊粗糙度。兩顆畫得一模一樣的相鄰存取電晶體,其 Vt 可能相差數十毫伏。6T 儲存格中的失配會讓蝴蝶翅膀不對稱地傾斜,甚至使其中一片塌陷。

正因為儲存格如此之多,決定晶片命運的是最差的儲存格,而非平均的儲存格。一個十億分之一機率會出錯的記憶體就是壞的。所以設計者不分析典型情況;他們研究深處的尾端,問自己必須在多少個標準差(sigma)之外才能保證儲存格可運作。一個 1 Mb 陣列大約需要 4.8 sigma;一個 1 Gb 陣列則推過 6 sigma。這就是為什麼裕度要跨製程角點驗證——慢-NMOS/快-PMOS、快/慢以及交叉角點——以框住製造的散布範圍,也是為什麼要用罕見事件統計(重要性抽樣)來估計那些用普通蒙地卡羅永遠碰不到的失效。

第二個裕度殺手是低電壓運作。我們降低 VDD 以省電——能量與電壓平方成正比——但裕度並不會優雅地縮小;它們會崩潰。在大約 VDD = 0.7 V 以下,儲存格的雜訊裕度會掉到與隨機 Vt 失配本身相當的量級,而感測放大器的失調相較於已發展的位元線訊號也不再可忽略。以訊號雜訊比來看,你在縮小訊號(更小的擺盪)卻維持雜訊(固定的失配),於是 SNR 急墜。一個陣列仍能達到其 sigma 目標的最低 VDD,就是它的 Vmin——而限制整顆 SoC 能把電壓壓多低的,往往是 Vmin,而非標稱速度。