嵌入式C语言自我修养:从芯片、编译器到操作系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 一颗CPU是怎么设计出来的

通过上一节的学习,我们已经知道了芯片制造的基本流程:从沙子中提取硅、把硅切成片,在硅片上通过掺杂实现PN结,实现各种二极管、三极管、CMOS管,就可以将我们设计的电路图转换为千万门级的大规模集成电路。接下来我们继续了解一款CPU芯片电路是怎样设计出来的。首先,我们需要了解一下CPU内部的结构及工作原理。想要搞懂CPU的工作原理,这里又不得不说一下图灵机。图灵机原型证明了实现通用计算机的可能性,奠定了现代计算机发展的理论基石。

2.2.1 计算机理论基石:图灵机

现代计算机理论的技术源头可以追溯到几十年前的图灵机。在20世纪40年代,英国科学家图灵在他发表的一篇论文中提出了图灵机的概念,大家有兴趣可以在网上搜搜这篇论文,公式很复杂,也很难看懂。我们简化分析,可以简单地理解为:任何复杂的运算都可以分解为有限个基本运算指令。

图灵机的构造如图2-18所示:一条无限长的纸带Tape、一个读写头Head、一套控制规则Table、一个状态寄存器。图灵机内部有一个机器读写头Head,读写头可以一直读取纸带,图灵机根据自己有限的控制规则,根据纸带的输入,不断更新机器的状态,并将输出打印到纸带上。

图2-18 图灵机原理图

比较图灵机原型与现代计算机,你会发现有很多相似的地方。

● 无限长的纸带:相当于程序代码。

● 一个读写头Head:相当于程序计数器PC。

● 一套控制规则Table:相当于CPU有限的指令集。

● 一个状态寄存器:相当于程序或计算机的状态输出。

不同架构的CPU,指令集不同,支持运行的机器指令也不同,但是有一条是相同的:每一种CPU只能支持有限个指令,任何复杂的运算最终都可以分解成有限个基本指令来完成:加、减、乘、除、与、或、非、移位等算术运算或逻辑运算。在个人计算机上,我们可以玩游戏、上网、聊天、听音乐、看视频,这些复杂多变的应用程序,最终都可以分解成CPU所支持的有限个基本指令,通过指令的组合运算来完成。

2.2.2 CPU内部结构及工作原理

基于图灵机的构想,现代计算机的基本结构就逐渐清晰了。如图2-19所示,CPU内部构造很简单,只包含基本的算术逻辑运算单元、控制单元、寄存器等,仅支持有限个指令。CPU支持的有限个基本指令集合,称为指令集。程序代码存储在内部存储器(内存)中,CPU可以从内存中一条一条地取指令、翻译指令并执行它。

图2-19 CPU内部结构

CPU内部的算术逻辑单元(Arithmetic and Logic Unit,ALU)是处理器最核心的部件,相当于CPU的大脑。理解了ALU的工作流程基本上也就理解了计算机的工作流程。ALU由算术单元和逻辑单元组成,算术单元主要负责数学运算,如加、减、乘等;逻辑单元主要负责逻辑运算,如与、或、非等。ALU只是纯粹的运算单元,要想完成一个指令运行的整个流程,还需要控制单元的协助。控制单元根据程序计数器PC中的地址,会不断地从内存RAM中取指令,放到指令寄存器中并进行译码,将指令中的操作码和操作数分别送到ALU,执行相应的运算。以两个整数A、B相加的指令为例,如图2-19所示,控制单元通过指令译码电路会将该指令分解为操作码和操作数,再根据操作数地址从内存RAM中加载(Load)数据A和B,传送到ALU的输入端,然后将操作运算类型(操作码)即加法也告诉ALU。ALU有了输入数据和操作类型,就可以直接进行相应的运算了,并输出运算结果。为了效率考虑,运算结果一般会先保存到寄存器中,然后由控制单元将该数据从寄存器存储(Store)到内存RAM中。执行到这一步,一个完整的加法指令执行流程就结束了,控制单元会继续取下一条指令,然后翻译指令、运行指令,周而复始。CPU内部有个程序计数器(Program Counter,PC),系统上电后默认初始化为0,控制单元会根据这个PC寄存器中的地址到对应的内存RAM中取指令,然后PC寄存器中的地址自动加一。通过这种操作,控制单元就可以不停地从内存RAM中取指令、翻译指令、运行指令,程序就可以源源不断地运行下去了。

早期CPU的工作频率和内存RAM相比,差距不是一般的大。控制单元从RAM中加载数据到CPU,或者将CPU内部的数据存储到RAM中,一般要经过多个时钟读写周期才能完成:找地址、取数据、配置、输出数据等。运算速度再快的CPU,也只能傻傻地干等几个时钟周期,等数据传输成功后才可以接着执行下面的指令。内存带宽的瓶颈会拖CPU的后腿,影响CPU的性能。为了提高性能,防止RAM拖后腿,CPU一般都会在内部配置一些寄存器,用来保存CPU在计算过程中的各种临时结果和状态值。ALU在运算过程中,当运算结果为0、为负、数据溢出时,也会有一些Flags标志位输出,这些标志位对控制单元特别有用,如一些条件跳转指令,其实就是根据运算结果的这些标志位进行跳转的。CPU跳转指令的实现其实也很简单:根据ALU的运算结果和输出的Flags标志位,直接修改PC寄存器的地址即可,控制单元会自动到PC指针指向的内存地址取指令、翻译指令和运行指令。跳转指令的实现,改变了程序按顺序逐步执行的线性结构,可以让程序执行更加灵活,可以实现更加复杂的程序逻辑,如程序的分支结构、循环结构等。

CPU所支持的加、减、乘、与、或、非、跳转、Load/Store、IN/OUT等基本指令,一般称为指令集。任何复杂的运算都可以分解为指令集中的基本指令。在软件层面上,我们可以把这些有限的基本指令进行不同的组合,实现各种不同的功能:播放视频、播放音乐、图片显示、网络传输。我们也可以基于这些基本指令实现新的指令,以除法运算为例,如果CPU在硬件电路上不支持除法指令,我们就可以基于CPU指令集中的原生加、减、移位等指令来模拟除法的实现,生成新的除法指令。

这种由基本指令组成的不同组合,我们称为程序。为了编程方便,我们给每个二进制指令起一个别名,使用一个助记符表示,这些助记符就是汇编语言,由助记符组成的指令序列就是汇编程序。汇编语言的可读性虽然比二进制的机器指令好了很多,但是当汇编程序很大、程序的逻辑很复杂时,维护也会变得无比艰难,这时候高级语言就开始问世了,如C、C++、Java等。高级语言的读写更符合人类习惯,更适合开发和阅读,如图2-20所示,编写好的高级语言程序通过编译器,就可以翻译成CPU所能识别的二进制机器指令。

图2-20 高级语言的编译流程

CPU内部的各种运算单元,无论是算术逻辑单元、控制单元,还是各种寄存器、译码电路,其实都是由大量逻辑门电路组合构成的:与门、或门、非门等。这些基本的门电路通过逻辑组合、封装和抽象,就构成了一个个具有特定功能的模块:寄存器、译码电路、控制单元、算术逻辑运算单元等。具有不同功能的模块再经过不断地抽象、堆叠和组合,就构成了一个完整的CPU内部电路系统组件。随着集成电路的发展,CPU也变得越来越复杂,现在的CPU可由上亿个门电路、几十亿个晶体管组成。如果靠手工一个一个门电路地连接它们,效率太低了,目前的CPU设计,一般都使用VHDL或Verilog硬件描述语言(Hardware Description Language,HDL)来整合ALU、内控制单元、寄存器、Cache等电路模块,然后通过电子设计自动化(Electronic Design Automation,EDA)工具将其转换为逻辑门电路。借助HDL编程和EDA开发工具,数字IC设计工程师只需要关心数字电路的逻辑功能实现,而具体物理电路的实现、布线和连接则由EDA工具自动完成,大大提升了工作效率。

2.2.3 CPU设计流程

集成电路(Integrated Circuit,IC)设计一般分为模拟IC设计、数字IC设计和数模混合IC设计。数字IC设计一般都是通过HDL编程和EDA工具来实现一个特定逻辑功能的数字集成电路的。以设计一款ARM架构的SoC芯片为例,它的基本设计流程如图2-21所示。

图2-21 SoC芯片设计流程

1.设计芯片规格

根据需求,设计出芯片基本的框架、功能,进行模块划分。有些复杂的芯片可能还需要建模,使用MATLAB、CADENCE等工具进行前期模拟和仿真。

2.HDL代码实现

使用VHDL或Verilog硬件描述语言把要实现的硬件功能描述出来,接着通过EDA工具不断仿真、修改和验证,直到芯片的逻辑功能完全正确。这种仿真我们一般称为前端仿真,简称前仿。前仿只验证芯片的逻辑功能是否正确,不考虑延时等因素。这个阶段也是芯片设计最重要的阶段,会耗费大量的时间去反复验证芯片逻辑功能的正确性。芯片公司内部一般也会设有数字IC验证工程师岗位,招聘工程师专门从事这个工作。以设计一个1位加法器为例,我们可以通过EDA工具编写下面的Verilog代码来实现,并通过EDA工具提供的仿真功能来验证加法器的逻辑功能是否正确。

3.逻辑综合

图2-22 数字电路的实现:逻辑门电路的组合

如图2-22所示,前端仿真通过后,通过EDA工具就可以将HDL代码转换成具体的逻辑门电路。专业说法是将HDL代码翻译成门级网表:Gate-level netlist,网表文件用来描述电路中元器件之间的连接关系。有数字电路基础的人都知道,任何一个逻辑运算都可以转化为基本的门级电路(与门、或门、非门等)的组合来实现,而网表就是用来描述这些门级电路的连接信息的。

在综合过程中,有时候还需要设定一些约束条件,让综合出来的具体电路在芯片面积、时序等参数上满足预期要求。此时的电路考虑了延时等因素,和实际的芯片电路已经很接近了。

现在很多IC设计公司一般都是Fabless。Foundry在集成电路领域一般指专门负责生产、制造芯片的厂家,如台积电、中芯国际等。Fabless是Fabrication(制造)和less的组合词,专指那些只专注于集成电路设计,而没有芯片制造工厂的IC设计公司。像高通、联发科、海思半导体这些没有自己的芯片制造工厂,需要台积电、中芯国际代工生产的IC设计公司就是Fabless,而像Intel、三星半导体这些有自己芯片制造工厂的IC设计公司就不能称为Fabless。

对于一些Fabless的IC设计公司而言,门级电路一般是由晶圆厂,也就是芯片代工厂以工艺库的形式提供的,如中芯国际、台积电、三星半导体等。如果你设计的芯片委托台积电代工制造,工艺制程是14nm,那么当你在设计芯片时,台积电会提供给你14nm级的工艺库,里面包含各种门电路,经过逻辑综合生成的电路参数,如延时参数,和台积电生产芯片实际使用电路的工艺参数是一致的。

4.仿真验证

通过逻辑综合生成的门级电路,已经包含了延时等各种信息,接下来还需要对这些门级电路进行进一步的静态时序分析和验证。为了提高工作效率,除了使用仿真软件,有时候也会借助FPGA平台进行验证。前端仿真发生在逻辑综合之前,专注于验证电路的逻辑功能是否正确;逻辑综合后的仿真,一般称为后端仿真,简称后仿。后端仿真会考虑延时等因素。

后端仿真通过后,从HDL代码到生成门级网表电路,整个芯片的前端设计就结束了。

5.后端设计

通过前端设计,我们已经生成了门级网表电路,但门级网表电路和实际的芯片电路之间还有一段距离,我们还需要对其不断完善和优化,将其进一步设计成物理版图,也就是芯片代工厂做掩膜版需要的电路版图,这一阶段称为后端设计。后端设计包括很多步骤,具体如下。

● DFT:Design For Test,可测试性设计。芯片内部一般会自带测试电路,如插入扫描链、引出JTAG调试接口。

● 布局规划:各个IP电路模块的摆放位置、时钟线综合、信号线的布局等。

● 物理版图验证:检查设计规则、连线宽度、间距是否符合工艺要求和电气规则。

物理版图验证通过后,芯片设计公司就可以将这个物理版图以GDSII文件的格式交给芯片制造代工厂(Foundry)去流片了。到了这一步,整个芯片设计、仿真、验证的流程就结束了,我们称为tap-out。

物理版图是由我们设计的芯片电路转化而成的几何图形。如图2-23所示,和PCB版图类似,物理版图中包含了集成电路元器件的尺寸大小、各层电路的拓扑关系等。物理版图也分为好多层,版图中不同的颜色代表不同的层,每一层都代表不同的电路实现。

芯片代工厂根据物理版图提供的这些信息来制造掩膜版,然后使用光刻机,通过掩膜版在晶圆的硅片衬底上开凿出各种掺杂窗口,接着对硅片进行离子注入,掺杂不同的三价元素和五价元素,生成PN结,进而构成二极管、三极管、CMOS管等基本元器件,构建出各种门电路。如图2-24所示,光刻机根据物理版图的不同层,制作不同的掩膜版,从底层开始,逐层制作,就可以在晶圆硅片衬底上生成多层立体的3D电路结构。

图2-23 从逻辑门电路到物理版图的转换

图2-24 从物理版图到实际的芯片电路

晶圆上的一个个CPU芯片电路在经过切割、封装、引出管脚、测试后,就是我们在市场上常见的各种CPU芯片了。

到这里,我们已经把芯片设计、制造的整个大致流程给大家分享完了。芯片的设计和制造看起来很简单,但实际上每个环节都有极高的技术含量。集成电路行业是一个极其专业而且高度分工的行业,每个环节都有不同的行业巨头或隐形冠军把守,从芯片的设计、验证仿真、制造加工、封装测试到各种EDA工具、IP核、光刻机、刻蚀机,每个环节都有非常专业的制造商、服务商、EDA工具商精密严谨地配合,大家互相促进,将CPU芯片一代又一代地不断更新迭代下去。

有了CPU处理器,还需要配套的主板或开发板、内存RAM、硬盘或Flash存储器,才能构成一个完整的计算机整机系统,这样才能运行我们编写的程序软件。接下来的一节,将继续给大家分享一些有关计算机体系结构的知识。