CPU,最强科普!
我们都认为 CPU 是计算机的“大脑”,但这究竟意味着什么呢?数十亿个晶体管在计算机内部是如何运作的?在这个由四部分组成的系列文章中,我们将重点介绍计算机硬件设计,介绍计算机运行的来龙去脉。
本系列将涵盖计算机架构、处理器电路设计、VLSI(超大规模集成)、芯片制造以及计算的未来趋势。如果您一直对处理器内部工作原理的细节感兴趣,请继续关注 - 这是您入门所需了解的内容。
计算机架构基础
CPU 实际上做什么?
让我们从高层次开始,了解一下处理器的功能以及构建模块如何在功能设计中组合在一起。这包括处理器核心、内存层次结构、分支预测等。首先,我们需要对 CPU 的功能有一个基本定义。
最简单的解释是,CPU 遵循一组指令对一组输入执行某些操作。例如,这可能是从内存中读取一个值,将其添加到另一个值,最后将结果存储回内存中的不同位置。它也可能是更复杂的操作,例如如果前一次计算的结果大于零,则将两个数字相除。
当你想要运行一个程序(比如操作系统或游戏)时,程序本身就是一系列供 CPU 执行的指令。这些指令从内存中加载,在简单的处理器上,它们会逐一执行,直到程序完成。虽然软件开发人员使用 C++ 或 Python 等高级语言编写程序,但处理器无法理解这些语言。它只能理解 1 和 0,所以我们需要一种方法来以这种格式表示代码。
CPU 指令基础知识
程序被编译成一组低级指令,称为汇编语言,是指令集架构 (ISA) 的一部分。这是 CPU 构建来理解和执行的指令集。一些最常见的 ISA 是 x86、MIPS、ARM、RISC-V 和 PowerPC。就像用 C++ 编写函数的语法与用 Python 编写执行相同操作的函数不同一样,每个 ISA 都有自己的语法。
这些 ISA 可以分为两大类:固定长度和可变长度。RISC-V ISA 使用固定长度指令,这意味着每条指令中一定数量的预定义位数决定了它是哪种类型的指令。这与使用可变长度指令的 x86 不同。在 x86 中,指令可以以不同的方式编码,并且不同部分的位数也不同。由于这种复杂性,x86 CPU 中的指令解码器通常是整个设计中最复杂的部分。
固定长度指令由于其规则结构而更容易解码,但限制了 ISA 可以支持的指令总数。虽然 RISC-V 架构的常见版本有大约 100 条指令并且是开源的,但 x86 是专有的,没有人真正知道存在多少条指令。人们通常认为有几千条 x86 指令,但确切的数字并不公开。尽管 ISA 之间存在差异,但它们都具有基本相同的核心功能。
RISC-V 指令示例。右侧的操作码为 7 位,决定指令类型。每条指令还包含要使用哪些寄存器以及要执行哪些功能的位。这就是汇编指令如何分解为二进制以便 CPU 理解的方式
现在我们准备打开电脑并开始运行程序。指令的执行实际上有几个基本部分,这些部分通过处理器的多个阶段进行分解。
获取、解码、执行:CPU 执行周期
第一步是将指令从内存中提取到 CPU 中开始执行。第二步,对指令进行解码,以便 CPU 能够确定它是哪种类型的指令。指令有很多种类型,包括算术指令、分支指令和内存指令。一旦 CPU 知道它正在执行哪种类型的指令,指令的操作数就会从内存或 CPU 中的内部寄存器中收集。如果你想将数字 A 加到数字 B,那么在你真正知道 A 和 B 的值之前,你无法进行加法。大多数现代处理器都是 64 位的,这意味着每个数据值的大小为 64 位。
64 位是指 CPU 寄存器、数据路径和/或内存地址的宽度。对于日常用户来说,这意味着一台计算机一次可以处理多少信息,最好将其与架构较小的 32 位进行比较。64 位架构一次可以处理两倍的信息(64 位对 32 位)
CPU 获得指令的操作数后,将进入执行阶段,在此阶段对输入执行操作。这可以是将数字相加、对数字执行逻辑运算,或者只是传递数字而不进行修改。计算结果后,可能需要访问内存来存储结果,或者 CPU 可以只将值保存在其内部寄存器之一中。存储结果后,CPU 将更新各个元素的状态并继续执行下一条指令。
当然,这种描述是一种极大的简化,大多数现代处理器会将这几个阶段分解为 20 个或更多个较小的阶段,以提高效率。这意味着,尽管处理器每个周期都会启动和完成几条指令,但任何一条指令从开始到结束可能需要 20 个或更多个周期才能完成。这种模型通常被称为管道,因为需要一段时间才能填满管道并让液体完全通过管道,但一旦填满,就会得到恒定的输出。
4 级流水线示例。彩色框表示彼此独立的指令
无序执行和超标量架构
指令的整个周期是一个非常严密编排的过程,但并非所有指令都可能同时完成。例如,加法非常快,而除法或从内存加载可能需要数百个周期。大多数现代处理器都是乱序执行的,而不是在一条慢速指令完成时让整个处理器停滞。
这意味着它们将确定在给定时间内执行哪条指令最有利,并缓冲其他尚未准备好的指令。如果当前指令尚未准备好,处理器可能会在代码中向前跳转,查看是否有其他指令已准备好。
除了无序执行之外,典型的现代处理器还采用所谓的超标量架构。这意味着,在任何时候,处理器都在流水线的每个阶段同时执行许多指令。它还可能等待数百条指令开始执行。为了同时执行许多指令,处理器内部将拥有每个流水线阶段的多个副本。
如果处理器发现两条指令已准备好执行,且它们之间没有依赖关系,它就会同时执行这两条指令,而不是等待它们分别完成。这种做法的一个常见实现称为同步多线程 (SMT),也称为超线程。英特尔和 AMD 处理器通常支持双向 SMT,而 IBM 已开发出支持多达八路 SMT 的芯片。
为了实现这种精心编排的执行,处理器除了基本核心之外还具有许多额外元素。处理器中有数百个单独的模块,每个模块都有特定的用途,但我们只介绍基础知识。最大和最有用的两个是缓存和分支预测器。我们不会介绍的其他结构包括重新排序缓冲区、寄存器别名表和保留站等。
缓存:加速内存访问
缓存的用途常常令人困惑,因为它们就像RAM或SSD一样存储数据。然而,缓存的不同之处在于它们的访问延迟和速度。尽管 RAM 非常快,但对于 CPU 来说,它的速度太慢了。RAM 可能需要数百个周期才能响应数据,处理器将无事可做。如果数据不在 RAM 中,则可能需要数万个周期才能访问 SSD 上的数据。没有缓存,我们的处理器将陷入停顿。
处理器通常有三级缓存,形成所谓的内存层次结构。L1 缓存最小且速度最快,L2 缓存居中,L3 缓存最大且速度最慢。层次结构中缓存上方是小型寄存器,用于在计算期间存储单个数据值。这些寄存器是系统中速度最快的存储设备,速度快了几个数量级。当编译器将高级程序转换为汇编语言时,它会确定利用这些寄存器的最佳方式。
当 CPU 从内存请求数据时,它首先检查该数据是否已存储在 L1 缓存中。如果是,则只需几个周期即可快速访问数据。如果不存在,CPU 将检查 L2,然后搜索 L3 缓存。缓存的实现方式通常对内核透明。内核只会在指定的内存地址请求一些数据,并且层次结构中拥有该数据的任何级别都会做出响应。随着我们进入内存层次结构的后续阶段,大小和延迟通常会增加几个数量级。最后,如果 CPU 在任何缓存中都找不到它要查找的数据,那么它才会转到主内存 (RAM)。
在典型的处理器上,每个核心将有两个 L1 缓存:一个用于数据,一个用于指令。L1 缓存通常总共约 100 KB,大小可能因芯片和代数而异。每个核心通常还有一个 L2 缓存,尽管在某些架构中它可能在两个核心之间共享。L2 缓存通常为几百 KB。最后,有一个 L3 缓存,它由所有核心共享,大小约为几十兆字节。
当处理器执行代码时,它最常使用的指令和数据值将被缓存。这显著加快了执行速度,因为处理器不必不断进入主内存来获取所需的数据。我们将在本系列的第二和第三部分中进一步讨论这些内存系统的实际实现方式。
还值得注意的是,虽然三级缓存层次结构(L1,L2,L3)仍然是标准,但现代 CPU(例如 AMD 的Ryzen 3D V-Cache)已经开始加入额外的堆叠缓存层,这往往会在某些情况下提高性能。
分支预测和推测执行
除了缓存之外,现代处理器的另一个关键构建块是准确的分支预测器。分支指令类似于处理器的“if”语句。如果条件为真,则执行一组指令,如果条件为假,则执行另一组指令。例如,您可能想要比较两个数字,如果它们相等,则执行一个函数,如果它们不同,则执行另一个函数。这些分支指令非常常见,可以占程序中所有指令的约 20%。
从表面上看,这些分支指令似乎不是什么问题,但实际上,它们对于处理器来说非常具有挑战性。由于在任何时候,CPU 都可能同时执行十到二十条指令,因此知道要执行哪些指令非常重要。可能需要 5 个周期来确定当前指令是否为分支,再需要 10 个周期来确定条件是否为真。在此期间,处理器可能已经开始执行数十条其他指令,甚至不知道这些指令是否是正确的执行指令。
为了解决这个问题,所有现代高性能处理器都采用了一种称为推测的技术。这意味着处理器会跟踪分支指令并预测是否会执行分支。如果预测正确,处理器已经开始执行后续指令,从而提高性能。如果预测不正确,处理器将停止执行,丢弃所有错误执行的指令,并从正确点重新启动。
这些分支预测器是机器学习的早期形式之一,因为它们会随着时间的推移适应分支行为。如果预测器做出太多错误猜测,它会进行调整以提高准确性。数十年来对分支预测技术的研究已使现代处理器的准确率超过 90%。
虽然推测允许处理器执行就绪指令而不是等待停滞的指令,从而显著提高性能,但它也带来了安全漏洞。现在臭名昭著的 Spectre 攻击利用了分支预测中的推测执行错误。攻击者可以使用特制代码诱使处理器推测执行泄露敏感内存数据的指令。因此,推测的某些方面必须重新设计以防止数据泄露,从而导致性能略有下降。
在过去的几十年里,现代处理器的架构有了显著的进步。创新和巧妙的设计带来了更高的性能和更好的底层硬件利用率。然而,CPU 制造商对其处理器内部的具体技术高度保密,因此不可能确切知道内部发生了什么。话虽如此,处理器工作的基本原理在所有设计中都保持一致。英特尔可能会添加他们的秘密武器来提高缓存命中率,AMD 可能会添加一个高级分支预测器,但它们都完成了同样的任务。
CPU的设计过程
现在我们已经了解了处理器的工作原理,是时候深入了解它们的内部组件及其设计方式了。本文是我们关于处理器设计系列文章的第二部分。
晶体管:处理器的组成部分
您可能知道,处理器和大多数其他数字技术都是由晶体管组成的。最简单的理解方法是将晶体管视为具有三个引脚的可控开关。当栅极打开时,电流可以流过晶体管;当栅极关闭时,电流无法流动。它类似于墙上的电灯开关,但尺寸更小、速度更快,并且由电控。
现代处理器使用两种主要类型的晶体管:pMOS 和 nMOS。nMOS 晶体管允许电流在栅极充电或设置为高电平时流动,而 pMOS 晶体管允许电流在栅极放电或设置为低电平时流动。通过以互补的方式组合这两种类型的晶体管,我们可以创建 CMOS 逻辑门。我们不会在本文中深入讨论晶体管物理工作原理的复杂细节,但我们会在本系列的第 3 部分中介绍它。
逻辑门是一种简单的设备,它接受输入、执行操作并输出结果。例如,AND 门仅在所有输入都打开时才打开其输出。反相器(或 NOT 门)仅在输入关闭时才打开其输出。通过组合这两个门,我们可以创建一个 NAND(“非 AND”)门,除非所有输入都打开,否则它会打开其输出。其他逻辑门包括 OR、NOR、XOR 和 XNOR,每个门都具有不同的逻辑功能。
上图显示了晶体管如何构成两个基本门:一个反相器和一个 NAND 门。在反相器中,pMOS 晶体管位于顶部,连接到电源线,而 nMOS 晶体管位于底部,连接到地。pMOS 晶体管的栅极处画有一个小圆圈。由于 pMOS 器件在输入关闭时导通,而 nMOS 器件在输入打开时导通,因此 Out 处的信号始终与 In 处的信号相反。
看看 NAND 门,我们发现它需要四个晶体管,只要至少一个输入关闭,输出就会保持开启。同样的原理也用于设计更先进的逻辑门和处理器内的其他电路。
从逻辑门到功能单元
逻辑门等简单组件很难想象如何将它们转变成一台功能齐全的计算机。这一设计过程包括将多个逻辑门组合起来,以创建执行特定功能的小型设备。然后,这些小型设备连接起来,形成更复杂的功能单元,最终形成一个功能齐全的处理器。集成这些单个组件的过程与构建现代芯片的方法相同——唯一的区别是,当今的芯片包含数十亿个晶体管。
举个简单的例子,我们来看一个 1 位全加器。该电路接受三个输入(A、B 和进位输入)并产生两个输出(总和和进位输出)。基本设计由五个逻辑门组成,多个加法器可以连接在一起以创建任意大小的加法器。现代设计通过优化逻辑和进位信号对此进行了改进,但基本原理保持不变。
如果 A 或 B 之一打开(但不能同时打开),或者如果 A 和 B 同时打开或同时关闭时有进位输入信号,则 Sum 输出打开。进位输出信号稍微复杂一些:当 A 和 B 同时打开时,或者如果有进位输入且 A 或 B 之一打开时,该信号有效。要连接多个 1 位加法器并形成更宽的加法器,我们只需将前一位的进位输出连接到当前位的进位输入。电路越复杂,逻辑就越混乱,但这是将两个数字相加的最简单方法。虽然现代处理器使用更先进的加法器,但基本概念保持不变。
现代处理器使用更复杂的加法器,但这些设计对于这样的概述来说太复杂了。除了加法器之外,处理器还包含除法、乘法和所有这些运算的浮点版本的单元。
将一系列这样的门组合起来对输入执行某些功能称为组合逻辑。不过,这种逻辑并不是计算机中唯一存在的逻辑。如果我们无法存储数据或跟踪任何事物的状态,它就没什么用。为此,我们需要具有存储数据能力的顺序逻辑。
存储数据:SRAM 和 DRAM
顺序逻辑是通过仔细连接反相器和其他逻辑门来构建的,这样它们的输出就会反馈到门的输入。这些反馈回路用于存储一位数据,称为静态 RAM或 SRAM。它被称为静态 RAM,而不是 DRAM 中的动态 RAM,因为存储的数据始终直接连接到正电压或地。
实现单个 SRAM 位的标准方法是使用如下所示的 6 个晶体管。顶部信号标记为 WL(字线),是地址,启用后,存储在此 1 位单元中的数据将发送到标记为 BL 的位线。BLB 输出称为位线条,只是位线的反转值。您应该能够识别这两种类型的晶体管,并且 M3 和 M1 与 M4 和 M2 一起形成反相器。
SRAM 用于构建处理器内的超高速缓存和寄存器。它非常稳定,但需要六到八个晶体管来存储每位数据。与 DRAM 相比,就成本、复杂性和芯片面积而言,SRAM 的生产成本极高。
另一方面,动态 RAM 将数据存储在微型电容器中,而不是使用逻辑门。之所以称为动态 RAM,是因为电容器的电压可以动态变化,因为它不连接到电源或地。单个晶体管用于访问存储在电容器中的数据。
由于 DRAM 每比特仅需一个晶体管,且具有高度可扩展的设计,因此可以密集封装并以较低成本生产。然而,DRAM 的一个缺点是电容器中的电荷太小,需要不断刷新。这就是为什么当您关闭计算机时,电容器会耗尽,RAM 中的数据会丢失。
英特尔、AMD 和 Nvidia 等公司当然不会发布详细说明其处理器工作原理的示意图,因此不可能展示现代处理器的完整图表。但是,这个简单的加法器应该可以让您很好地了解如何将处理器最复杂的部分分解为逻辑门、存储元件和晶体管。
时钟信号和频率
现在我们知道了某些处理器组件的构造方式,我们需要弄清楚如何连接所有组件并使其同步。处理器中的所有关键组件都连接到时钟信号,该信号以预定义的间隔(称为频率)在高电平和低电平之间交替。处理器内部的逻辑通常在时钟从低电平变为高电平时切换值并执行计算。通过同步所有组件,我们可以确保数据在正确的时间到达,从而防止处理器出现故障。
您可能听说过,增加处理器的时钟速度(称为超频)可以提高性能。这种性能提升来自以比最初设计速度更快的速度切换处理器内部的晶体管和逻辑。由于每秒的周期数更多,因此可以完成更多工作,从而提高性能。但是,这只能在一定程度上起作用。
现代处理器的运行速度一般在 3.0 GHz 到 5.0 GHz 之间,这个范围在过去十年中基本保持不变。就像金属链的强度取决于其最薄弱的环节一样,处理器的运行速度也取决于其最慢的部分。在每个时钟周期结束时,处理器中的每个组件都必须完成其操作。如果任何部分仍在处理,则时钟太快,处理器将无法工作。设计人员将这个最慢的部分称为关键路径,它决定了处理器可以运行的最大频率。超过某个频率,晶体管就无法足够快地切换,从而导致故障或错误输出。
增加处理器的供电电压可以加快晶体管的切换速度,但只能在一定程度上加快。如果施加的电压过高,处理器可能会过热或烧坏。提高频率或电压总是会导致产生更多热量和更高的功耗。这是因为处理器功率与频率成正比,与电压的平方成正比。要估算处理器的功耗,可以将每个晶体管视为一个小电容器,每当它改变状态时都必须充电或放电。
电源管理和效率
供电是处理器设计中非常重要的一个方面,在某些情况下,芯片的一半物理引脚专门用于供电或接地。有些芯片在满负荷时可能会消耗超过 150 安培的电流,而且必须小心管理所有这些电流。从这个角度来看,CPU 每单位面积产生的热量比核反应堆还要多。
现代处理器中的时钟信号约占总功耗的 30-40%,因为它非常复杂,必须同时驱动多个组件。为了节省能源,大多数低功耗设计都会在不使用时关闭芯片的某些部分。这可以通过关闭时钟(一种称为“时钟门控”的技术)或完全切断电源(称为“电源门控”)来实现。
时钟是处理器设计中的另一个挑战,因为随着频率的增加,物理定律开始相互干扰。尽管光速非常快,但对于高性能处理器来说还不够快。如果时钟信号从芯片的一端发送到另一端,当它到达最远点时,就会不同步。为了确保芯片的所有部分保持同步,时钟使用一种称为 H 树(上图)的结构进行分配。这可确保所有端点与中心的距离完全相同,从而保持整个芯片的同步。
说到效率,现代处理器的耗电量越来越大。为了解决这个问题,许多设计师除了优化单个芯片的性能外,还采用了芯片。芯片是分段式处理器,这意味着不是将每个组件整合到单个单片芯片中,而是将不同的部分制造成单独的小芯片。例如,CPU 可能具有单独的高效核心和电源核心,可根据工作负载打开或关闭。这种模块化方法允许从最新制造方法中受益最多的组件缩小尺寸,从而提高制造效率并使更多组件能够装入同一处理器中。
处理器是如何设计的
设计芯片中的每个晶体管、时钟信号和电源连接似乎非常繁琐和复杂,事实确实如此。尽管英特尔、高通和 AMD 等公司拥有数千名工程师,但他们不可能手动设计芯片的每个方面。为了组装如此规模的芯片,他们使用各种先进的工具来生成设计和原理图。
这些工具通常会对组件的功能进行高级描述,并确定满足这些要求的最佳硬件配置。人们越来越倾向于使用高级综合 (HLS),它允许开发人员在代码中指定他们想要的功能,然后让计算机找出如何在硬件中最佳地实现它。这种抽象不仅可以加速开发,还可以实现更快的迭代和大规模优化。
最近,人工智能驱动的设计技术开始彻底改变芯片开发。谷歌、Nvidia 和 Synopsys 等公司已将机器学习模型集成到芯片布局和布局规划中,大大减少了高效放置数十亿个晶体管所需的时间。人工智能现在在优化电源效率、时序分析甚至自动错误检测方面发挥着作用——帮助工程师在制造之前发现设计缺陷。
处理器设计中的验证
就像您可以通过代码定义计算机程序一样,设计人员也可以通过代码定义硬件。Verilog 和 VHDL 等语言允许硬件设计人员表达他们正在制作的任何电路的功能。这些设计会进行仿真和验证,如果一切顺利,它们就可以合成到组成电路的特定晶体管中。虽然验证可能看起来不像设计新的缓存或核心那么引人注目,但它却更为重要。
验证新设计通常比制造实际芯片本身花费更多的时间和金钱。公司在验证上花费如此多的时间和金钱是因为一旦芯片投入生产,就无法修复它。对于软件,你可以发布补丁,但硬件在大多数情况下不是这样工作的。
例如,英特尔在 20 世纪 90 年代末的奔腾芯片浮点除法单元中发现了一个漏洞,最终导致英特尔损失了相当于今天的 20 亿美元。相反,过去十年中,我们看到了许多芯片安全漏洞案例,其中一些漏洞已通过制造商发布的微代码和固件更新得到修复。然而,这些修复的代价是性能或品牌声誉的下降。
您可能很难理解一个芯片如何拥有数十亿个晶体管以及它们都起什么作用。当您将芯片分解成各个内部组件时,事情会变得容易一些。晶体管构成逻辑门,逻辑门组合成执行特定任务的功能单元,这些功能单元连接在一起形成我们在第 1 部分中讨论的计算机架构。
大部分设计工作都是自动化的,而且随着人工智能驱动的工具加速芯片开发的关键环节,现代处理器的复杂性不断增加。不过,这应该会让你对你购买的新 CPU 到底有多么复杂和精密有新的认识。
芯片布局和物理构建
在前面,我们介绍了计算机架构以及处理器的高层工作原理和单个芯片组件的设计和实现。现在,在第这部分中,我们将更进一步了解架构和原理图设计如何转化为物理芯片。
晶体管类型:nMOS 和 pMOS
正如我们之前所讨论的,处理器和所有其他数字逻辑电路都是由晶体管构成的。晶体管是一种电子控制开关,可以通过向栅极施加或去除电压来打开或关闭。我们之前介绍了两种主要类型的晶体管:
nMOS 器件,当栅极打开时允许电流流动。
pMOS 器件,当栅极关闭时允许电流流动。
处理器的基本材料是硅,晶体管就嵌入其中。硅被归类为半导体,因为它既不是完全导体,也不是完全绝缘体——它介于两者之间。
掺杂:将硅转变成有用的电路
为了通过添加晶体管将硅晶片变成功能电路,工程师使用了一种称为掺杂的工艺。该工艺涉及将精心挑选的杂质引入硅基板以改变其导电性。
目标是改变电子的行为方式,以便我们能够控制它们。就像有两种类型的晶体管一样,也有两种相应的掺杂类型。
如果我们添加精确控制数量的电子供体元素,如砷、锑或磷,我们就可以创建一个n 型区域。由于应用这些元素的硅区域现在拥有过量的电子,因此它将带负电。这就是 n 型名称和nMOS中“n”的由来。
通过向硅中添加硼、铟或镓等电子受体元素,我们可以创建一个带正电的p 型区域。这就是 p 型和pMOS中的“p”的由来。将这些杂质添加到硅中的具体过程称为离子注入和扩散,它们超出了本文的范围。
现在我们可以控制硅某些区域的电导率,我们可以结合多个区域的特性来创建晶体管。
晶体管的作用
集成电路中使用的晶体管称为 MOSFET(金属氧化物半导体场效应晶体管),有四个连接。我们控制的电流流过源极和漏极。在 n 通道器件中,电流通常流入漏极并从源极流出,而在 p 通道器件中,电流通常流入源极并从漏极流出。
Gate 是用来打开和关闭晶体管的开关。最后,设备的 Body 与处理器无关,因此我们在此不讨论它。
硅片中逆变器的物理结构。每个颜色区域具有不同的导电性。请注意不同的硅片元件如何与右侧的示意图相对应
晶体管的工作原理以及不同区域如何相互作用的技术细节非常复杂,足以填满一门研究生课程,因此我们将重点关注基础知识。
一个有用的类比是河流上的吊桥。汽车,也就是晶体管中的电子,会从河的一边流到另一边,也就是晶体管的源极和漏极。以 nMOS 器件为例,当栅极未充电时,吊桥处于升起状态,电子无法流过通道。当我们放下吊桥时,我们在河上形成了一条道路,汽车可以自由移动。晶体管中也会发生同样的事情。给栅极充电会在源极和漏极之间形成一个通道,允许电流流动。
光刻:在硅上印刷电路图案
为了精确控制硅片上不同 p 和 n 区域的位置,英特尔和台积电等制造商使用一种称为光刻的工艺。这是一个极其复杂、多步骤的过程,各大公司花费数十亿美元完善它,以制造更小、更快、更节能的晶体管。想象一下一台超精密打印机,用于将每个区域的图案绘制到硅片上。
随着晶体管尺寸的缩小,传统的深紫外 (DUV) 光刻技术已达到极限。为了继续缩小尺寸,业界采用了极紫外 (EUV) 光刻技术,该技术使用较短波长的光(约 13.5 纳米)来创建更精细、更高精度的图案。EUV 可实现更密集的晶体管封装,并减少所需的掩蔽步骤,从而提高制造效率。
将晶体管装入芯片的过程始于纯硅晶片,在炉中加热,在晶片顶部生长一层薄薄的二氧化硅。然后将感光光刻胶聚合物涂在二氧化硅上。通过将特定波长的光照射到光刻胶上(目前通常使用 EUV 来处理最先进的节点),我们可以剥离想要掺杂的区域的光刻胶。这是光刻步骤,类似于打印机将墨水涂在页面的某些区域,只是规模要小得多。
然后用氢氟酸蚀刻晶圆,溶解去除光刻胶处的二氧化硅。剩余的光刻胶被剥离,只留下下面的氧化层。现在可以将掺杂离子施加到晶圆上,选择性地仅在暴露区域植入。
这种掩蔽、成像和掺杂的过程重复了数十次,以慢慢构建半导体中的每个特征层。一旦完成基础硅层,就会在上面制造金属连接,以将不同的晶体管连接在一起。我们稍后会详细介绍这些连接和金属层。
制造过程
当然,芯片制造商不会只制造一个晶体管。当设计出新芯片时,他们会为制造过程的每个步骤生成掩模。这些掩模将包含芯片上数十亿个晶体管的每个元件的位置。多个芯片组合在一起,并在单个芯片上一次性制造。
晶圆制造完成后,单个芯片就会被切割并封装。根据芯片的大小,每个晶圆可能容纳数百个或更多芯片。通常,生产的芯片越强大,芯片就越大,制造商从每个晶圆中得到的芯片就越少。
我们很容易认为我们应该制造出功能强大、拥有数百个内核的巨型芯片,但这是不可能的。目前,阻碍我们制造越来越大的芯片的最大因素是制造过程中的缺陷。现代芯片有数十亿个晶体管,如果其中一个部件损坏,整个芯片可能需要丢弃。随着处理器尺寸的增加,芯片出现故障的可能性也会增加。
工艺节点和大规模晶体管制造
公司从制造过程中获得的实际良率是严格保密的,但 70% 到 90% 之间是一个不错的估计。公司通常会过度设计芯片,增加额外的功能,因为他们知道有些部件不会起作用。例如,英特尔可能会设计一款 8 核芯片,但只将其作为 6 核芯片出售,因为他们估计有一两个内核可能会损坏。缺陷数量异常少的芯片通常会被搁置一旁,以便在称为装箱的过程中以更高的价格出售。
与芯片制造相关的最大营销术语之一是特征尺寸或工艺节点。例如,台积电目前正在努力实现“2nm”工艺。然而,在过去十年左右的时间里,工艺节点尺寸已经与晶体管的任何实际物理特征(如栅极长度、金属间距或栅极间距)失去了真正的关系。相反,它更像是一种节奏和营销术语,用于指代日益先进的制造技术。
就在几年前,7nm 和 10nm 还被认为是开创性技术。如今,Apple 已在其部分 SoC 中使用 3nm 工艺,而 Nvidia 在其最新 GPU 中使用 5nm 工艺。但这些数字实际上意味着什么?传统上,特征尺寸是指晶体管漏极和源极之间的最小宽度。随着技术的进步,晶体管不断缩小,从而实现了更高的晶体管密度、更好的性能和更高的能效。
在研究这些工艺节点时,需要注意的是,不同的公司对其尺寸的定义不同。因此,一家制造商的 5nm 工艺可能生产出尺寸与另一家制造商的 7nm 工艺相似的晶体管。此外,同一制造工艺中并非所有晶体管的尺寸都相同。设计师可能会根据特定的性能要求故意制造一些比其他晶体管更大的晶体管。
自动化设计和优化
对于给定的设计过程,较小的晶体管切换速度更快,因为它们需要更少的时间来对栅极进行充电和放电。然而,由于它们的电流处理能力降低,它们只能驱动有限数量的输出。如果特定电路需要驱动高功率负载(例如输出引脚),其晶体管必须大得多。在某些情况下,输出晶体管可能比内部逻辑晶体管大几个数量级。
AMD Zen 处理器的芯片照片。该设计由数十亿个晶体管组成。
不过,设计和制造晶体管只是芯片的一半。我们需要根据原理图构建导线来连接所有东西。这些连接是使用晶体管上方的金属层实现的。想象一下一个多层高速公路立交桥,有上坡道、下坡道和相互交叉的不同道路。这正是芯片内部发生的事情,尽管规模要小得多。不同的工艺在晶体管上方会有不同数量的金属互连层。
随着晶体管越来越小,需要更多的金属层才能路由所有信号。据报道,台积电的 5nm 工艺有 15 个金属层。想象一下 15 层的垂直高速公路立交桥,你就能理解芯片内部的路由有多复杂。
下面的显微镜图像显示了由七层金属层形成的晶格。每层都是平的,随着层数的增加,层数会变大,以帮助降低电阻。每层之间都有称为通孔的小金属圆柱体,用于跳转到更高的层。每层的方向通常与下面的层交替,以帮助减少不必要的电容。奇数金属层可用于建立水平连接,而偶数层可用于建立垂直连接。
可以想象,所有这些信号和金属层很快就会变得难以管理。为了解决这个问题,计算机程序被用来自动放置和布线晶体管。根据设计的先进程度,程序甚至可以将高级 C 代码中的函数翻译成每根电线和晶体管的物理位置。通常,芯片制造商会让计算机自动生成大部分设计,然后他们会手动检查和优化某些关键部分。
现代 CPU 设计的复杂性
当公司想要制造新芯片时,他们会从制造公司提供的标准单元开始设计。例如,英特尔或台积电将为设计师提供逻辑门或存储单元等基本部件。然后,设计师可以将这些标准单元组合成他们想要制造的任何芯片。然后,他们会将芯片晶体管和金属层的布局发送给代工厂(将原始硅变成功能芯片的地方)。这些布局被转换成掩模,用于我们上面介绍的制造过程。接下来,我们将看看对于一个极其基本的芯片来说,这个设计过程可能是什么样的。
首先,我们看到了标准单元反相器的布局。顶部带斜线的绿色矩形是 pMOS 晶体管,底部透明的绿色矩形是 nMOS 晶体管。垂直的红线是多晶硅栅极,蓝色区域是金属 1,紫色区域是金属 2。输入 A 从左侧进入,输出 Y 从右侧输出。电源和接地连接在金属 2 的顶部和底部进行。
结合几个门,我们得到了一个基本的 1 位算术单元。此设计可以对两个 1 位输入进行加法、减法和逻辑运算。垂直延伸的蓝色斜线是金属 3 层。导线末端稍大的方块是连接两层的通孔。
最后,通过组合许多标准单元和大约 2,000 个晶体管,我们可以创建一个在四个金属层上具有 8 字节 RAM 的基本 4 位处理器。
即使规模如此之小,其复杂性也是显而易见的。现在,想象一下设计一个具有兆字节缓存、多个内核和超过 20 个流水线阶段的 64 位 CPU 的挑战。考虑到当今的高性能 CPU 包含多达 50 亿到 100 亿个晶体管和十几层金属层,毫不夸张地说,它们比这个基本设计复杂数百万倍。
这应该能让你更好地理解为什么现代 CPU 如此昂贵,以及为什么 AMD 和 Intel 的产品发布间隔如此之长。新芯片的开发周期通常需要 3 到 5 年,从最初的设计到上市。一些进步,如人工智能驱动的芯片设计(如第 2 部分所述)和小芯片架构,可能会略微加快开发时间。然而,这仍然意味着当今最快的芯片是在几年前设计的,我们要等到几年后才能看到采用当今最先进制造技术的芯片。
至此,我们对处理器制造的深入研究就结束了。
计算机架构和设计的发展方向?
尽管每一代处理器都不断改进和逐步升级,但很长时间以来,处理器都没有出现任何改变行业的进步。从真空管到晶体管的转变是革命性的。从单个元件到集成电路的转变是另一次重大飞跃。然而,自那以后,还没有出现过如此大规模的范式转变。是的,晶体管变得更小,芯片变得更快,性能呈指数级增长,但我们开始看到收益递减。
于是,行业开始探索不同的解决方案。
由于各公司不会公开分享其研究或当前技术的细节,因此很难确定计算机 CPU 内部究竟是什么。但是,我们可以研究正在进行的研究和行业趋势,以了解事态的发展方向。
摩尔定律 125 年来的发展
处理器行业最著名的概念之一是摩尔定律,该定律指出芯片上的晶体管数量大约每 18 个月翻一番。这一定律长期有效,但现在已经明显放缓——可以说已经走到了尽头。
晶体管已经变得如此之小,以至于我们正在接近物理学的基本极限。对于传统的硅基 CPU,摩尔定律实际上已经结束。晶体管的缩小速度已大大降低,导致英特尔、AMD 和台积电等芯片制造商将重点转向先进封装、芯片架构和 3D 堆叠。
插图由Steve Jurvetson绘制。请注意图中过去十年中数据点如何从通用 CPU 过渡到 Nvidia GPU、TPU 和其他形式的专用处理器 (ASIC)
这种细分的一个直接结果是,公司开始增加核心数量而不是频率来提高性能。这就是我们看到八核处理器而不是 10GHz 双核芯片成为主流的原因。除了增加更多核心之外,几乎没有多少增长空间。
量子计算
另一方面,量子计算是一个未来具有巨大发展空间的领域。我们不会假装自己是这方面的专家,而且由于这项技术仍在开发中,所以真正的“专家”并不多。为了消除任何误解,量子计算并不是能在现实生活中提供 1,000fps 的渲染速度之类的东西。目前,量子计算机的主要优势在于它允许使用以前无法用传统计算机处理的更先进的算法。
在传统计算机中,晶体管要么打开要么关闭,代表 0 或 1。在量子计算机中,叠加是可能的,这意味着比特可以同时为 0 和 1。有了这种新功能,计算机科学家可以开发新的计算方法,并能够解决我们目前没有计算能力的问题。量子计算机的速度并不快,而是它是一种新的计算模型,可以让我们解决不同类型的问题。
这项技术距离主流还有十年或二十年的时间(取决于你问谁),那么我们现在在实际处理器中开始看到哪些趋势呢?有几十个活跃的研究领域,但我将谈及一些我认为最具影响力的领域。
高性能计算趋势和人工智能
异构计算是影响我们的一个日益增长的趋势。这是一种在单个系统中包含多个不同计算元素的方法。我们大多数人都以系统中专用 GPU 的形式从中受益。
CPU 可高度定制,能够以合理的速度执行各种计算。另一方面,GPU 专门用于执行矩阵乘法等图形计算。它在这方面非常擅长,并且比 CPU 在这些类型的指令上快几个数量级。通过将某些图形计算从 CPU 转移到 GPU,我们可以加快工作量。任何程序员都可以通过调整算法来轻松优化软件,但优化硬件要困难得多。
然而,GPU 并不是加速器变得普遍的唯一领域。随着 AI 和机器学习工作负载的增加,我们看到定制 AI 处理器的数量激增。例如,Google 的张量处理单元(TPU) 和 Nvidia 的张量核心是专为深度学习计算而设计的。同样,AMD 的Instinct MI300和英特尔的Gaudi AI加速器正在塑造 AI 格局,为训练和推理工作负载提供更专业的性能。
除了人工智能之外,专用加速器现在已成为移动和云计算不可或缺的一部分。大多数智能手机都配备了数十个硬件加速器,旨在加速非常具体的任务。这种计算方式被称为“加速器之海”,例如加密处理器、图像处理器、机器学习加速器、视频编码器/解码器、生物识别处理器等。
随着工作负载变得越来越专业化,硬件设计师正在将更多的加速器整合到他们的芯片中。AWS 等云提供商现在为开发人员提供 FPGA 实例,以加速云端的工作负载。虽然 CPU 和 GPU 等传统计算元素具有固定的内部架构,但 FPGA(现场可编程门阵列)却非常灵活 - 它几乎就像可编程硬件,可以配置为满足特定的计算需求。
例如,如果您想加速图像识别,您可以在硬件中实现这些算法。如果您想模拟新的硬件设计,您可以在实际构建之前在 FPGA 上对其进行测试。虽然 FPGA 比 GPU 提供更高的性能和能效,但它们的性能仍然不如定制的 ASIC(专用集成电路),这些 ASIC 由 Google、Tesla(Dojo)和 Cerebras 等公司开发,用于优化深度学习和 AI 处理。
高性能计算和芯片架构的另一个新兴趋势是向芯片组的转变,我们在本系列的第 3 部分中讨论过这一点。传统的单片芯片变得越来越难以扩展,这促使 AMD、英特尔和苹果等公司探索模块化设计,将较小的处理单元(芯片组)组合在一起以用作单个处理器。AMD 的 Zen 4 和 Zen 5 架构,以及英特尔的 Meteor Lake 和 Foveros 3D 封装,展示了如何将 CPU 分解成单独的芯片组来提高性能和效率。
从一些较新的处理器的芯片照片中可以看出,CPU 的大部分面积实际上并不是核心本身。越来越多的面积被各种类型的加速器所占用,包括 AI 核心、NPU 和 DSP。这种转变大大加快了专门工作负载的速度,同时也节省了大量电力,这是数据中心和移动计算的一个关键因素。
从历史上看,如果你想在系统中添加视频处理功能,你只需添加一个单独的芯片即可。这是非常低效的。每当信号必须通过物理线路离开芯片时,每个比特都需要大量的能量。虽然焦耳的一小部分可能看起来并不多,但在同一芯片内进行通信比离开芯片的效率要高出三到四个数量级。这推动了超低功耗芯片的发展,将加速器直接集成到 CPU 和 SoC 中以提高功率效率。
然而,加速器并不完美。随着我们添加更多加速器,芯片的灵活性会降低,牺牲整体通用性能以换取某些工作负载的峰值性能。在某个时候,整个芯片可能只是加速器的集合,这会降低它作为通用处理器的实用性。专用性能和通用性能之间的权衡总是在不断微调。这一持续的挑战被称为专用化差距——在使硬件高效完成特定任务与保持其适应不同工作负载之间的微妙平衡。
直到几年前,一些人认为我们正达到 GPU/机器学习加速器热潮的顶峰,但现实显然已经走上了一条完全不同的道路,随着人工智能模型变得越来越大、越来越复杂,云计算不断扩展,我们可能会看到更多的计算被卸载到专门的加速器上。
近内存计算和其他内存创新
设计师寻求提高性能的另一个领域是内存。传统上,读取和写入值一直是处理器的最大瓶颈之一。虽然快速、大容量的缓存可以提供帮助,但从RAM或SSD访问数据可能需要数万个时钟周期。因此,工程师通常认为内存访问比计算本身更昂贵。
如果您的处理器要将两个数字相加,它首先需要计算内存地址,确定数据在层次结构中的位置,将其提取到寄存器中,执行计算,计算目标地址,然后将结果写回。对于可能只需要一两个周期即可完成的简单操作,这是非常低效的。
一个经过大量研究的新想法是近内存计算(NMC) 技术。研究人员不再从内存中获取小块数据并将其传送到快速处理器进行计算,而是将这个想法反过来:他们将计算能力直接嵌入内存控制器、RAM 模块或 SSD 等存储设备中。内存处理 (PIM) 是 NMC 的一个子集,旨在直接在数据所在的位置执行操作,从而消除传统内存访问的大部分延迟和能源成本。
三星、SK 海力士和美光等主要半导体公司已经在开发 HBM-PIM(高带宽内存处理内存)解决方案,该解决方案将小型计算单元集成在内存堆栈中。例如,三星的 HBM-PIM 原型通过减少所需的数据移动量,在 AI、云计算和 HPC 工作负载中实现了两位数的性能提升。
另一项新兴的内存创新是 Compute Express Link (CXL),这是一种高速缓存一致性互连技术,可实现内存池和近内存处理。英特尔、AMD 和 Nvidia 等公司已经将基于 CXL 的内存扩展集成到数据中心和 AI 工作负载中,允许多个处理器高效共享大型内存池。这项技术有助于减少传统架构中内存访问受 CPU 限制的瓶颈。
近内存计算需要克服的障碍之一是制造工艺的限制。如第 3 部分所述,硅制造极其复杂,涉及数十个步骤。这些工艺通常专门用于快速逻辑元件(用于计算)或密集存储元件(用于内存)。如果您尝试使用计算优化的制造工艺来创建内存芯片,密度就会受到影响。相反,如果您使用存储制造工艺构建处理器,它的性能和时序就会很差。
3D 集成:芯片设计的下一个发展方向
解决内存和性能瓶颈的一个潜在解决方案是3D 集成。传统处理器采用单层晶体管布局,但这种方法有局限性。3D 堆叠是垂直分层多层晶体管以提高密度、带宽和延迟的过程。这些堆叠层可以使用不同的制造工艺制造,并使用硅通孔 (TSV) 或混合键合技术连接。
3D NAND 存储技术是 3D 堆叠的早期商业成功案例,但现在高性能处理器也采用了类似的概念。AMD 的3D V-Cache 技术首次在Ryzen 7 5800X3D中推出,成功地在传统 CPU 之上堆叠了额外的 L3 缓存层,在游戏和延迟敏感型应用程序中实现了显著的性能提升。同样,英特尔的 Foveros 封装实现了堆叠逻辑芯片,允许单独制造不同的芯片组件,然后将其集成到单个封装中。
高带宽内存 (HBM) 是另一种广泛使用的 3D 堆叠内存形式,其中多个 DRAM 芯片堆叠在一起并通过 TSV 连接。与传统 DDR 内存相比,它具有更高的带宽和更低的功耗,已成为 AI 加速器、GPU 和 HPC 处理器的标准。Nvidia 的 H100 Tensor Core GPU 和 AMD 的 Instinct MI300 AI 加速器都利用 HBM 技术来处理 AI 工作负载所需的大量数据吞吐量。
未来展望
除了物理和架构变化之外,影响半导体行业的一个趋势是更加注重安全性。直到最近,处理器的安全性才被人们抛在脑后。这与我们所依赖的互联网、电子邮件和许多其他系统的设计几乎不考虑安全性类似。芯片上的任何安全性通常都是事后才加上去的,以便让我们感到更安全。
对于处理器而言,这最终会给公司带来麻烦。臭名昭著的 Spectre 和 Meltdown 漏洞是推测执行漏洞的早期例子,而最近,Zenbleed、Downfall 和 Hertzbleed 等旁道攻击表明,现代处理器架构仍然存在重大安全漏洞。因此,处理器制造商现在正在设计具有内置安全功能的芯片,例如机密计算、内存加密和安全区域。
在本系列的前几篇文章中,我们介绍了高级综合(HLS)等技术,该技术允许设计人员使用高级语言指定硬件设计,然后使用 AI 驱动的优化算法来生成最佳的电路实现。随着芯片开发成本持续飙升,半导体行业越来越依赖软件辅助硬件设计和 AI 辅助验证工具来优化制造。
然而,随着传统计算架构接近极限,研究人员正在探索全新的计算范式,以重新定义我们处理信息的方式。最有前途的两个方向是神经形态计算和光学计算,旨在克服传统半导体芯片的根本瓶颈。
神经形态计算是一个新兴领域,它模仿人类大脑处理信息的方式,使用人工神经元和突触网络而不是传统的逻辑门。与此同时,光学计算用光子处理器取代了传统的电子电路,光子处理器使用光而不是电来传输和处理信息。由于光子比电子传播得更快,阻力更小,因此光学计算机在某些任务上的表现甚至有可能超越最先进的半导体芯片。
虽然无法预测未来,但我们在此讨论的创新理念和研究领域应成为未来处理器设计的路线图。我们确实知道的是,我们即将迎来传统制造规模的终结。为了继续提高每一代的性能,设计师需要想出更复杂的解决方案。
我们希望本系列文章能够激起您对处理器设计、制造、验证等领域的兴趣。要涵盖的内容无穷无尽,如果我们试图涵盖所有内容,那么每一篇文章都可以填满一门高等大学的课程。希望您学到了新东西,并更好地了解了计算机在各个层面的复杂性。