前言
这是龙芯处理器主要设计人员胡伟武发布在中国科大BBS站[bbs.ustc.edu.cn]的两篇文章,一年过去了,龙芯终于正式发布,回头再读读这些文字,的确有一些别样的滋味……
我们的CPU
胡伟武
我参与计算所的CPU开发项目,源于2000年10月一个偶然的机缘。10月中旬,所领导派我到我的母校中国科技大学去进行招生宣传。这是我1991年毕业后第一次回到母校。我回到了我原来工作过的实验室,十年前在那里,我曾经和另外一个同学一起做过一个与8086指令级兼容的处理器作为本科毕业设计。这是一个用400多个74LS系列的芯片搭起来的电路,能够运行8086指令系统中除了十进制和除法指令以外的所有指令。由于没有制版的费用,所有的连线都是手工焊的。这次回去,我看到了我原来做的机器还静静地躺在那里。面对与十年前一样凌乱的实验室和满桌触手可及的芯片、电容、电阻、电烙铁,我有一种重操旧业的冲动,因为十年前那些没日没夜地与逻辑门、触发器、译码器、选择器玩命的日子有一种深深的诱惑,至今我还可以如数家珍地说出好多当前我用过的集成电路芯片的引脚定义。我想到了我们所正在筹备的CPU设计项目,于是我给我的师兄唐志敏打电话,他是计算所系统结构室的室主任,目前正负责计算所CPU设计项目的准备工作。我开玩笑说一、二年之内不把通用操作系统boot起来,提头来见。于是回计算所后,我就开始考虑CPU的指令系统和流水线等问题。
2001年8月19日,前苏联解体的十周年纪念日,我们设计的Godson CPU成功地把LINUX操作系统boot起来。当 “login:” 的提示符出现在屏幕上时,计算所北楼309房间一片欢呼。到9月中旬,一个用我们自己设计的CPU的完整计算机系统已经浮出水面,该系统运行完整的LINUX操作系统, 内核版本为2.4,可以做其他运行LINUX操作系统的计算机所支持的一切事情,包括运行gcc编译器,X-window视窗系统,WEB服务器,SPEC CPU2000基准程序等。我们最引以为豪的还是该CPU的系统结构设计。可以说目前世界上最先进CPU的系统结构技术,该有的Godson都有,不少地方还有创新。虽然目前我们只是基于FPGA的设计,主频也不高,但当我们的CPU运行到12.5MHz时,其性能已经不比50MHz主频的Intel 486差(当然, 我们的主板比486主板要好),确切地说,浮点性能比486强一点,定点性能比486差。值得一提的是,当我们用一个叫“偏执狂(Paranoia)”的测试程序测试CPU的浮点部件是否符合IEEE 754标准时,奔IV处理器测出了浮点不严格符合IEEE 754标准而我们的CPU完全符合标准。此外,在Godson中还专门针对网络攻击进行了安全设计,可以有效防止利用缓冲区溢出技术进行的攻击。
应该指出的是,我们只是完成了一个CPU的逻辑设计,目前是用FPGA对这个逻辑设计进行验证,只是一个阶段性成果,还没有进行投片。用李所长的话说,“三分之二的工作还在后面”。如果我们对目前的工作沾沾自喜,那是很肤浅的。但即使是这个成果的取得,也来之不易。个中滋味,酸甜苦辣俱全,很难为外人所体会。回顾我们开发Godson处理器的过程,虽然不长,但有教训,也有经验,总结一下,对以后的工作是有好处的。
我们做CPU设计缘起于所长李国杰院士的直接推动。李老师是我接触过的院士中比较钦佩的一个,因为他能够站在如何发展整个国家的信息产业的角度来考虑问题,而不是一个局部的角度。现在我慢慢知道,他推动我们所做CPU设计是很不容易的。也许是由于前几年计算所的反复折腾给人留下了不好的印象,使得很多人觉得计算所没有能力做CPU,李老师最后只能把CPU设计作为一个计算所的所内项目先做起来。我在计算所连读书带工作十来年,也是第一次体验到不用立项申请而直接开始做一个课题。CPU设计技术是核心技术,但市场壁垒很高,即使现在已经投片出来很好的CPU,如果没有人用就会走入以前“鉴定会就是追悼会”的怪圈。但我相信李老师在信息产业界的经验和影响力,所以决心做下去。
我的师兄唐志敏是系统结构室的室主任,他把握着整项工作的大局,领导整个CPU设计的总体规划。他的大度和谦和能够把一批非常能干的年轻人团结在一起,使大家互相之间从无猜忌。现在在科技界有一种奇怪的现象,就是一个年轻人作出一些成果之后,就喜欢独立门户,结果造成了科研力量分散,干不成大事的局面。大家都在沾沾自喜地干一些几十万或顶多是上百万的项目,形成不了很大的力量。在我们的项目组中,却有一批本身也很厉害,能够独挑一摊的年轻人紧紧地团结在一起,同心协力干一件事情,一个重要的原因是唐志敏是一个能够容人的领导。举一个简单的例子,在所里后来立的一个CPU设计的项目中,我是项目负责人,但包括项目申请书、每月一次的课题进展状况及支出情况表、以及鉴定会材料等,我一个字也没有写过,全是唐志敏代劳,使我有90%以上的时间能够用在编程和逻辑设计。这只是一件小事,但我在计算所十来年,见了不少下属帮领导写报告的事,却从未见过领导帮下属写报告的。唐志敏在全局的把握和总体规划上也是有独到的见解,至少是我所不能及的。关于我们未来CPU的用途,我的主张是自己做高性能工作站,但做出来干什么以及如何与别人竞争却难说,唐志敏却非常有数,他说现在我们所的软件室正在做电子政务,以后结合在一起做,至少在安全方面是国外产品无法竞争的。我当时觉得这种眼光真是“高瞻远瞩、高屋建瓴”。
张志敏老师在我们的CPU设计中负责工程管理,他是李所长请来的客座研究员。根据我们自己的分工,在我们设计CPU的队伍中,唐志敏是总负责,我负责设计,张老师负责工程管理。张老师是责任心非常强的人,很义气,工程经验非常丰富。我最佩服张老师的有两点,一是他把个人利益看得很轻,他放弃了原来工资更高的工作到我们这里来做这个事情;二是他做事情很实在、很专一。我有一个观点,一个人一辈子做好一件事情都不容易,因此比较讨厌一些一会儿这边,一会而那边,想两边都得好处的人。但张老师不是这样的人,他做事情很实在。在我们基本完成Godson的逻辑设计后,需要一个模拟主板的环境,以便在逻辑设计上通过软件模拟启动LINUX。我觉得这个事情很难,但张老师加班加点一两个星期就写出来了。我和张老师配合得非常好,简直是最佳搭档。他工程经验很丰富,我理论上强一点;做事情他比较稳重,我比较偏激。在每周一上午的例会上,我布置完本周的工作后,总要慷慨激昂地动员一番,张老师总是要摆一些困难泼泼冷水,真是一张一弛。以致于有一次他不泼冷水了,大家都不习惯。
虽然我们所筹备CPU设计已经由来以久(从2000年初就开始做预研),讨论了许多轮。但我们真正开始动手设计是2000年11月。刚开始是唐志敏和我领着七、八个研究生做系统结构设计,主要是确定指令系统以及流水线结构。在开始设计之初,李所长在全所会议上就定了“高性能、通用、一步到位”的目标。后来,唐志敏和我又确定了兼容以及采用RISC结构这两个具体目标。当时虽然IA-64结构炒得挺热,但我们还是决定采用RISC结构,现在看来,这是对的。指令系统我开始建议与Alpha兼容,但唐志敏定为与MIPS兼容。说实在的,从2000年11月到2001年4月这段时间,我对CPU这个项目还不够重视,因为我原来做机群及共享存储系统也做得挺有意思。在这段时间里,我自己还花一部分时间在做机群方面的事情,写了一些论文,4月底还到美国开了一个并行处理方面的国际会议。5月初从美国回来后开始全力投入做CPU设计。由于时间紧,在确定流水线结构时,没有看多少论文也没有做多少实验,主要是凭感觉和过去的积累,遇到权衡得失确定不了的事情,就与唐志敏讨论让他定夺。不过,现在回过头去看,由于当时没有参考别人的方案,也就少一些禁锢。现在有了一点时间开始看别人的做法,发现我们设计的基于操作队列复用的动态指令流水线还是很先进的,有不少创新点,我自己觉得比MIPS R10000的指令流水线要强。
我们的工作真正全面铺开是在五一放假上班后。一方面,系统结构已经基本定型,用C语言写的模拟器已经差不多了,可以运行简单的指令和短程序了。另一方面,6月份突然接到所里的通知说今年10月份45周年所庆要展示我所在CPU设计方面的成果。从6月开始,我们开始了夜以继日的三个月。在此期间,队伍迅速扩大,现在已经有三、五十人。虽然只是一个逻辑设计,能够在三个月内从无到有地设计出完整的通用CPU,我自己也觉得吃惊。现在回想起来,成功的原因有三条,一是技术路线正确,二是有一支高素质而玩命的队伍,三是计算所良好的环境和雄厚的技术储备。教训有两条,一是工程经验不足,初期管理不善;二是不重视工具。
我觉得,我们的技术路线在三个方面是很成功的。一是所长关于高性能通用CPU的定位。不少人认为,处理器最大的市场在嵌入式方面,中国的处理器设计应该定位在嵌入式上,没必要或没能力做通用处理器设计。诚然,嵌入式处理器的需求量很大,但大市场不一定能赚钱,小市场有时反而能赚大钱,因为后者是核心技术,别人做不了。Intel就是一个典型的例子,Intel处理器数量也只占全球市场的1.5%。其次,中国不是小国,核心技术自己不掌握不行。我倒是觉得象嵌入式处理器这样的东西可做可不做,因为别人的嵌入式处理器价格很低,且不会卡我们。有的国外公司甚至主动提出,只要我们用他们的生产线,他们可以免费提供嵌入式的IP核。至于有人觉得我们做不了高性能通用处理器,我的回答是用我们自己的处理器做出一台曙光机来再说。虽然我们做高性能通用处理器上还很落后,但我觉得我们现在的条件比当年计算所做757和8920好得多,工具要好得多,工作量要小得多。任何事情,关键是要有人静下心来认真地去做。
我们在技术路线上第二个成功之处是兼容。回顾中国计算机发展的历史,应该说,我们的“祖上”也是挺“阔”的,直到80年代初,我们的处理器设计技术不比人家差多少。落到今天这个地步,很大程度上是吃了不兼容的亏。因为现在计算机中绝大部分费用不是花在硬件上,而是花在软件上。自己设计指令系统,只能图一时痛快;与其它主流指令系统兼容,确实很麻烦,有时为了一条指令就得修改数据通路,增加不少东西,但却可以一劳永逸。在我们组里,有一个很精干的操作系统组,才四个人,在3个月内搞定一切与软件有关的东西,包括BIOS、LINUX 2.4内核、gcc编译器、X-window、调试工具、Web Server等等,就是得益于我们的兼容设计。当然,这四个人都是绝对的LINUX高手。我们甚至做到与别人的处理器引脚级兼容,只要把别人的拔下来,自己的插上去就行。因此,目前主板也是用别人的。当然现在我们也在做主板设计,因为我们以后想做Infinite Band,不掌握主板技术不行。
我们在技术路线上第三个成功之处是稳扎稳打的设计方法。即从系统结构设计,到C模拟器设计,到Verilog仿真,到FPGA验证,到标准单元投片,再到全定制投片的方法。在系统结构方案确定后,我们就设计了一个Cycle-by-cycle的C语言模拟器,该模拟器详细描述了Godson处理器的系统结构,能够模拟处理器每一拍中每一位信号的变化。设计模拟器有三个明显的好处,一是验证设计的正确性,我们先后在C模拟器上运行了LINUX 2.2、LINUX2.4、gcc等一系列系统软件,发现了设计过程中的大量错误。二是用C语言描述系统结构更加严格,没有二义性,比用文字写的文档更加明确。在C语言模拟器验证正确后,把C语言模拟器的每个模块对应地转换成 Verilog语言的一个模块花了不到一个月的时间。而且由于设计上的错误都在调试模拟器的过程中剔除了,在Verilog描述阶段没有再出现设计上的错误。第三个好处是C语言模拟器为软件开发提供了一个开发平台,为我们开发诸如BIOS等软件提供了很大的便利。在把C语言的模拟器转换成Verilog设计后,我们又在Verilog的运行平台上成功地运行了LINUX操作系统。然后再综合并形成FPGA的烧制文件。经过上述反复的验证,联调时基本一次成功。如果我们不是稳扎稳打,而是采取跨越式的设计方法,直接进行逻辑设计,恐怕会欲速则不达,因为越上层的设计,调试越容易,而越底层的设计,调试越困难,且刚开始时我们甚至连Verilog语言都不会使用。在联调成功后,我们对流水线做了几次较大的优化,每次也都是在C语言模拟器上进行验证。