汽车系统级芯片SoC的核心构成包括CPU、GPU、AI加速器和片上总线及互联。CPU目前主要是ARM架构,x86架构和RISC-V架构。ARM架构占据绝大多数市场。
图片来源:互联网
这是2013年ARM初创期的商业模式,时至今日变化不大,只是更新速度大大加快了,基本上一年一个新架构。ARM的半导体协作者主要是晶圆代工厂,二者需要相互支持,目前能跟上ARM步伐的只有台积电和三星。
ARM授权分4个等级。
图片来源:互联网
从1到4授权费依次递增,可定制的深度依次递增,开发难度依次递增。想开箱即用,选POP IP,基本上可以直接给晶圆代工厂制作芯片,ARM已在各方面优化过了,没有任何改动空间。想要公版架构无法给与的差异化性能与体验,上架构授权是不二选择。指令集是通过物理硬件晶体管寄存器嵌入进架构里的,它不像是一个软件,更像是一个硬件。因此要获得架构授权就必须获得指令集授权,两者无法分割。但如果不是架构授权,就无需获得指令集授权。
三种IP对比
图片来源:互联网
第二级Artisan Physical IP有时亦简写为IP。厂商拿到ARM的处理器部分的Core授权之后(Verilog-HDL形式的CPU设计源码,也就是上面的软核部分),结合厂商自身的外设和存储,在EDA工具的配合下进入固核的设计阶段。IP Core授权的内容不止包含处理器,还包含ARM公版的外设、内存控制器等,厂商有选择的余地。
BoC是2016年特别为高通打造的授权方式,也叫Cortex授权。
图片来源:互联网
上图为BoC与架构授权之间的区别,据说只有高通使用。架构授权是最高级的,难度也最高,价格也最贵,灵活程度最高,苹果是架构授权里做得最好的,改动幅度最大,特别是前端和指令集窗口,都做了大幅度改动。其他厂家也有改动,但改动幅度很小,特别是前端几乎没有任何改动。
图片来源:互联网
微架构就是像A57、A78这样的称之为微架构。微架构分前端、执行引擎和存储系统三个组成部分。依照关键程度有译码宽度、缓存容量、ALU数量、发射端口、指令缓存。
这一节只讲译码宽度。影响CPU算力最关键的参数是Decode Wide译码宽度,译码宽度可简单等同于每周期指令数量即IPC,即每个周期完成多少个指令。
资料来源:互联网
译码宽度的增加是非常困难的,不是想多少就多少的。简单来说每增加一位宽度,系统复杂度便会提高15%左右,裸晶面积也就是成本会增加15-20%左右。如果简单地增加译码宽度,那么成本也会上涨,厂家就缺乏更新的动力,所以ARM的做法是配合台积电和三星的先进工艺,利用晶体管密度的提高来减少裸晶面积降低成本,因此ARM的每一次译码宽度升级均需先进制造工艺的配合,否则成本增加比较多。同时ARM也从商业角度考虑,每年小升级一次,年年都有提升空间。8位宽度是目前的极限,苹果一次到位使用8位宽度,缺点是必须使用台积电最先进的制造工艺,但苹果依然使用的是ARM的指令集。
此外,RISC和CISC还有区别,CISC增加宽度更难,但CISC的1位宽度基本可顶RISC的1.2-1.5位。英特尔是有实力压制苹果的,就是制造工艺不如台积电。CISC指令的长度不固定,RISC则是固定的。因为长度固定,可以分割为8个并行指令进入8个解码器,但CISC就不能,它不知道指令的长度。因此CISC的分支预测器比RISC要复杂很多,当然目前RISC也有长度可变的指令。遇到有些长指令,CISC可以一次完成,RISC因为长度固定,就像公交车站,一定要在某个站停留一下,肯定不如CISC快。也就是说,RISC一定要跟指令集,操作系统做优化,RISC是以软件为核心,针对某些特定软件做的硬件,而CISC相反,他以硬件为核心,针对所有类型的软件开发的。
要全面理解微架构,我们先取一个简化模型,如下图。
典型CPU简化架构
资料来源:互联网
程序控制:控制程序中指令执行的顺序。
操作控制:产生指令执行所需的操作控制信号,以控制执行部件运行。
时序控制:控制每个操作控制信号的开始和持续时间。
数据加工:对数据进行运算,在相关部件间传送。
中断处理:及时响应内部异常和外部中断请求。
指令简单流程,资料来源:互联网
一条指令的执行通常包括以下4个步骤: 取值(Fetch):CPU里的控制器查询下一条指令的地址,并向存储器发起请求;存储器返回该地址对应的存储单元上的指令给控制器并存放到存放当前指令的位置上,此时控制器更新下一条指令的地址。译码(Decode):控制器解析指令,将之转化为一系列的控制信号(包括去哪里取运算数,对应的运算符,运算结果的存放位置等)。执行(Execute):根据译码的控制信号执行指令,从存储器的存储单元或CPU内部的通用寄存器上读取运算数,然后根据指令规定的运算符,让运算器进行运算。回写(Write-back):根据指令要求,把运算器的运算结果存储到某个通用寄存器上。
寄存器Register,寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,可用来暂存指令、数据和位址。在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
通常芯片设计也只是到寄存器这一级,剩下的可以交给EDA工具自动生成。
图片来源:互联网
IR (instructionregister指令寄存器):即存放当前指令的位置
PC (programcounter程序计数器):存放下一条指令的地址,可以自增更新下一条地址,即指令备忘录
MAR (memoryaddress register存储器地址寄存器):存放当前访问的存储单元的地址
MDR (memorydata register存储器数据寄存器):存放当前访问(读/写)的存储单元的内容
图片来源:互联网
这些控制信号在持续时钟脉冲的同步下去控制CPU中各个控制部件的动作
图片来源:互联网
ALU (算术逻辑单元),用于完成算术运算和逻辑运算,两个操作数Y、X分别从ALU的A端口和B端口进入,经过ALU计算后,将结果送到输出端口Z;其中X、Y、Z是ALU用来暂时保存数据的寄存器,是ALU的一部分;而F用于存放运算结果的状态,如是否产生进位、是否溢出等。ALU所需的数据来源于存储器,但是如果每一次运算都去存储器取数,运行效率太低;所以一些常用的数需要提前从存储器中取出来,相应地,需要在运算器中有临时存放这些数的器件,就是所谓的通用寄存器。
算术运算:加、减、乘、除、开方、平方、倒数,逻辑运算:与、或、非、异。算术运算可以拆解为众多个加法,更绝对一点儿说,计算的一切,也就只有加法。逻辑运算近似于函数运算。计算机一般采用二进制,和就是‘异/或’门,进位就是‘与’门。这样用门电路就设计出一个加法器。只考虑了向后进位,而没有考虑前一个数皆进位,因此我们称这种装置为半加器。如果将前一个进位考虑进来,只需再多一个半加器就可以了,这就是全加器。
图片来源:互联网
一位计算器做出来之后,8位计算器就只需将全加器逐个拼起来即可,并且再次抽象整体,我们称之为8位加法器。 一位全加器+函数发生器可以构成一位全功能全加器,不仅可以进行算数运算还可以进行逻辑运算。 下一期将介绍CPU的缓存系统,指令级并行的超标量与超流水线。