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

讓記憶體量產:冗餘、修復與記憶體編譯器

一顆現代晶片可以裝下*數十億*個記憶體位元,而光是一粒灰塵、或微影過程中一次原子級的小差錯,就足以毀掉一個記憶胞。如果每一百萬個記憶胞裡哪怕只有一個壞掉、卻照樣出貨,那幾乎沒有任何大型記憶體能正常運作。那麼,業界究竟是怎麼以高良率量產十億位元級記憶體的?答案是一場精巧的協同設計:備用的列與行、晶片內建的自我修復,以及一個只憑幾個數字就把整個陣列蓋起來的**記憶體編譯器**。這就是本軌的終點——在那道生產前沿上,記憶胞、周邊電路、測試與製造,融為同一個設計。

為什麼完美晶片不可能存在——以及為什麼這沒關係

想像你要在一片指甲大小的地方蓋出一座城市,每條街道只有幾個原子寬,然後要求*每一棟*建築都毫無瑕疵。製造一個記憶體陣列要求的正是這件事。一顆 256 Mb 的 SRAM 塞進超過 15 億顆電晶體;一顆高階 DRAM 晶粒則裝著數百億個記憶胞。在一片經歷數百道製程步驟的 30 公分晶圓上,統計學保證了缺陷的存在:一粒雜散微粒落在某個記憶胞上、一條字元線蝕刻得稍微太細、兩條位元線短路在一起。大自然就是不讓你完美地印出十億個一模一樣的東西。

良率是一片晶圓上真正能用的晶粒所佔的比例。假設每個記憶胞各自獨立、以機率 *p* 失效,那麼一顆有 *N* 個記憶胞的晶粒「零失效」的機率就是 (1−p)^N。代入真實數字,殘酷的算術便浮現了:即使每個記憶胞的失效率小到顯微鏡才看得見,一旦 *N* 來到十億,整顆晶粒幾乎篤定報廢。用這種天真的方式蓋出來的十億位元記憶體,良率會四捨五入到零——每一顆晶粒都丟進垃圾桶。這在經濟上根本行不通。總得有所突破。

Yield without repair:   Y = (1 - p)^N

  p = per-cell failure probability
  N = number of cells on the die

Worked example  (N = 1,000,000,000 cells = 1 Gb):

  p = 1e-9   ->  Y = (1 - 1e-9)^1e9  ~  0.368   (37% -- already painful)
  p = 1e-8   ->  Y = (1 - 1e-8)^1e9  ~  4.5e-5  (0.0045% -- dead)
  p = 1e-7   ->  Y = (1 - 1e-7)^1e9  ~  3.7e-44 (effectively zero)

  A 10x worse cell -> yield collapses by orders of magnitude.
  Conclusion: at gigabit scale you CANNOT print every cell good.
大 N 的暴政。把每個記憶胞的失效率提高十倍,一顆十億位元晶粒的良率就崩潰。這正是為什麼「修復」不是奢侈品——它是讓這顆記憶體得以存在的唯一辦法。

備用的列與行:身體的備援器官

想想你的身體:明明一顆腎臟就夠用,卻帶著兩顆——一個內建的備品。記憶體陣列也做同樣的事。在主格網(比方說 256 條字元線、256 條位元線)旁邊,設計者悄悄地在側邊多加幾條冗餘列冗餘行:功能完整,但平常閒置。這正是記憶體冗餘與修復的核心。當晶圓測試發現——譬如說——第 73 列壞了,晶片就會被重新配置,讓*每一次原本要去第 73 列的存取,都被悄悄改道到一條備用列*。缺陷在物理上仍然在那裡——只是它已經被映射掉、彷彿不存在。

為什麼列*和*行都要備?因為缺陷有兩種風味。單一壞死的記憶胞、或某個特定位址上的壞胞,最划算的修法是替換它所在的那一行。但一條卡死的字元線、或列驅動器上的故障,會一口氣殺掉整列的記憶胞——這時與其啃掉 256 次行修復,直接換掉整列要便宜得多。真實的記憶體會各備一小撮配額,而修復演算法則決定一種最省的組合,去涵蓋所有找到的故障。把這個配置做對——一道小小的二維覆蓋難題——本身就是一門小小的藝術。

  Memory array with redundancy (schematic, not to scale)

            normal columns ......         spare cols
          c0  c1  c2 ............ c255 |  s0   s1
         +---+---+---+--      --+---+--+----+----+
   r0    | . | . | . |  ....    | . |  | .  | .  |
   r1    | . | X | . |  ....    | . |  | .  | .  |  <- bad cell at (r1,c1)
   ...   |   |   |   |          |   |  |    |    |
   r73   |XXX|XXX|XXX|  ..XXXX.. |XXX|  |    |    |  <- whole row stuck
   ...   |   |   |   |          |   |  |    |    |
   r255  | . | . | . |  ....    | . |  | .  | .  |
         +---+---+---+--      --+---+--+----+----+
   spare s_r0 | . | . | . |  ....   . |  |    |    |
   rows  s_r1 | . | . | . |  ....   . |  |    |    |

  Repair plan:
     row  73 (stuck)     -> remap to spare row  s_r0
     cell (r1,c1) (bad)  -> remap column c1     to spare col s0
  Result: every address now lands on a GOOD cell.
兩種故障,兩種修復工具。整列失效用一條備用*列*來補;單一壞胞則藉由替換它所在的*行*來補。修復演算法挑出最省的涵蓋方式。

把地圖燒進去:eFuse 與內建自我修復

一條備用列若沒被晶片*記住*要去用它,就毫無用處——而且必須是永久地記住,每一次開機、餘生的每一刻都記得。所以一旦修復計畫算出來,它就得寫進一個斷電後仍存活、且永不改變的非揮發性儲存裡。經典的答案就是你在第五關認識的 [[ic-efuse|eFuse]]:一個你刻意*摧毀一次*的微小晶片內元件。讓足夠大的電流流過一條狹窄的多晶矽或金屬連線,它就會像家用保險絲一樣燒斷——一個永久、無法偽造的改變,從低電阻的「0」變成高電阻的「1」。一整排 eFuse 編碼著哪些位址有缺陷、各自對應到哪個備品。一旦燒斷,這張地圖就刻進了物理裡,而不是軟體裡。

但*是誰*算出計畫、*又是誰*去燒斷保險絲?在較老或較簡單的零件上,這由外部一台昂貴的測試設備來做,或由雷射在晶圓上實體燒斷保險絲連線(雷射熔絲——既笨重,又在晶片封裝後就失效)。現代而優雅的答案,是把醫生放進*病人體內*:內建自我修復(BISR)。晶片自帶一個[[ic-built-in-self-test|內建自我測試(BIST)]]引擎,把測試圖樣行進式地灌過整個陣列;一個小小的內建冗餘分析(BIRA)區塊算出最省的修復方案;再加上燒斷保險絲的控制器——全部都在晶粒上。

  1. 自我測試。 晶片上的 BIST 引擎把已知圖樣(行進的 0 與 1、棋盤格)寫入每個記憶胞再讀回,標記出任何回傳值與寫入值不符的位址。
  2. 分析。 BIRA 區塊蒐集故障清單,解開那道小小的涵蓋難題——在可用配額內,用哪些備用列與行、以何種組合,把每個故障都修掉。
  3. 修復(揮發性)或燒錄(永久)。 測試期間可先把重映射存在暫存器裡(軟修復)以便驗證;一旦確認無誤,控制器便燒斷 eFuse,讓修復永久生效——硬修復。
  4. 每次開機重載。 每次上電時,晶片讀取 eFuse 地圖、配置其位址解碼器,讓壞掉的列/行在使用者發出任何一次讀取之前就消失。

記憶體編譯器:幾個數字生出整個陣列

一顆現代的系統單晶片(SoC)可能含有*數百個*各不相同的 SRAM——這裡一個 64×32 的暫存器檔、那裡一個 4096×128 的快取、別處還有個小小的 16×8 FIFO。要手工佈局每一個——連同它的記憶胞、感測放大器、解碼器、時序與冗餘——一支熟練的團隊得花上好幾個月,*而且是每個記憶體都要*。沒有公司負擔得起。解法是晶片設計裡一項低調的奇蹟:[[ic-memory-compiler|記憶體編譯器]]。你交給它幾個參數——字數、每字位元數、埠數、你想要的速度/功耗/面積取向——它就*自動生出整個記憶體*:最佳化的記憶胞陣列、所有周邊電路、冗餘,以及其他工具要用它時所需的模型。

把它想成一座參數化的工廠。晶圓廠的記憶體團隊手工打造並以矽片驗證出一個完美的記憶胞、一個感測放大器、一片解碼器、一行冗餘——然後寫一支程式,把這些經過驗證的零件*鋪排並縫合*成你要的任何尺寸。它會算出該怎麼把一個 4096 深的記憶體摺成——比方說——64 列 × 64 行 × 多個記憶庫,以在位元線長度(也就是速度與讀寫餘裕)與面積之間取得平衡。關鍵是,它輸出的不只是佈局(GDSII),而是一整套*視圖*:一個時序/功耗模型(`.lib`)、一個給佈局繞線用的抽象視圖、一個給模擬用的 Verilog 行為模型,以及一個通過DRCLVS的乾淨物理視圖。

  // What the SoC designer writes -- a few lines:

  compile_sram \
      words      = 4096      // depth
      bits       = 128       // word width
      ports      = 1RW       // one read/write port
      mux        = 8         // column-mux ratio (folds the array)
      redundancy = row+col   // include spare row & column
      corner     = typ_0p8v_85c

  // What the compiler emits automatically:

     macro_4096x128.gds      <- full layout (DRC/LVS clean)
     macro_4096x128.lib      <- timing + power for STA / synthesis
     macro_4096x128.lef      <- abstract for place & route
     macro_4096x128.v        <- behavioural model for simulation
     macro_4096x128.cdl      <- netlist for LVS
     datasheet.txt           <- access time, area, leakage, vmin...

  Generated in MINUTES. Hand layout would take MONTHS.
記憶體編譯器把幾個參數,化成一個完整特性化、經晶圓廠驗證的巨集,外加下游工具所需的每一個模型——只要幾分鐘,而非幾個月。

記憶體即協同設計:餘裕、記憶胞、測試與矽片合而為一

退一步,整條軌道就收攏成一幅畫。一個能出貨的記憶體,從來不是*單一*個聰明的電路;它是四個世界之間的談判,而它們都必須達成共識。記憶胞(第二、四、五關——6T SRAM 胞、1T1C DRAM 胞、浮閘快閃胞)決定密度與原始的讀寫餘裕周邊電路——感測放大器、解碼器、寫入驅動器、時序——把那些脆弱的記憶胞訊號,變成可靠的數位資料。測試與修復(本關,加上 BIST 與 DFT)決定哪些晶粒生、哪些死,並修補那些值得救的。而製造——製程、缺陷密度、變異——則設定了其餘一切都必須存活下來的那場統計天氣。

這四者是*相互耦合*的,而這正是最深刻的一課。為了密度把記憶胞縮小,它的餘裕就下降,於是周邊電路必須更賣力,*而且*你會看到更多虛弱的位元,於是你需要更多冗餘。加了冗餘,晶粒就變大,於是抓到更多缺陷。把讀取餘裕收緊,良率下降——但放鬆它,你就把密度讓給了競爭對手。沒有單一的旋鈕;每一個選擇都會在全部四個世界裡漣漪擴散。這就是*協同設計*的意思,也是為什麼記憶體設計是一門獨立的學問,而不是邏輯設計的一個角落。

前沿:把記憶體疊進第三維

目前為止的一切都活在二維裡——單一晶粒上的一個平面陣列。但對*頻寬*無止盡的需求(尤其來自那些餓著資料的 AI 加速器),正把記憶體往上推、推進第三維。[[high-bandwidth-memory|高頻寬記憶體(HBM)]] 把多顆 DRAM 晶粒疊在彼此之上,再用數千條垂直導線把它們連起來——這些導線直直地鑽*穿過*矽——也就是[[through-silicon-via|矽穿孔(TSV)]]。它不再是幾十支接腳從一顆平面晶片的邊緣爬出來,一座 HBM 堆疊暴露出的是一條*上千位元寬*的匯流排,以又短又粗的連線通往鄰近的處理器。結果是低落到每位元能耗極小、卻驚人的頻寬——正是記憶體牆所要求的東西。

堆疊深刻地改變了良率這場遊戲,也把本關的主題綁上了前沿。如果你疊八顆晶粒、卻是盲目組裝的,那麼單單一顆壞晶粒就會毀掉整座昂貴的堆疊——所以你必須在*接合之前*測試每一顆晶粒,只堆疊已知良品晶粒。在堆疊內部,TSV 本身也會失效,於是設計者加上*備用 TSV*、繞過壞的重新映射——冗餘與修復,被抬進了垂直維度。而且由於這座堆疊如今是一個由小晶片接合而成的系統,你在這裡認識的那套自我測試/自我修復機制,便能向上擴展去測試並療癒整個三維組裝,而不只是一個陣列。

而這就是本軌結束之處——不在某一個電路,而在一種思考方式。你從一個 6T 記憶胞、一場為了幾毫伏餘裕的搏鬥出發;你在終點看見的,是把記憶體視為物理、電路、測試與製造的協同設計,交織得如此緊密,以至於要出貨十億個位元的唯一辦法,就是假設其中有些是壞的,再蓋出一個聰明到不在乎這件事的系統。把這個想法握緊。從你手機裡的快取,到一座前沿的 AI 叢集,一切實際上就是這麼造出來的。