一本正经的八卦一下CPU的自主可控 之二
https://zhuanlan.zhihu.com/p/62399200
一本正经的八卦一下CPU的自主可控 之二
上回书说到CPU自主可控第一个层面的指令集问题。这回聊一聊接下来的设计问题。
第二篇 CPU设计篇
在设计层面,也有两种路线:一种是自主设计,一种是拿来主义。
CPU自主设计的含义是,从目标需求和功能定义出发,完全正向设计CPU的每一个单元和模块。说得白话一点,一针一线、一砖一瓦都是我自己的,里里外外、上上下下我都一清二白。这种设计思路显然不会带入任何主观的“后门”(除非人都没控制好,被恶意植入,这在后面的人才层面进行讨论)。设计环节还包括所用到的工具和设备,一些流程需要借助工具或者设备自动完成。要保障CPU设计上完全的清清白白,这些工具和设备也是要符合自主可控的条件,否则我们有理由怀疑在这些自动化过程中可能被混入非法逻辑。如果继续追溯下去,生产、设计这些工具和设备的厂商在其整个流程环节上也要做进一步的检查,在这些工具和设备的设计制造过程中是否保证可控……可能有人会说这是杞人忧天,但安全无小事,还是小心为妙。
拿来主义则是完全照搬照抄国外已有的设计,也就是一些专家口中的“马甲”——本山小品深入人心,形象传神。“马甲”CPU的核心代码或技术都是来自境外,而且本土没有什么有经验的技术团队来消化理解,里面有没有“后门”也搞不清,充其量只能算是国产品牌,供货可能没问题,但是技术保障和可持续发展能力就堪忧了。这种技术路线在设计层面显然无法实现自主可控。
由于CPU的功能复杂、模块众多,以上两种路线都显得过于极端,现实中的国产CPU往往介于两者之间,但区别在于是不是关键的模块进行了自主设计,另外在关键环节上是不是使用了自主的工具和设备。至于哪些模块关键、哪些模块非关键,哪些环节关键、哪些环节非关键,就是见仁见智了。通常我们认为处理器核是关键的,毕竟它负责计算,没他不行;存储是关键的,毕竟他负责数据,没它不行;互连也是关键的,毕竟它负责通信,没它不行;IO好像也是关键的,毕竟……这样排下去,好像一个都不能少,毕竟谁会闲着没事放一些没用的东西占地方呢。所以,宣传者往往自己能做哪个就说哪个是关键的。
所以现在的国产CPU基本都采用折中路线,毕竟自主可控不代表回到原始社会。如果真的回到了原始社会,就算是自主可控了,这仗可怎么打?
国内做CPU的历史其实应该是在90年代末才开始。如果再往上追溯一下,更早的104机、109、441B,以及银河1、银河2都自己做了中央处理机,而不是中央处理器。为什么叫处理机呢?因为是用分离元器件或者小规模集成电路搭建的,而不是现代意义上超大规模集成的CPU芯片。如果在八九十年代大学上过计算机原理这一类课程,应该都有用74LS这类元器件搭乘法器、加法器、控制器的实验课经历。
国内真正讲设计CPU这类芯片的缘起还是由于禁运引起的,尤其是军用装备里的CPU。当时不光是中国,美军也讲究COTS(Commercial Off-The-Shelf ),即尽可能采用成熟的商用货架产品来满足军用装备需求,最大好处就是节省时间和成本,但最大的问题是商用产品周期短,而军用装备周期长,供货保障是个问题。中国的军用装备除了断货这个坎儿之外,还可能面临被禁运。于是需求最先由军方提起,指定国内一些企业和科研院所仿制当时市场上主流的CPU,以备不时之需,学名叫做反向设计。别小看这个反向设计,它可不是简单的抄袭,而是将产品晶圆剖开,一层层打磨、照相,然后一个晶体管一个晶体管的进行功能分析、逻辑成图,再进行可靠性加固、模拟验证,最后到目标工艺线上的生产。这个过程对设计人员的电路能力、逻辑能力和结构能力都是极大的挑战和历练,据说哈军工(现在叫国防科技大)的CPU和DSP团队就是从这个过程中摔打出来的,深圳有家公司早期也是专门做反向,有个芯愿景据说也是在这个过程中为反向设计做EDA从而成长起来的工具公司。国防科技大曾经反向的一款CPU是Intel x86,管脚级兼容,因为改了工艺、做了加固,性能和可靠性都比商用x86要好。后来据说国内还想反向其他高性能的x86,被国内的正向派给拍死了,说龙芯都出来了,还反向个球,上龙芯不就完了。说实话,十五六年过去了,现在几家国产CPU的单核性能比PentiumIII也没强到哪儿去,当年更是没法看。有朋友可能会说:胡说,龙芯现在都PK酷睿i3、i5了。翻翻十年前龙芯就已经赶英超美的新闻报道,你就能够深深折服于这种表演,如果你还没看明白,请参考最近奥迪pk小龙虾的戏码。当年反向的芯片都用在了关键装备上,现在正向的芯片却没有几个敢真用的,这是不是有点讽刺?
反向设计是CPU打破禁运实现国产化的一种途径,但却不是国产CPU产业发展的可行之路,在军方用用可以,在商用领域显然是不能拿出来卖的。所以现在大家讲国产CPU都是指正向设计,都是放在产业层面来考虑的。如果只是军用,仿制和偷制(不拿授权)都是可行的解决方案,就那么点量,影响不了他的利益,美帝也懒得管你。
正向设计国产CPU始于新世纪之初,2001年8月,龙芯基于MIPS 32用了3个月的时间改了一个Godson1出来(小名“狗剩”),在FPGA上boot了OS,并写了篇雄文《我们的CPU》(有兴趣的可以去网搜看看),点燃了民众对国产CPU的热情。几乎同一时间,被20多个专家鉴定为“国际先进水平”的“方舟一号”也横空出世,但“方舟”严格来讲还是嵌入式CPU,而龙芯1号却是瞄着通用CPU去的(虽然现在的龙芯1号定位为嵌入式解决方案,但当时是准备跟intel对标的)。那时候“方舟”已经是样片了,龙芯1号只是在FPGA上boot了操作系统,到2002年才流片。所以,我觉得算第一个正向还得是方舟,^_^。
从那时起,国家开始逐步重视国产CPU的发展,从863计划立了几个课题来支持。除了龙芯、方舟之外,国内几家有芯片设计底蕴的单位都得到了课题,北大众志、国防科技大、上海高性能、中天微等等,当然还有汉芯。与龙芯类似,北大众志、上海高性能分别在AMD的x86处理器和DEC的Alpha21264处理器的基础上进行改进设计,很快就拿出了第一代产品,但国防科技大走了一条完全不同的路。可能是因为自己的超算技术路线,国防科技大决定设计兼容IA-64的CPU。但大家都知道IA-64是当时Intel和HP最新开发的指令集,产品是安腾Itanium,号称最牛B的服务器CPU。与其他路线不同,这个CPU的设计代码是无法拿到或买到的,有的只是IA-64指令集架构手册。所以,实际上国防科技大选择了一条最难的路,完全从指令集手册开始正向设计当时世界上最炙手可热的IA-64处理器。这个项目的结局也颇具悲剧色彩,课题延期两年才验收,最终的芯片虽然达到了项目验收要求的指标,但离真正的商用还有很长的路要走。在这个阶段,国防科技大就像一个革命的理想主义者,怀着一腔热血奔赴最前线。但事实证明,John Hennessy和David Patterson的柱书与算盘书吃得再透,也不如下海真正游两个来回。据说让国防科技大踩雷的,不是分支预测、流水线控制、运算器、访存这些标准件,而是DFT。听说由于DFT没做好,这款兼容IA-64的国产CPU花费了很大的精力才定位几个bug,最终得以用软件的方法workaround。项目虽然不算成功,但国防科技大在这个过程中却收获颇丰。一方面,国防科技大正向设计的团队已经初具规模,另一方面,在这个过程中一些小的衍生成果也有惊喜。一个课题组设计了自定义指令集的银河腾越32位嵌入式处理器,一个课题组设计了兼容ARMv7指令集的nnARM处理器,性能跟ARM9差不多,而且把源代码放到了开源社区供人免费下载。本着八卦到底的精神,据说这个nnARM还引来了ARM法务的律师函,可是国防科技大置之不理,至于为什么你懂的。脑补一下课题组的表情,应该是:x86、IA-64我都做了,你个ARM没人要的指令集牛逼啥?
第一阶段的这几家国家支持的团队里面还有一个比较牛逼的,那就是上海高性能的申威。除了它的背景牛逼,这里说他牛逼是指他在第一阶段所采取的设计方法很牛逼,而且也带有比较大的理想主义色彩。虽然它的逻辑设计来自alpha 21264,但他采用的物理设计方法不是拿现成的单元库来综合和优化,而是直接跟Foundry合作定制优化的CPU单元库。这样做的好处是显而易见的,能够提高芯片频率、优化功耗,2008年申威2在0.13um工艺上就做到了大约1.4GHz,成为国内翘楚,当时国内其他同行还停留在几百MHz(当然这里面有流水线等微结构设计的差别,并不代表它们之间的差距。比如,采用比较深的流水线就容易把频率坐上去,但性能不一定高)。但这样做的问题也是显而易见的,这意味着申威必须付出巨大的精力去研究Foundry的工艺参数,然后定制出符合自己需求的标准单元。不管这个工作是Foundry做还是申威做,都意味着研制周期的加长以及双方利益的捆绑。申威不是IDF,所以Foundry愿不愿意合作取决于申威能提供多大的量,当时显然没什么量;另一方面,申威的付出是否是值得的?耗费巨大精力定制单元库大大延长了产品研制周期,而且每换一代工艺就定制一套单元库对于申威的规模显然是不现实的。因此,到第三代,申威放弃了定制单元库的做法,改为直接采用foundry标准单元库,升级了两代工艺,芯片频率却只提高到1.6GHz。所以,申威早期的做法也带有些许悲剧的理想主义色彩,方法是对的,但现实是残酷的。但无论如何,这种物理设计的方法是解决当前工艺落后条件下提升芯片性能的路径之一,希望还能持续下去。
这几家后续的发展都是近十年的事,这一波搞自主可控的应该都了解,信息就比较多了,我想八卦点儿网上没有的(坏笑~~)。龙芯在产业化后迫于知识产权和市场的压力购买了MIPS的授权和技术(期间还有一段时间是通过购买ST的技术来解决的),但由于核高基项目的失利转战中低端市场。虽然技术上略逊一筹,但机制体制灵活一些,在目前几家通用CPU里面市场化宣传做得最好,产业化也领先一步,无奈人才流失的有点多(后面讲人才再详细说)。申威继续着alpha处理器的研发,而且一直是国家项目的宠儿,但出于多种原因,再也没有采用第一代的设计方法。申威处理器的架构经过多代的更新,也已经与原始的alpha差别很大,通用CPU已经是16核的1621,工艺28nm,但频率还是停留在1.8GH左右,同时衍生了桌面和嵌入式的芯片,应用在太湖之光中的HPC专用的申威21060更是为国人长了脸,产品线算是很全了,可惜产业化没法推,除了生态的原因还有体制内的人无法言说的痛楚。国防科技大在后面几年虽然成功设计了流处理器FT-64(当年拿下了大陆第一篇ISCA论文,算是超算加速器的先驱或先烈),但只在超算上作为加速器用了一下,并没有引起太大的波澜。国防科技大在IA-64上的失利,再加上IA-64本身的日渐颓败,促使国防科技大转向SPARC,陆续推出了两款面向超算的SPARC芯片。不知道是不是属地偏远的原因,感觉在拿国家项目上总是差那么一口气。方舟的折戟沉沙可以参见梁宁纪念文《一段关于国产芯片和操作系统的往事》。众志在经历了核高基产业化项目的失败后,也已经不再沾惹通用CPU这个领域,转战其他应用领域。
无论是CPU的反向设计还是正向设计,只要是全面掌控了其功能设计,都可以满足自主可控对于安全这个目标的主要诉求——无主观恶意的后门。当然,安全还有另外一个隐患,也就是设计能力有限引入的无意漏洞,这就跟设计能力息息相关了,君不见Intel玩了一辈子鹰,都被鹰啄了眼(参见2018年初的幽灵和熔断漏洞),更不用说国内这些才蹒跚学步的了。所以,国产CPU设计要学的还有很多,千万别太自负了,该交的学费还是要交。
在国产CPU的第一个十年,到处是荒芜与野蛮,一个失败接着一个失败,有激情燃烧的岁月,也有欲说还休的娇嗔,有明修栈道的刚猛,也有暗度陈仓的龌龊,但毋庸讳言,中国CPU设计的火种埋下了,CPU对于中国人而言不再遥远,不再只是一个黑盒,不再是雾里看花,中国开始了奔向星辰大海的征程,更关键的是有了自己的一拨人马。心若在、梦就在,人在,希望就在。