从一片晶粒到一摞晶粒
到目前为止,这个进阶系列里的每一篇指南讲的都是怎么把*晶体管*做得更好——更小、更快、堆得更密、从背面供电。但还有第二个、更老的问题,光靠缩小晶体管根本治不了:芯片上两样东西离得越远,它们之间那根导线就越长、越慢。你在下面几级台阶里见过它,叫互连缩放——晶体管缩小了,连接它们的导线却*没有*按比例变快,而在一片大晶粒上,一个信号花在金属线上慢慢爬的时间,可能比它真正干正事的时间还多。一颗又大又平的芯片,说实在的,大部分时间都在*通勤*。
第二个问题是钱。你把单颗晶粒印得越大,那些躲不掉的制造缺陷之一落在它上面某处的概率就越高——而只要有一个致命缺陷,*整颗*晶粒就报废了。面积一大,良率就直坠悬崖。所以一颗巨大的单片芯片要挨双重惩罚:它那些四散的导线很慢,而它的尺寸又让它造起来很贵,每片晶圆都得忍痛报废相当一部分。
出路在于:别再把芯片当成一整块硅。把庞大的设计切成更小的几块——芯粒——你一下子就拿到两份礼物。每一小块的良率都远好过一整片大晶粒,而且你可以在组装*之前*就测好每一块,从而只把好的那些堆上去(这就是已知良品晶粒的思路)。接着问题就变成:你怎么把这些小块重新接回去、接得够紧密,让它们表现得像一颗芯片?答案不再画在晶粒上了,而是建在封装里——这正是封装从一个事后才想起来的环节,变成自成一格的前沿的原因。
2.5D:硅中介层
把芯粒重新拼到一起,最温和的办法是让它们并排摆放——不是叠起来,而是当邻居——摆在一块共用的、负责承载它们之间导线的平板上。那块平板就是中介层,而当它本身用硅做成时,它能容纳几乎和芯片内部一样精细的布线。芯粒坐在上面;底下的中介层在它们之间走通成千上万条连接,再把所有线一并向下汇集到下方的封装里。因为这些晶粒在*二*维平面上铺开,却是通过它们下方的第三层接合起来的,行业就把这叫作 2.5D——比纯平多一点,又还算不上真正的堆叠。
既然芯粒还是并排摆着,何必费这个劲?因为中介层上的导线,比你在普通电路板上能走的任何线都要短得多、密得多。硅中介层上相隔几毫米的两颗芯粒,可以用一种又宽、又快、又省电的连接彼此交谈——这种连接以前非得它们待在*同一颗*晶粒上才办得到。正是这个招数,让高带宽存储器能紧挨着 GPU 坐下,通过成千上万条并行导线喂给它——这是对存储墙的一记正面回应:处理器挨饿,不是因为缺算力,而是因为缺通往存储器的带宽。
3D:硅通孔
如果说并排不错,那叠在上面就更好——前提是你能让信号从晶粒的一面穿到另一面。芯片造在一片几百微米厚的实心硅晶圆上,它的布线全都待在一个面上。要想把第二颗晶粒直接叠到上方并把两者连起来,你就需要一根垂直的导线,笔直地往下钻,*穿过*硅的本体。那根导线就是硅通孔,即 TSV:一根细小的金属柱,蚀刻并填充得干干净净,一路贯穿一片已减薄的晶粒,把原本死气沉沉的一块衬底,变成一条垂直的高速公路。
这才是真正的 3D 集成。如今两颗堆叠晶粒之间的距离,不再是横跨中介层的几毫米——而是笔直向上的几微米。距离的这种塌缩正是整件事的要点:导线更短,意味着延迟更小,推动信号到处跑所耗的能量也少得多,这是对互连难题最直接的一记攻击。高带宽存储器本身就是一摞 3D 堆叠——好几颗 DRAM 晶粒摞起来、用 TSV 串接到一起——然后再把这摞东西放到中介层上、处理器旁边。两个思路就这么组合到了一起:一个 3D 堆叠的存储立方,以 2.5D 的布局坐在逻辑芯片旁边。
2.5D — chiplets side by side on an interposer ┌──────┐ ┌──────┐ ┌──────┐ │ logic│ │ HBM │ │ I/O │ <- chiplets └──┬┬──┘ └──┬┬──┘ └──┬┬──┘ ===||==============||==============||==== <- micro-bumps ┌──────────────────────────────────────┐ │ silicon interposer (fine wiring) │ └────────────────────┬┬──────────────────┘ ==================== || ================ <- C4 bumps ┌──────────────────────────────────────┐ │ package substrate │ └────────────────────────────────────────┘ 3D — dies stacked, joined through their bodies ┌────────────────────────┐ die 2 │ ▓ ▓ ▓ metal layers │ │ │ │ │ TSVs through Si │ ══╪═╪═╪═══════════════════ <- bond interface ┌────────────────────────┐ die 1 │ ▓ ▓ ▓ metal layers │ └──────────┬┬─────────────┘ ┌────────────────────────┐ │ package substrate │ └──────────────────────────┘
混合键合:铜对铜
你到底要怎么把两颗堆叠的晶粒接到一起?传统答案是*凸块*:在晶粒表面点上一颗颗小小的焊球,让它们熔化后跟上方晶粒上对应的焊盘熔接到一起。凸块管用,但太粗。每一颗都得占地方,所以每平方毫米塞不了几颗——而它们在晶粒之间撑开的那道缝隙,又恰恰在你拼命想消除距离和电阻的地方,反而添了距离和电阻。当一摞晶粒只需要成千上万个连接时,凸块还凑合。可一旦需要上百万个,它就彻底没戏了。
混合键合把焊料彻底丢掉。取而代之的是,把两颗晶粒的表面抛光成镜面般平整,裸露的铜焊盘嵌在绝缘介质里,然后直接压到一起。一面上的铜焊盘与另一面上的铜焊盘原子对原子地熔合——铜对铜,中间不夹凸块。既然不必再为焊球留出地方,这些连接就能挤得密上好几个数量级:焊盘间距从几十微米一路缩到接近单个微米。两颗晶粒不再表现得像两颗用导线接起来的独立芯片,而开始表现得像一整块连续的硅,只是碰巧有一道接缝罢了。
热:堆叠要付的代价
堆叠不是白来的,账单会以热的形式找上门。一颗平的芯片有一整个大面贴着散热器,每一个晶体管通往那个凉爽表面的路径都大致是直的。在上面再叠一颗晶粒,底下那颗就被埋住了——它的热量得先往上爬过它头顶那颗晶粒,或者往下穿过一片由 TSV 和键合点组成的森林,才逃得出去。而最热、最忙的逻辑,恰恰是你最想紧紧堆在一起的那部分,也恰恰是当它的热量无处可去时受苦最深的那部分。
这种紧张关系你以前见过,只是换了身行头。在下面几级台阶上,登纳德缩放的终结意味着:晶体管缩小,功率密度却不再随之下降,这正是为什么现代芯片在任一时刻都得让一大片保持熄灯——也就是暗硅问题。堆叠则是往这把火上浇油:你如今是把耗电的硅塞进一个*体积*里,而不再是摊在一个*面积*上,于是哪怕每个晶体管的瓦数在下降,每立方毫米的瓦数却在攀升。你之所以通常看到的是存储器叠存储器、而逻辑只保持单独一层发热,原因恰恰就在这里:存储器跑得凉,逻辑跑得烫,而一摞晶粒能散掉的热量是有限的。
封装的复兴
退一步,看看到底发生了什么。在摩尔定律历史的绝大部分时间里,封装只是个不起眼的盒子——它的活儿就是保护晶粒、把它连到电路板上,没什么花头。性能全靠晶粒本身。那个时代正在落幕。当单片晶粒一下子同时撞上互连延迟、良率和存储墙这几道极限时,封装被提拔了:如今一个系统的大部分性能,实际上是在封装这里*打赢*的。
芯粒这个思路要想枝繁叶茂,这些小块就得能彼此交谈,不论它们出自谁手——这意味着晶粒到晶粒的连接需要一套共用标准,就像 USB 给「往电脑上插东西」立了规矩一样。UCIe 正是这么个东西:一套开放标准,规定一颗芯粒如何跨越中介层或键合点跟另一颗交谈,这样一家公司就能把自己的逻辑跟别家的存储或 I/O 芯粒混搭起来,并且相信那些接缝靠得住。把晶粒*之间的接口*标准化,正是把一家公司的小聪明,变成整个行业积木的关键。
于是,扩展的前沿悄无声息地变得既三维、又模块化了。这个系列早期的几级台阶,是*往下*钻进晶体管里——FinFET、环绕栅极、未来的 CFET,全都在从单独一个硅平面里榨出更多东西——而封装则是*往上*、*往外*推,把许多块各自优化过的小块组合成一个系统。两者谁也取代不了谁。往后的芯片会两样都是:用我们能印出来的最好的晶体管,切成已知良品的芯粒,再接合成一摞摞由封装、而非晶粒来撑住的堆叠。为这个系列收尾的压轴指南,会把这几条线索——器件、设计、封装——拧成一幅图,描绘计算接下来要往哪里去。