晶片大部分都是記憶體
拿起幾乎任何一顆現代手機或筆電處理器的晶粒照片,盯著它看一會兒。你會看到幾塊參差不規則的區域——那是 CPU 與 GPU 核心,是真正在運算的邏輯閘。但包圍它們、面積還更大的,是一些大而詭異地平滑的長方形,帶著淡淡的格子紋理,像是從軌道上俯瞰的方格紙。那些平滑的區塊就是記憶體。在一顆典型的系統單晶片(SoC)上,晶片內記憶體——主要是快取——經常佔據矽面積的 40 至 60 個百分比,有時更多。我們稱之為「處理器」的東西,以面積而論,大部分其實是一個存放數字的地方。
為什麼記憶體值得擁有自己的學科、自己的學習軌道,與數位設計的其餘部分分開?因為那塊平滑的格子紋理就是全部的故事。邏輯是不規則的:每個閘都連到不同的鄰居,每個區塊都有客製的形狀。記憶體是規則的:一個微小的單元,被複製成數千列、數千行,連到最後一顆原子都完全相同。這個唯一的差別——不規則對規則——層層擴散,變成一套對佈局、電性裕度、製造良率與速度截然不同的思考方式。學完這個軌道,你會詳細了解每一種記憶體;而這個階段,先交給你那張地圖。
記憶體階層:又快又小,又慢又大
沒有任何單一種類的記憶體樣樣都行。一種快得發燙的記憶體,每一位元也既昂貴又佔空間;一種能在你口袋裡裝下一兆位元組的記憶體,相對地就慢。所以工程師不會只挑一種——他們疊好幾種:又快又小的擺在最靠近處理器的地方,又慢又大的擺在最遠處。這道階梯就是記憶體階層,而運算裡幾乎每一個效能故事,本質上都是關於把資料在這道階梯上下搬動的故事。
CLOSER / FASTER / SMALLER / COSTLIER per bit
┌──────────────────────────────────────────────────────┐
│ Registers ~1 KB ~1 cycle in the core │
│ SRAM L1 cache ~32-64 KB ~4 cycles on-die │
│ SRAM L2 cache ~256KB-1MB ~12 cycles on-die │
│ SRAM L3 cache ~8-64 MB ~40 cycles on-die │
│ DRAM main mem ~8-64 GB ~200 cycles off-chip │
│ Flash / SSD ~0.5-4 TB ~50,000 cyc off-chip │
└──────────────────────────────────────────────────────┘
FARTHER / SLOWER / BIGGER / CHEAPER per bit
Cycle counts are rough, for a ~3 GHz core. One DRAM access
(~200 cycles) is ~200 wasted instruction slots if you wait.再讀一次那張表,注意那道斷崖。從 L3 SRAM 跨到晶片外的 DRAM,並不是稍微變慢一點——而是大約慢了五倍,再往下跨到快閃記憶體又慢上數百倍。每一種技術都靠著「在某一件事上徹底更強」來掙得它那一階:暫存器與 SRAM 用普通電晶體建在邏輯旁邊,所以瞬間就到、但很佔地;DRAM 用一個巧妙的「一電晶體一電容」把更多位元塞進每平方毫米,代價是速度與必須不斷更新;快閃記憶體把電荷存在一個被困住的「浮閘」上,斷電後也能完全保留,所以永久、但寫入很慢。後面的階段會逐一解剖它們。
記憶體牆:那道斷崖為何要命
這裡有一個令人不安的事實,正是它給了整個軌道急迫感。數十年來,處理器速度的成長遠快於記憶體速度。邏輯遵循摩爾定律,每隔幾年就戲劇性地變快;主記憶體的延遲卻是龜速改善。兩者之間的鴻溝越拉越大,最後變成主導性的瓶頸——工程師為這個現象取名為記憶體牆。一顆現代核心每奈秒能執行好幾道指令,但跑一趟 DRAM 卻要花上大約 60 到 100 奈秒。算一算就懂:處理器可以乾坐著、空轉好幾百個指令的時間,敲著手指,只為了等一個數字送達。
這正是為什麼 AI 加速器與 GPU 越來越不是看它們能做多少次乘法而定生死,而是看它們能被餵得多快。一疊疊高頻寬記憶體緊貼著一塊巨大的 GPU 晶粒,如今是整個電子產業裡最有價值的長方形之一。記憶體不再是被動的事後補充,而成了頭條主角。
通用陣列:列、行、字元線、位元線
現在來到讓其他一切都豁然開朗的核心概念。幾乎所有曾被造出的記憶體——SRAM、DRAM、快閃,甚至 ROM——都被組織成一個二維的單元方格,就像一座巨大劇院裡的座位。要找到某一位元,你需要它的列與它的行,就像「M 排、14 號座」。那條選取整列的水平導線叫字元線;拉高它,就像引座員喊出「M 排的各位,請起立」。接著把被選中單元的資料載進載出的垂直導線,就是位元線,每行一條。
bitline0 bitline1 bitline2 bitline3
│ │ │ │
wordline0 ────────●─────────●─────────●─────────●────
[cell] [cell] [cell] [cell]
│ │ │ │
wordline1 ────────●─────────●─────────●─────────●────
[cell] [cell] [cell] [cell]
│ │ │ │
wordline2 ────────●─────────●─────────●─────────●────
[cell] [cell] [cell] [cell]
│ │ │ │
▼ ▼ ▼ ▼
┌───────────────────────────────────────┐
│ sense amplifiers + column mux (read) │ <- periphery
└───────────────────────────────────────┘
Raise ONE wordline -> that whole row drives its bitlines.
Sense amps at the bottom recover the tiny signals as 1s/0s.注意那個定義整門手藝的分界:陣列+週邊。陣列是那片乏味、美麗、無窮重複的單元方格。週邊則是圍繞它的那圈巧思——把位址轉成「拉高第 1,048,575 條字元線」的列解碼器、偵測單元在位元線上留下的微弱電壓(常常只有幾十毫伏)的感測放大器、行多工器、寫入驅動器。陣列給你密度;週邊讓它可用。把這個兩段式的圖像記在腦中,後面每一個階段——SRAM 讀取裕度、DRAM 更新、快閃編程、感測放大器設計——都不過是對其中某一部分更貼近的觀察。
為什麼六電晶體單元需要與邏輯閘不同的規則
這裡有一個工作直覺,正當化了把記憶體當成獨立學科來對待。想想 SRAM 的主力單元,六電晶體位元單元:六顆電晶體守著一個位元。在一個邏輯區塊裡,設計者也許會擺上幾十萬個客製的標準單元。但在一個 32 MB 的快取裡,同一個 6T 單元被壓印了超過 15 億次,每一份都完全相同,塞得跟製程在物理上允許的一樣緊。光是這種數量級的重複,就把設計的經濟學整個顛倒過來。
- 手工最佳化,而非自動擺放。一個邏輯標準單元由晶圓廠畫一次、然後重複使用。SRAM 位元單元也只畫一次——但因為它要重複十億次,工程師會為每一奈米斤斤計較,動用晶圓廠只在陣列內部才開放的特殊「記憶體設計規則」。在單元上省下 1% 的面積,就是在三分之一的晶片上省下 1%。
- 用統計,而非最壞情況。有了十億個完全相同的單元,大數法則就會發威。即使每一百萬個單元只壞一個,你的快取也會有上千個死位元。所以記憶體設計者用標準差來思考——他們需要每一個單元都能做到 5 或 6 個 sigma 的裕度,這個邊界在邏輯設計者眼中會顯得荒謬,因為他們對賭的是十億次擲骰,而不是一千次。
- 裕度,而不只是功能。一個邏輯閘要嘛算出正確答案、要嘛沒有。但一個位元單元可以算出正確答案、卻仍是個糟糕的設計——因為讀取它的動作,可能擾動它正在保存的那個位元。記憶體引入了一條全新的軸線——讀寫裕度(靜態雜訊裕度),在邏輯裡幾乎沒有對應的概念。要讓一個單元同時既可讀又可寫,是一場拔河,我們之後會用一整個階段來談它。
- 內建修復。沒有任何十億單元的陣列能完美無瑕地下線。所以記憶體出廠時就帶著備用的列與行,加上一個小控制器,把壞掉的一列換成備用的——冗餘與修復。邏輯沒有這種家常便飯般的奢侈;而記憶體少了它就活不下去。
這個軌道的地圖
你現在握有後面每一個階段都倚靠的兩個概念。第一,階層:一道以速度換取容量的記憶體階梯,而記憶體牆讓這場交換成為運算的核心戲碼。第二,陣列+週邊模型:一片由字元線與位元線定址的規則單元方格,外面包著精巧的解碼器與感測放大器。有了這套詞彙,軌道的其餘部分就能放大細看:6T SRAM 單元究竟如何運作、DRAM為何必須更新、快閃如何把電荷困住數年,以及感測放大器如何從幾毫伏的訊號裡逼出一個乾淨的位元。