我们的CPU

前言 

   这是龙芯处理器主要设计人员胡伟武发布在中国科大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语言模拟器上进行验证。

    在我们实验室的墙上,有两句口号,一句是“人生能有几回搏”,另一句是“求实、求实、求实、创新”。第一句口号是我所研制曙光系列高性能计算机用的口号,我把它借来了。的确,在我们努力攻坚的三个月中,我们课题组的成员付出了难以想象的艰辛,尤其是在几次调试的阶段。好多人都有调试程序的经验,但很少有人调试过操作系统,而在一个本身就可能出错的处理器上调试过操作系统的人更少。我们的挑战就在这里,当出现一个错误时,应用程序、操作系统以及处理器本身都是怀疑的对象,需要多方面的协调及分析。我们曾经在C模拟器、Verilog模拟环境、以及FPGA验证系统上分别都运行了LINUX操作系统,每次都是连续几天几夜的鏖战。尤其是最后一次最为惨烈,因为即使发现一个很小的错误,修改一次设计再形成新的FPGA烧制文件,需要至少8个小时。只有一天24小时工作,才能保证一天有修改几次设计的机会。我算是在课题组中睡觉不算少的,但也有一个星期没有正经睡觉的经历。在8月中旬的那个星期,星期一下班前得知第二天有领导要来所里检查工作,于是决定冒险把原来定的联调时间提前一周,希望一次成功。但怕不成功影响士气,只找了几个骨干在星期一晚上开始联调。我们只有两次机会,因为修改一次设计就需要8小时。星期二凌晨四点,把FPGA文件写入FPGA,没有任何动静。很快就用逻辑分析仪发现了问题。原来是由于启动时与主板握手机制有缺陷,导致主板一直没有撤掉复位信号。赶快修改并在中午12点形成了新的FPGA烧制文件,写入后还是没有任何动静。下午领导来检查,开了一下午会,晚上接着调试,发现CPU插卡上有两个焊点短路,去掉后主板上的液晶显示器上如约显示出“GODSON”的字样,我们一片欢呼。我们决定连续作战,到星期三晚上11点左右,成功地运行经过改造的主板上的BIOS系统,相当于是一个简单的操作系统,又是一片欢呼(这时课题组的其他成员才知道我们是在我们自己的CPU上运行程序)。于是12点要求所有人回去睡觉后回家睡觉。晚上雷声大作,风雨交加,以示庆贺。我兴奋得难以入睡,因为此时始觉三个月来一直紧紧压迫我的压力稍有缓和。星期四上班后开始试图启动LINUX操作系统,但每次都在最后进入用户态启动各种应用程序时出错。怀疑是TLB的问题,因为访问用户空间才开始使用TLB。一直跟TLB斗争了三天两夜,中间发现了不少问题,每次充满期望地改过来却总是获得失望,直到星期六吃晚饭前恍然大悟地发现问题,吃完晚饭后赶快修改,8月19日凌晨2点多形成FPGA文件并写入FPGA,2点42分,屏幕终于上出现了“login”字样,登录进去随便玩,和使用其它机器上的LINUX一样。我当时用vi编辑了一个文件记录这一历史时刻,存盘退出后把它ftp到另一台机器上发给唐志敏和所领导,并兴奋得马上给唐志敏打电话告诉他这个好消息。那时虽然我们都已经极度疲惫,但在场的6个人都兴奋得毫无睡意,聊天到天亮。记得那晚也是风雨交加。早上6点大家回家睡觉,不知别人怎么样,我连续睡了20多个小时,补上了这一星期的觉。在此之后,我们又跟前述“偏执狂”的浮点测试程序斗争了两个礼拜,不过已经没有那么辛苦了。我有时候觉得自己比周扒皮还狠,但我们课题组的成员确实很玩命。有好几次,我在早上六、七点钟打开实验室的门,发现有些人手里扶着鼠标就靠在椅子上睡着了。我是容易受感动的人,看到这样的场景忍不住想落泪。但我还是叫醒他们问他们昨天晚上的进展并让他们接着干。我有一个学生,近两个月来很少在凌晨4点前睡觉,而常常到八、九点钟我上班后就会把他叫起来,因为我急于了解昨晚的进展。记得有一次我们在深夜趁等计算机的运行结果,大家聊天,说到了生死。他说最不希望老死,看着自己的生命一点点耗尽。我们有一种观点,我们现在落后这么多,别人不比我们笨,如果大家都一样一周五天一天8小时上班,恐怕很难赶上人家,惟有象当年搞“两弹一星”一样拼命,至少得累死一批人。惟有这样,我们才能不受欺负,我们的子孙才有希望重新做到“犯我大汉者,虽远必诛之”。

    我经常说,一盆花用水浇灌固然能够盛开,但用心血浇灌会更鲜艳。我们的CPU事业就是一朵花,我们在用心血浇灌她。我们给我们设计的处理器取了一个很有传统特色的小名叫“狗剩”,希望名字贱一点容易养大,音译成英文就是Godson。

    至于我们墙上的另外一句口号“求实、求实、求实、创新”是对计算所所训“求实、创新”的一个注解和发挥。因为我感到现在中国科技界太浮躁,炒作的人多,做事的人少。因此希望我们组的人把工作做扎实,少吹牛多做事。其中第一个求实是关于做学问的目的,要为了做学问而做学问,而不是为了名和利。要真正做到‘人不知而不愠’。这一点说起来容易,做起来很难。象我们在计算所工作的人,大概在利上不是非常计较,只要日子过得下去就行了,但在名上就很难看得开,这一点,我自己虽然做不到,但心向往之。第二个求实是关于做学问的态度,就是要把工作做到实处,就是要艰苦奋斗,就是不要为了发表论文而写文章。在科研上哪怕是一点点的创新,都需要大量踏实的工作,这是客观规律,谁也躲不过。我们在科研中经常碰到有些人不愿做具体繁琐的工作,一心想发表论文。这种现象很普遍,我自己也这样,但以后要力戒之。第三个求实是关于做学问的方法,要勇于实践,不要纸上谈兵。就是要‘学而时习之’,就是认识和实践的不断循环往复。学问并不仅仅是知识渊博,更多的是体验和感觉。没有对所做工作的深刻体验,就难以发现问题,就难以创新。而这些体验,别人的文章里是看不来的,没有经过身体力行的大量实践,是不会有的。只要做到了这三个求实,想不创新也难。

    现在很多人认为我国没有自己的处理器,主要是因为工艺水平上不去,因此,处理器设计不应是计算所的事情,而是做微电子设计的人的工作。诚然,回顾我们国家的处理器设计历史,在80年代后全面落后的一个重要原因是没有自己的制造工艺,导致处理器设计队伍整体上垮掉,人员流失。但现在情况发生了变化,投片已经没有大问题,主要是没有设计。而处理器设计决不仅仅是逻辑设计。处理器设计是大系统,惟有对包括操作系统、编译、体系结构、I/O等在内的整个计算机有全局的把握才能设计出高性能处理器。就好象一个公司,固定资产和资金只提供了必要的条件,关键还在于管理。在通用计算机中,操作系统和系统结构设计的的配合尤为重要,有些指令专门是为操作系统设计的,尤其是在系统安全、存储管理、原子操作、例外处理等方面。我在用我们自己的结构实现MIPS指令系统的过程中,有一个深刻的体会,就是一个指令系统十几年来一直在发展是有它的道理的(MIPS指令系统经历了MIPS I、MIPS II、MIPS III、MIPS IV的发展过程)。有时候通过对操作系统的分析了解到一些指令的妙用,体会到设计者设置这些指令的初衷,真是让人拍案叫绝。所以,我一直很庆幸我们采用了兼容的做法,如果自己设计指令系统,没有十几年的实践,是不会完善的。放眼中国在体系结构、操作系统、编译方面的综合力量比计算所强的不多(我比较佩服的其它单位只有一家),因此计算所做CPU设计是很有优势的。虽然前几年的折腾使计算所元气大伤,但底子还在。在开始做CPU设计之初,我对这件事情的复杂性估计不足(这是一个深刻教训),只是领着八、九个研究生做。后来在项目逐渐展开后,发现现有的人力顶多能做完逻辑设计,要把通用操作系统启动起来是远远不够的。无奈之下,只好从原来做机群的组和做嵌入式操作系统的组中调了几个操作系统高手过来,事情马上有了起色。比如,我们要在C模拟器上运行操作系统,需要对操作系统内核进行裁剪和修改(如去掉一些与主板配置紧密相关的初始化),这种事情没有对操作系统的深入把握是不会做的。后来,又从其他地方得到一些人员补充(我现在体会到电影上打仗时指挥员为什么非常重视预备队)。现在,我们组已经有了三、五十人的规模,兵不在多在于精,这些人全是年轻的枪手,素质很高,又很玩命。就我目前所做的事情来说,计算所几乎是“要什么人才有什么人才”。当然,以后投片现在的队伍是远远不够的。

    计算所的科研环境很好,尤其是体现在后勤服务上。举几个小例子。第一个是工作展开后通宵加班多了起来,我们自己因地制宜地在一些桌子上铺上铺盖搭了几张简陋的床。当邓书记知道这种情况后,马上找人腾出一间小屋子,放了六张床,大大改善了我们加班时的休息环境。书记还让人每天为加班的人准备饼干、方便面等方便食品。第二个例子是,随着工作的不断深入,组里需要不断添置新的微机,但机器都是随用随买(因为以前没有经验,不知道要买多少机器)。对此,业务处的同志们总是全力配合,保证组里及时用上新机器。最快的一次,我在上午11:30向业务处王玉洁老师提出购机申请,下午1:30机器已经送到实验室。这在一个财务制度健全、审批严格的事业单位是很难想象的,更何况是下班时间。第三个例子是有一次我们急需一块Matrox G200显卡,但由于是几年前的产品,跑遍了中关村也没有买到。万般无奈,只得通过EMAIL向所内的部分老师紧急求助,热心的业务处于天波老师马上在网络上发布这个消息,不到一个小时,在王贞松老师的帮助下,就找到了这块显卡。这至少减掉了我们两个星期的工作量,因为如果用其它显卡,我们得自己写驱动程序。有效的后勤保障使我有时后觉得不把事情做好,对不起这些热心帮助我们的人。

  我们在前一段时间的教训有两个。一是工程经验不足,主要体现在以做研究的方法来做工程,以及对任务的难度估计不足,科研力量配备不够,导致初期效率不高。幸亏后来工程经验丰富的张志敏老师的加盟大大扭转了我们以做研究的方法做工程项目的局面,提出了“后墙不倒”的目标。此外,也幸亏计算所技术储备雄厚,要什么人有什么人,使得我们得以在后期提高效率。不过,我们目前在文档管理等方面还是很存在问题的。第二个教训是对工具重视不够。现在做处理器设计,EDA工具是十分重要的。我们由于不够重视EDA工具,吃了不少亏。有一次布线布不通,只要修改一下设置就行,可惜我们都不会,折腾了一个礼拜,后来才发现。

    下面我可以介绍一下Godson的技术特点。了解了这些技术特点,就可以了解为什么Godson工作在12.5MHz时就有50MHz的486的性能。Godson的流水线结构是我自己觉得比较得意的地方。设计的时候没有参考其它处理器的流水线,完全是凭感觉。Godson流水线包括了若干目前处理器设计中最先进的技术,如流水线动态调度,Tomasulo算法,寄存器重命名,猜测执行,精确例外处理,64位的浮点运算部件,CACHE技术等,并且在某些方面有所创新。流水线设计中比较困难的两个问题是例外的处理和相关的解决。首先我们把例外处理与流水线紧密地耦合在一起,在数据通路的设计中例外结果和正常结果并行,在执行过程中例外结果和正常结果不加区别,只有在指令结束阶段才对例外结果进行特殊处理。此外,我们把转移指令猜测错误作为一种特殊例外,利用例外处理的取消和保持现场精确逻辑。这样不仅可以简化设计,而且可以让转移指令后面猜测执行的指令尽可能地往下执行。我们的流水线是动态流水线,采用de-coupled结构,控制逻辑分布在每个模块之中。在流水线的控制中,“让流水线流起来”是我们设计的理念。在指令流水线中,数据相关和控制相关都会引起流水线等待,如后面指令用到前面指令的结果或后面指令是否执行由前面转移指令成功与否决定。对于因数据相关引起的等待,我们的原则是尽量推迟到不得不等的时候才等。即对于源数据未准备好的指令,指令译码和发射时并不停下来等待数据(简单的静态流水线通常在译码时停下来等待未准备好得数据,堵住了后面指令的继续执行),而是建立数据依赖关系,由功能部件通过侦听结果总线解决相关。这样数据结果一出来,等待它的指令马上可以进行运算,不用经过写回到寄存器再读出来的过程,而且前面指令的等待不会堵塞后面指令的继续执行。对于控制相关,我们也是让转移分支的指令先猜测地执行起来,到实在不得不停下来时才等待转移目标的确定。如果转移猜测成功就立即继续前进,如果转移猜测不成功,就利用例外处理的指令撤消机制恢复正确现场。

    流水线设计中,“简洁、流畅”是是我们追求的目标,前者保证流水级间的控制简单,延迟少,后者保证流水线的高性能。在我们联调成功后到现在,已经对流水线进行了4次较大调整,每次都更加简洁、流畅。我想在正式投片前还会有几次调整。
此外,Godson的浮点运算部件流水线设计也有自己的特点。Godson体系结构的另外一个特点是结构灵活,模块化好,可以根据不同的需求对功能部件进行任意裁剪以满足不同的应用。由于Godson的流水线采用de-coupled结构,控制逻辑分布在每个模块之中。增加或减少功能模块对其它部分没什么影响。如对于某些嵌入式应用,不需浮点部件,只要去掉浮点ALU、浮点乘法、以及浮点寄存器模块,不用对其它模块做任何修改。

    系统安全设计也是Godson的一个重要特点。Godson系统除了实现MIPS系统要求的安全机制外,还针对网络攻击实现了一种新的访问限制机制。缓冲区溢出是一种非常普遍、非常危险的漏洞,是目前大多数网络攻击所采取的办法。在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统死机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。Godson通过允许操作系统对堆栈段的取指进行限制,从而有效地防范利用缓冲区溢出进行的攻击。

    当然,Godson在目前设计上还存在一些缺陷,主要是对CACHE重视不够。目前的设计只有4KB的指令CACHE和4KB的数据CACHE,都是直接相联(这与FPGA容量有关,目前的设计已经使用了150万门的FPGA的85%-90%的面积)。在性能测试时发现对访存要求较高的程序

    Godson的性能不够理想。如当Godson运行在12.5MHz时,对于访存不敏感的程序,100MHZ主频的IDT 64474 CPU(R4000内核)的性能是Godson的3-5倍,但对于访存敏感的程序,IDT64474 的性能是Godson的6-8倍。IDT 64474有16KB的指令CACHE和16KB的数据CACHE,都是二路组相联,无论是CACHE容量和组织方式都比Godson强。在投片前一定要对CACHE部分进行改进.

  关于Godson的未来发展,我们有一个雄心勃勃的计划。第一步是在目前设计的基础上经过优化后进行标准单元的投片,主频在200-300MHz左右,争取2002年完成,用于个人工作站/瘦客户端PC及电子政务等。第二步是设计双发射64位的结构(目前为单发射、定点32位、浮点64位),投片主频为500MHz左右,争取2003-2004年完成。用于高性能服务器,也可以搭成机群做高性能计算。第三步争取在处理器间并行上有所突破,设计基于Crossbar的大SMP结点,每个SMP结点16-64个CPU,用于高性能计算。在做处理器设计之前,我们做了近十年的共享存储系统结构研究,但受囿于CPU和操作系统,只能纸上谈兵,顶多做做软件实现。现在自己做CPU,可以为所欲为,好象被束缚的手脚一下子得到了自由。如果能够把我们在共享存储并行系统方面十来年的积累做到实用系统中去,简直是爽呆。如果可能的话,争取实现串行程序采用多线程技术自动并行化,这需要编译、操作系统及系统结构的全面突破。

    没做多少事,写了这么多,是不是有点过分。写这种东西其实比写程序还累。


         没想到《我们的CPU》在网友中引起了一些讨论。我写这篇文章的本意之一是怕一些新闻机构报道时说得不够准确而挨同学或网友的骂,自己把这个事情说清楚挨的骂会少一点。现在看来,这个目标至少部分地达到了。但我没有想到大家对我们自己的CPU如此热心,使我觉得我们不是在孤军奋战,增加了信心。我对网友意见的重视不亚于对鉴定委员会意见的重视,专门让一些学生收集这些意见并进行分类,并在组内告戒对于网友的意见,"有则改之,无则加勉"。因为好多网友是真正在第一线工作的人,是真正把握国际前沿的人。鉴定委员会的意见也很重要,一者他们都是国内专家,二者没有他们的支持,我们都会饿死。这就好比我们写文章得有人审稿一样。 

  我说过,我们现在做的工作不多,实在不值得写太多的东西来宣传或挨骂后进行解释。但从网友的讨论中,我得到很多启发(很多网友提了很多很好的建议),我想到可以利用网友的智慧一起来推动这个事情。 

  不管对我们的工作支持的也好,反对的也好,有两点是一致的。一是对我们自己的CPU非常关心,二是对中国科技界目前的浮躁现象深恶痛绝(这其实很难怪科技工作者,这是从上到下全国的风气)。 

  对于那些对我们的工作加以鼓励的人,我要深深地感谢。看得出来,有不少是行家,功底很深厚。我们一定会继续努力,争取早日投片成功。有些网友提了很好的建议(包括不少技术上的建议),我们会用在我们下一步的工作中。有些网友表示,只要我们投片成功,达到PII的水平,他们愿意用PIV的价钱来买我们机器。对他们除了感谢外还有致敬,我把他们看作我们的朋友。并请他们不要食言,因为我是玩真的。 

  有一位网友提了很好的建议,让我们开放我们的设计,这个主意很好。只要所里不反对,我肯定开放源代码,至少是C模拟器的源代码,请大家一起帮我们做设计。当然,开放之前,还要加一些东西,因为我写程序没有注解。 

  有不少网友提到这个和美国研究生的"大作业"有什么区别。这个区别是很大的。想一想,有没有美国的高校把一个双精度、全流水、符合IEEE 754标准的浮点运算部件作为一个"大作业"让学生做,而这只是我们十几个模块中的一个模块(当然是较大的一个)。顺便提一下,我们的浮点运算部件用的算法比较新,是九十年代末提出的。我可以给大家提供一个C程序,用这个程序在PIV的机器上能测出它不符合IEEE 754的地方(这究竟是处理器的问题还是程序或者编译的问题也欢迎行家分析),而在我们的机器上测不出来。另外,说到大作业,我们现在也正准备开一些这方面的课,让我们的博士生做一些大作业,其中一项就是做一个实现MIPS I的指令系统的CPU,或者写一个完整的嵌入式操作系统。其实我在文章中提到我在科大本科论文做8086就是想传递这样一个信息,做CPU设计并不难,本科生就能做,难的是要做好。如果真的是一个大作业,用得着我领着几十个人干吗?至少我的科大8611的同学和以前对我做的软件DSM系统JIAJIA有所了解的同行知道我不是白痴。我的课题组中高手很多,不少是能独当一面的,其中有对Linux内核非常熟悉的,也有工程经验非常丰富的。 

  关于媒体的报道中关于我们CPU的评价,不管别人怎么说,自己觉得在通用CPU设计方面处于国内领先,和在动态流水线设计上达到国际先进水平还是比较确切的。如果我已经做了多发射和对CACHE作了改进,我还敢说在通用处理器设计方面达到国际先进水平。在动态流水线方面(针对我们的结构)可以说已经接近一个极至,很难再有很大的提高。动态流水线的核心是要解决各种相关,如数据相关、控制相关、例外相关等。做到后来,我们的结构有点象数据驱动或事件驱动,即译码或发射时只是在指令中建立互相的相关关系,并不解决相关,指令到达最后关头才等待(再多走一拍就会出错了)所需的数据或事件,一旦该指令所等待的数据或条件准备好,马上继续前进。至于其中的创新,结构上的大创新是没有的,但具体实现上的一些技巧还是有的,有几点我自己非常得意。记得Henessy(还是Patterson?)曾经说过,把90年以后所有关于Architecture方面的文章都烧掉,对Architecture的研究没有任何损失。其实,如果大家仔细分析分析一些通用CPU的结构,如Alpha, MIPS, PowerPC, PIV等,发现确实是大同小异,取舍不同而已。我这样说是因为我们最近已经对这些处理器的结构做了较详细的分析和比较。 

  有些网友对我们的设计在技术上提出了不少建议,尤其是关于CACHE的重要性。关于CACHE,我们是非常重视的,因为我在做DSM时用过除了Alpha工作站以外的几乎所有厂家的计算机,对CACHE对性能的影响是有深刻体会的。在我们投片时容量肯定会增加,组织方式也许会做到二路组相联。不过,CACHE设计是很复杂的,尤其是做non-blocking的CACHE设计更复杂,我们现在最关键的是要投片成功,所以为了保持控制简单我们在CACHE方面不会太aggressive,好多优化方法可能在目前的阶段不会用。例如,为了做2路组相联,连线会增加很多,而在深亚微米的工艺中连线复杂性和延迟是最主要的。我们目前关于CACHE的预研正在进行,也有一些新的想法。关于多发射,我想以后做到双发射就行了,因为RISC结构现在越来越复杂,做到4发射已经有点违背RISC提出时的初衷。为了提高性能,超流水、多线程、片内SMP等技术倒是我较看好的,上次我提到过,希望做几十个CPU的大SMP结点。当然有好多关键技术没有解决。我对Deleware大学高光荣教授的EARTH技术比较感兴趣(这几天高老师正好在计算所跟我们交流)。自己作了这么多年并行处理,希望以后用户不用并行编程就能用并行机。如果大家觉得上述技术思路有问题,欢迎大家讨论,因为这种决策对于我们是至关重要的。 

  至于有些人担心我们自己虽然能做设计但生产不了。我想说的是中国目前最缺的是设计,国内最近化了很多钱组建了或正在建不少生产线,0.35, 0.25, 0.18的都有,关键是没东西可以生产。的确,以前是由于生产不了而导致设计队伍垮掉,但现在不同了。此外,ASIC设计很见工夫,象Alpha 21264在0.35的工艺上能做到600多MHz的主频,我看我们最多能做到200MHz就很不错了,这些东西的确是需要积累的。 

  对于有些觉得凡是中国人做的事情就"[censored]", 觉得自己的同胞肯定不如洋人,或没有仔细读我的文章就恶意攻击并以此为乐的人,用先人的两句诗奉送:"汉人学得胡儿语,便向墙头骂汉人"。但如果他们能够做到如下两件事情之一,我愿意在我们够得到的所有BBS上向他们道歉,并承担一切费用请他们回来向他们请教。第一件是在两个月之内单独完成一个单双精度、全流水、符合IEEE 754标准的浮点部件的逻辑设计,要求完成除了除法、开方以外的MIPS III指令系统的所有浮点运算。第二件是在我们的处理器中有四条MIPS的地址不对齐的访存指令(LWL,LWR,SWL,SWR)没有实现,处理器碰到它们时产生一个保留指令例外并由操作系统软件模拟,要求一周之内修改LINUX内核完成这一功能。第二件事情做起来并不难,但得知道修改LINUX的什么部分,以及当模拟的指令是转移指令的延迟槽指令时的特殊处理,还要保证核心态发生的保留指令例外处理不影响系统的稳定,此外,由于例外处理是在核心态,要注意别留下安全隐患,使非法用户有机可乘。如果把我们的GodSon比喻成在美国的一个学期的大作业,那么上面的两件事应该在一个星期之内完成. 

  我已经说过,我们只是作了很少的一些事情,至少比起计算所的先辈们的工作是很微不足道的。以后的工作确实很艰巨,但路得一步一步地走。在最近计算所表彰我们时我说要把它看成鞭策,继续努力,死而后已。下面有人在笑,觉得我说得太严重,但我自己知道如果要在很短的时间内做好这个事情,累死也是不奇怪的,至少有人得折寿,毕竟我们差距太大了。但我们有一支高素质而玩命的队伍,我把这支队伍比喻成敢死队。队伍中很多人是能独当一面的,但我们走到一起来了,因为大家都知道只有摈弃个人得失,团结一致,才能做大事情,都希望5000年的中国有自己的CPU。 

  最后,也是我写这篇文章的重要目的,欢迎高手加盟我们组,一起把这件事做好。如果你是在国内,我想说,立足国内比在国外机会更多,更会有成就感。如果你在国外,我想说,粱园虽好,非久居之地。虽然我没有长时间在国外呆过,但对地球那边的情况还是了解的。我的抽屉里还放着两张公费出国访问的任务书(其中有一张已经过期作废了),国外也有人请我去,但我觉得在国内为自己的国家做事情更有意思。如果你曾经对计算所有所了解,我想告诉你,现在的计算所已经不是两年前的计算所。李国杰当所长后,已经把计算所变成集中力量做大事的计算所,而不是原来一盘散沙的计算所,至少在我眼中,已经不会象原来那样把一、两百万的项目当大项目了。我看如果老李再当一届所长,计算所复兴是没问题的,成为国际一流的研究所是有戏的。计算所的待遇也不错,"让计算所的员工在中关村地区过得比较体面"是老李在计算所员工大会上的承诺,我觉得至少出门打车不用计较是1.6还是1.2元的出租车了。从我们这里出去的一些学生也说我们现在的科研条件比他们还好。从国外回来交流的一些老师也觉得我们不管从所做的工作,还是经费、队伍及科研条件都不比国外差。 

  再一次诚邀高手加盟,但以下三种人除外。一是上述"汉人学得胡儿语,便向墙头骂汉人"的人,或挟洋自重,希望因为自己是洋学位得到比别人更多的人;二是为了写文章而做学问,夸夸其谈可以,动起手来不行的人;三是过于计较个人得失,动不动就想把队伍拉出去自己干,忙着讨论谁占多少股的人。 

  同时,我们也请大家对我们的工作提出意见和建议,尤其是在以下两方面。一是在技术路线和技术设计上,我们会尽量公开我们的设计。有人说我不懂体系结构,这个人是高手,至少对体系结构方面学术界近几年在做什么事情我是不了解的。我原来做DSM,对这方面国际上的研究状况倒是门清。二是关于我们未来的发展思路,尤其是如何尽快找到市场切入点。 

  这篇文章写完后,即使被骂得狗血喷头,我也不会再辩解了。各位看到我的下一篇文章时,应是我们投片成功的时候。

                                                                                                            胡伟武



转自http://www.hseda.com/fpga/2003_4/cpu.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值