首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM SOC漫谈 2

ARM SOC漫谈 2

首先,受工艺的影响。现在先进的半导体工厂就那么几家,Intel,台积电,三星,联电,格罗方德。拿台积电来说,它目前提供16纳米的工艺,其中还分了很多小结点,比如FFLL++和FFC。每个小节点各有特点,有些能跑到更高频率,有些功耗低,有些成本低。在不同的工艺上,芯片能跑的最高频率不同,功耗和面积也不同。其次,受后端库的影响。台积电会把工艺中晶体管的参数抽象出来,做成一个物理层开发包PDK,提供给eda工具厂商,IP厂商和芯片厂商。而这些厂商的后端工程师,就会拿着这个物理层开发包,做自己的物理库。物理库一般包含逻辑和memory两大块。根据晶体管的channel length,会有不同特性,适合于不同的用途的单元cell。而怎么把这些不同特性的库里的cell,合理的用到不同的前端设计模块,就是一门大学问。一般来说,channellength越短,电子漂移距离越短,能跑的频率就越高。可是,频率越高,功耗就越大,并且是指数上升。除了cell之外,还会有9T/12T这种说法,这里的T是Track,就是cell的高度。T越大,电流越大,越容易做到高频,相应的面积也越大。还有一个可调的参数就是Voltage Threshold,决定了栅极的电压门限,门限越低,漏电越大,频率能冲的越高。
接下来,受布局和布线的影响。芯片里面和主板一样,也是需要布线的。每一层都有个利用率的说法,总体面积越小,利用率越高,可是布线就越困难。在给出一些初始和限制条件后,EDA软件会自己去不停的计算,最后给出一个可行的频率和面积。
再次,受前后端协同设计的影响。比如,某个访问memory的操作,如果知道处理器会花多少时间,用哪些资源,就可以让memory的空闲块关闭,从而达到省电的目的。这种技巧可能有上千处,不自己设计处理器是没法知道的,哪怕你有RTL代码。
再往上,就是动态电压频率缩放DVFS。这里需要引入功耗的组成概念。芯片功耗分成动态和静态两部分,静态就是晶体管漏电造成的,大小和芯片工艺,晶体管数,电压相关,而动态是开关切换造成的,所以和晶体管数,频率,电压相关。具体公式我就不列出了,网上有。控制动态功耗的方法是clockgating,频率变小,自然动态功耗就小。 控制静态功耗的方法是power gating,关掉电源,那么静态和动态功耗都没了。还可以降低电压,那么动态功耗和静态功耗自然都小。可是电压不能无限降低,否则电子没法漂移,晶体管就不工作了。并且,晶体管跑在不同的频率,所需要的电压是不一样的,拿16nm来说,往下可以从0.9V变成0.72V,往上可以变成1V或者更高。别小看了这一点点的电压变化,要知道,动态功耗的变化,是和电压成2-3次方关系的。1V和0.7V,电压差了50%,动态功耗可以差3.4倍。我看到过的数据,在500Mhz以下,处理器的动态功耗是小于静态功耗的,变成3GHz的时候,远高于静态功耗。
再往上,就是软件电源管理,控制功耗了。芯片设计者把每个大模块的clock gating和power gating进行组合,形成不同的休眠状态,软件可以根据温度和运行的任务,动态的告诉处理器每个模块进入不同的休眠状态,从而在任务不忙的时候降低功耗。这又是一个很大的话题,以后再展开。
从上面我们可以看到,功耗和性能其实是和在一起的。而芯片设计者可以用不同的工艺和物理库,设计出最高可运行频率,然后软件控制芯片动态运行频率和功耗。
那面积呢?其实也是相辅相成的。由于针对不同的逻辑,memory和布线,选用了不同的物理库cell,不同的track,形成的芯片面积也会不一样。通常来说,越是需要跑高频的芯片,所需的面积越大。频率差一倍,面积可能有百分之几十的差别。可别小看这百分之几十,对晶体管来说,面积就是成本,晶圆的总面积一定,价钱一定,那单颗芯片的面积越小,成本越低,并且此时良率也越高。
芯片成本除了制造费,还来自于授权费,工具费,流片费,运营开销等,通常手机处理器这样复杂的芯片,没有上千万美元是不可能做出来的。就算做出来,没有卖掉几百万片,那是肯定亏的。
最后还想提下ARM的大小核设计。其最初的目的是想设计两组核,小核每赫兹性能低,面积小,跑在低频;大核每赫兹性能高,面积大,跑在高频。运行简单任务,大核关闭,小核在低频,动态功耗低,静态功耗占上风,并且由于面积小,总体功耗更低。而大核用高频运行复杂任务。和x86的单纯调节电压频率比,增加了一点低频小核面积,和整个芯片的面积比,其实没多多少。

那为什么不让小核跑在高频运行复杂任务呢?理论上,由于每赫兹性能低,对于相同的任务,小核必须跑在比大核更高的频率才能完成,这就意味着更高的电压。此时,动态功耗占上风,并且和电压成三次方关系。最终的功耗会高出大核不少。此外,我们前面已经解释过,小核要跑在高频,面积会增大不少,可能比大核还要大。我们从里面可以看到存在一个平衡点。这个平衡点并不好找。拿A53/A57在28nm上举例,当它们跑在1.2Ghz的时候,功耗可能差两倍,性能却只差50%。而平衡点可能要达到2Ghz。事实上,很多手机芯片的大小核都是使用同样的处理器,跑在不同高低频率。
所以,设计芯片很大程度上就是在平衡。影响因素,或者说坑,来自于方方面面,IP提供商,工厂,市场定义,工程团队。水很深,坑很大,没有完美的芯片,只有完美的平衡。在这点上,苹果是一个很典型的例子。它的CPU频率不很高,但是Geekbench单核跑分却比海思的 A73高了整整75%,接近Intel桌面处理器的性能。为什么?一个原因是它使用了六发射,而A73只有双发射,流水线宽了整整三倍。这里,苹果用了大量的面积换取性能。当然,三倍的发射宽度并不表示性能就是三倍,由于数据相关性的存在,发射宽度的效益是递减的。再一点,苹果使用了整整6MB的缓存,而这个数字在别的手机芯片上通常是1MB。我做过测试,对一些标准跑分,比如SpecInt2000/2006,128KB到256KB二级缓存带来的性能提升仅仅是7%左右,而256KB到1MB带来的提升更小,缓存面积却是4倍。面积的提升同样带来了静态功耗的增加。不过由于苹果的生态都是他自己的,它引入的复杂的电源,电压和时钟控制,并从软件层面就开始优化,将整体功耗控制的非常好。但是也只有苹果能这么做,一般公司绝对不会走苹果这样用2-3倍面积换性能和功耗的路线,那样的话毛利就太低了。而没有手机整体高利润的保障,也没有统一的软件系统控制功耗,其结果就是一个死。

下面,让我们从访存这个简单的问题开始讨论SoC。CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。
知道了完整的路径,那我们开始研究每一步中的硬件到底是怎么样的,读写指令到底是怎样在其中传输的。要了解硬件,首先要说下处理器。处理器的基本结构并不复杂,一般分为取指令,译码,发射,执行,写回五个步骤。而我们说的访存,指的是访问数据,不是指令抓取。访问数据的指令在前三步没有什么特殊,在第四步,它会被发送到存取单元,等待完成。当指令在存取单元里的时候,产生了一些有趣的问题。
第一个问题,对于读指令,当处理器在等待数据从缓存或者内存返回的时候,它到底是什么状态?是等在那不动呢,还是继续执行别的指令?一般来说,如果是乱序执行的处理器,那么可以执行后面的指令,如果是顺序执行,那么会进入停顿状态,直到读取的数据返回。当然,这也不是绝对的。在举反例之前,我们先要弄清什么是乱序执行。乱序执行是说,对于一串给定的指令,为了提高效率,处理器会找出非真正数据依赖的指令,让他们并行执行。但是,指令执行结果在写回到寄存器的时候,必须是顺序的。也就是说,哪怕是先被执行的指令,它的运算结果也是按照指令次序写回到最终的寄存器的。这个和很多程序员理解的乱序执行是有区别的。我发现有些人在调试软件问题的时候,会觉得使用了一个乱序的处理器,那么可能会使得后面的代码先被执行,从而让调试无法进行。他们搞混了两个个概念,就是访存次序和指令完成次序。对于普通的运算指令,他们仅仅在处理器内部执行,所以你看到的是写回次序。而对于访存指令,指令会产生读请求,并发送到处理器外部,你看到的次序是访存次序。对于乱序处理器,可能同时存在多个请求,而其次序,是打乱的,不按原指令顺序的。但是此时,这些被发送到外部的读请求,并没有拿到返回结果,指令也没有完成。所以,这并不违反乱序执行顺序完成的原则。如果有前后两条读指令,没有数据相关性,哪怕是后面那条读的数据先被返回,它的结果也不能先写回到最终的寄存器,而是必须等到前一条完成后才可以。
对于顺序执行的处理器,同样是两条读指令,一般必须等到前一条指令完成,才能执行第二条,所以在处理器外部看到的是按次序的访问。不过也有例外,比如读写同时存在的时候,由于读和写指令实际上走的是两条路径,所以可能会看到同时存在。这个问题在引入更详细的硬件结构之后再展开。
返回列表