龙芯系列吧,应该算是我国独力自主开发的:
本文作者为“龙芯2号”主要研发人员,本文是他在BBS上发表的一篇文章。
2003年10月16日深夜,喧嚣了一天的计算所北楼终于沉寂了下来,我独自坐在北楼105房间忐忑不安地等待着。刚才还有郑为民和一个学生跟我在一起,几分钟前我派他们到后面的芯片小楼取逻辑分析仪去了。与北楼隔着一个篮球场的芯片小楼里还有10来个课题组的弟兄,他们都象我一样忐忑不安地等待着。
17日凌晨0点30分,楼道里传来了有节奏的脚步声,在空旷而寂静的楼道里显得特别有力。脚步声越来越近,我的心一下子提了起来,咚咚的脚步声象敲在我的心上,因为我知道,我们的龙芯2号回来了。
105房间的门被推开,张珩风风火火地闯了进来,手里抱着一个方盒子。他是我专门派到上海去封装厂家取龙芯2号芯片回来测试的。我们小心翼翼地打开盒子,几十片龙芯2号芯片象等待检阅的士兵一样整齐地排列在专用的包装盒里。一个电话拨到芯片小楼,不到两分钟,105房间就聚集了六、七个人,他们都是下午刚刚成立的联调组的成员。
我挑了几个芯片,在用万用表对芯片进行一些简单的静态测试后,从中选了一个芯片放到子卡的插槽中盖好,并把子卡插到主板上。小心地按了一下电源开关,显示屏上没有动静,心里一阵紧张。试了几次后,换一个子卡,放上芯片后插到主板上,一按电源开关,显示屏一阵跳动,串串字符如约而至。我们一阵欢呼,刚才提到嗓子眼的心放回到心窝里先。
在启动了一个简单的BIOS系统以后,开始启动LINUX操作系统,一切都很顺利。1点10分,屏幕上出现了LINUX操作系统的登录提示符“login:”。在拿到芯片的40分钟后,刚才等待时的紧张心情一扫而光。我们赶快打电话到芯片小楼告诉在那里等候的其他同学。钟石强还给我的妻子发了个短信,今晚她也在等待我们的消息。几分钟后龙芯2号收到了出世后的第一个祝福。
4点30分,龙芯2号通过了其他的测试。我们用装有龙芯2号的计算机在我们CPU组的内部BBS上灌了龙芯2号出世后的第一瓢水,并发了几封EMAIL。我决定龙芯2号的第一次联调先告一段落,拿出放了很久的硅谷的一个朋友送的一瓶XO在芯片小楼的会议室里每人半纸杯庆祝了一下。喝完酒后大家兴致不减,根据事先的约定又打车到天安门广场看升国旗并去毛主席纪念堂向毛主席报告。今年是毛主席诞辰110周年,我们这款芯片的名字就叫MZD110。
6点25分,我们又一次站在天安门前的国旗杆下,看着红彤彤的国旗在国歌声中冉冉升起。去年在接受《东方之子》节目采访时,他们曾问我在龙芯1号研制成功后看升国旗时心里想什么,我那时真忘了想什么了。这次我试图去想一些有意义的事情,比如什么豪言壮语之类的。可是面对国旗,脑袋里一片空白,只是在国旗猛地串上杆顶的那一刹那,24小时前杨利伟走出神舟5号舱门冲大家挥手的画面突然出现在我脑海中,以至于在去前门吃早饭的路上这个画面还久久浮现在面前,挥之不去。
在2002年9月28日龙芯1号的发布会上,李国杰所长曾经引用《易经》中的话说:“万物生于有,有生于无”。如果说龙芯1号解决的是从0到1的问题的话,那么龙芯2号要解决的是从1到10的问题,即龙芯2号的性能至少是龙芯1号的10倍以上。事实上这也是我们在申请 中科院知识创新工程重大项目和863计算机软硬件主题重点项目时唐志敏提的指标。在这 两个项目厚厚的申请书和合同书中,我只记住了两个数字,一个是主频500MHz以上,一个 是SPEC CPU2000的值达到300分以上。从承担项目之日起,这两个数字就象两个紧箍咒一 样紧紧地箍在我的头上(我一直认为这个项目是863项目中立得最成功的项目之一,只用 两个数字就把要做的事情表达得足够清楚了)。
从现在看来,主频500MHz以上还好办一些,下死工夫总是可以做到的,用0.13微米的工艺 更是容易做到。难的是SPEC CPU2000的分值达到300分以上。所谓SPEC CPU2000,就是一 组国际公认的标准测试程序,用这组程序在目标机器上运行,根据实际运行时间算出该计 算机的运行速度指标。这种标准测试程序从SPEC CPU89、SPEC CPU92、SPEC CPU95、到 SPEC CPU2000已经发展了好几期。其中SPEC CPU2000覆盖的应用面最广,包括文件压缩、 FPGA布局布线、编译器、组合优化、国际象棋、文字处理、计算机视觉、编程语言、解释 器、数据库、布局布线模拟器、量子动力学、浅水模型、三维势场求解、偏微分方程、三维图形库、计算流体动力学、图象识别/神经网络、地震波传播模拟、计算化学、数论/素数测试等等,光源代码就有上百万行。打分的标准是把这组程序在Sun公司一台300MHz的四发射Untra Sparc II 上运行的时间做为标准运行时间,其分值为100分,其它机器运行时间跟标准时间相比算出相应的分值。一般来说,现在较流行的四发射的主流RISC处理器象Alpha 21264、MIPS R12000、IBM Power III等在400MHz到500MHz的情况下SPEC CPU2000的分值可以达到300分左右,而Pentium III在800MHz时SPEC CPU2000的浮点分值 才200多分。龙芯2号要达到300分,至少要与1GHz以上的PIII或PIV的性能相当。因此,虽然做500MHz虽然也不容易,但更难的是SPEC CPU2000的分值达到300分以上。
提高处理器的性能,提高主频和优化软硬件结构不可偏废,光强调主频和光强调结构都是不行的。就象要把100根木头从A地扛到B地,甲每10分钟一个来回,每次扛1根木头;乙每20分钟一个来回,每次扛4根木头;丙60分钟一个来回,每次扛6根木头。我们不能根据甲跑得快(主频高)就说甲的性能最高,也不能根据丙每次扛得最多(每拍执行的指令多)就说丙的性能最高,性能是一个综合的东西。当然,还有其它要考虑的因素,如甲乙丙三人每小时的报酬(处理器的功耗、面积)等。虽然龙芯1号的成功对我们来说是一个巨大的进步,但有一件事我一直深引以为恨,那就是龙芯1号的性能没有达到预想的目标。
虽然主频不低,但跑起程序来比起类似结构的RISC处理器以及相同主频的PII还有一些差距。SPEC CPU2000的分值也不高。我曾经整日整夜地泡在机房运行各种测试程序,并试图通过软件优化的方法提高性能。虽然取得了一些效果,但不理想。后来的性能分析表明,有些龙芯1号性能瓶颈其实完全是可以通过简单的优化克服的,可惜当时项目推进得太快,没有时间做充分的性能分析和优化。这件事使我极其郁闷,因此把性能分析不够作为龙芯1号设计过程的一个重要教训,并发誓在龙芯2号的设计中要一血前耻。知耻近乎勇,后来龙芯2号步步为营的性能分析果真为龙芯2号提高性能发挥了巨大作用。在中科院领导对我们承担的龙芯2号重大项目进行立项审查的会上,李老师、唐志敏和我在向院党组汇报后准备离开时,江院长追出来跟李老师说:“李院士,我就把宝压在你身上了”。在863计算机软硬件主题专家对我们承担的龙芯2号项目进行立项审查的会上,我做完报告后,专家组组长怀进鹏老师曾声色俱厉地说:“胡伟武,这个项目是863计算机软硬件主题最大的项目,完不成任务提头来见!”这两件事给我很大的触动,让我想起上甘岭战役前夕彭德怀曾对秦基伟说:“我们要对朝鲜的历史负责”。
龙芯2号的设计在龙芯1号tapeout前就开始筹划,主要是唐志敏和我围绕我们申请的中科院和863的项目进行调研并确立在2004年项目结束时SPEC CPU2000的分值达到300分的目标 ,并在此基础上确定64位结构和4发射的目标。根据项目目标及龙芯1号研制的经验和教训 ,我们确定了龙芯2号研制的如下三条设计原则。
一是充分发挥结构设计优势和软硬件协同的设计原则。即通过处理器中各个层次的并行性开发来提高性能。这些并行性包括指令级并行、数据级并行以及线程级并行。其中指令级并行主要是四发射结构的实现,即在指令流水线的任何一个阶段每拍都执行四条以上的指令。为了有效发挥多发射通路的效率,必须实现充分的乱序执行技术,减少指令间的互相 等待。数据级并行性的开发主要是通过SIMD的技术实现向量指令。线程级并行性包括单处理器的多线程技术以及多处理器的多线程技术。龙芯2号在并行性开发上主要开发指令级并行技术,并通过把浮点部件与媒体处理共用的方法实现数据级并行的SIMD技术。软硬件协同主要指通过编译优化及硬件对编译器的支持提高性能,既不片面追求复杂的硬件大包大揽,也不把沉重的优化负担完全压在编译器身上。编译器对提高性能十分重要,我们曾有这样的体会:在同一台机器上,用不同编译器编译出来的同一个程序,运行时间竟相差75%。
二是以物理设计指导结构设计的原则 首先,流水线的最大逻辑路径不是由体系结构设计的需要来确定,而是由物理设计的要求来确定。即先确定每一级流水线的最大延迟并在此约束下进行结构设计。其次,在做结构设计时,心中要有物理设计的概念,即要明白相应的逻辑在物理上是什么样的。在龙芯2号设计过程中,结构设计人员至少做到网表级。三是设计和实现方法上稳扎稳打的原则 首先,重视Cycle-by-Cycle的C模拟器的设计并把C模拟器作为详细结构设计的文档是我们在龙芯1号开发过程中形成的一条最重要的经验,即“可执行的结构设计”的概念。在设计初期就通过充分的仿真与验证不仅不会影响进度,而且会加快进度。此外,龙芯2号的功能设计和物理设计也分成几步。第一步,还是采用标准单元设计,只在很有限的局部做全定制(如寄存器堆),主频200-300MHz以上,功能上不实现二级CACHE,争取尽快完成流片。第二步,功能上增加二级CACHE接口或/及DDR接口等,物理设计上使用更多的宏单元,但设计方法还是基于标准单元的方法,主频在300-400MHz以上。第三步,功能上增加对多处理器系统的支持,在更多的地方使用全定制单元或使用全定制流程,主频争取在400-500MHz以上。龙芯2号最后的流片将以全定制为主。
龙芯2号的设计包括结构设计、逻辑设计以及物理设计三个阶段,这三个阶段互相重叠,其中结构设计阶段和龙芯1号的设计也有所重叠。龙芯2号的结构设计断断续续地进行了好几个月。刚开始是在2002年四、五月份在进行龙芯1号物理设计的同时对龙芯2号的系统结构进行了初步的考虑。在对市场上的主流处理器如Alpha 21264、MIPS R10000、Ultra Sparc III、Power III、HP PA8700、PIV、IA64等及学术界的主要工作进行调研的基础上基本确定了龙芯2号的寄存器重命名、动态调度以及运算部件的架构。到六、七月份随着龙芯1号物理设计和系统开发工作的展开,龙芯2号的结构设计几乎停了下来。那时候我们组一共只有二、三十号人,很多人员的工作都是重叠的,根本没有力量同时做两件事情。
在2002年7月中旬龙芯1号tapeout之后,利用等待芯片回来的时间把龙芯2号的结构设计再次提上日程。7月15日研究生部的靳晓明老师打电话叫我到在四川广元召开的研究生学术研讨会上做个特邀报告,本来应该是徐志伟老师做的报告,徐老师临时有事去不了因此派我救场。唐志敏已经告诉靳老师我刚tapeout一个芯片,应该有空,所以推也推不掉。开完会后还要去九寨沟,需要三、四天才能回来。我走之前临时决定把龙芯2号的部分设计人员带到广元,准备在路上对龙芯2号的结构进行讨论。我和中科院研究生院的两位老师一起坐火车头天走,安虹老师、张福新和范东睿坐飞机第二天走,几乎同时到的广元。那时候我女儿正在放暑假,我爱人在龙芯1号tapeout之后刚到一个公司上班,因此我把6岁的女儿也一起带上了。
后来的事实证明我临走前做的决定是十分正确的,在广元和九寨沟的几天效率极高,基本确定了龙芯2号的结构框架。那几天我们白天根据会务组的安排活动,晚上讨论龙芯2号的结构,并且根据讨论结果形成龙芯2号结构设计的初步文档,每天都到凌晨一、二点。由于处理器的寄存器重命名以及动态调度结构已经基本确定,因此讨论的重点是取指和访存部件的结构。
在从广元去九寨沟的路上我和范东睿坐在汽车的最后一排讨论龙芯2号的取指和译码部分 的结构,汽车在路上颠簸了一整天,我们也讨论了一整天。取指与译码部分的设计空间很大,包括采用何种转移猜测算法、多发射情况下如何消除转移指令后面的延迟槽、取指及转移猜测是以指令为单位还是以发射块(四条指令)为单位、转移猜测是在取指还是在译码阶段进行、修正BHT和BTB的时机、如何提高指令CACHE的性能、以及指令TLB和数据TLB 的关系等。其中如何消除转移指令后面的延迟槽讨论的时间最长,主要是对传统的BTB方法和Alpha 21264中采用的line prediction方法进行反复的比较和分析。我从小就喜欢坐比较颠簸的汽车,汽车越颠精神越好,范东睿精神也不错,因此一路上效率极高。晚上8点汽车到达九寨沟时,龙芯2号的取指部分架构已基本确定。
访存部分的结构比取指部分复杂。一方面,它是与操作系统关系最密切的部分,其功能是否完善是支持通用操作系统的关键因素;另一方面,它是提高处理器性能的核心部件之一。如果CACHE访问效率不高,流水线的其它部分设计得再好也没有用。这一点在龙芯1号中我们已经有所体会。学术界与企业界都对如何提高访存性能作了大量研究,设计空间很大,核心问题包括如何降低流水线延迟、如何提高CACHE命中率和降低由于CACHE不命中引起的等待延迟、以及如何解决访存的RAW、WAR、和WAW相关等等。在随后的几天中,我们对这些方面进行了反复的权衡和讨论。直到在回北京的火车上才有比较粗的思路。
有意思的是,一路下来,我女儿看我们的工作,耳濡目染,对CPU设计也有了自己的心得 。直到今天我问她什么是CPU,她还说“CPU就是在一张纸上画些方框,然后用线和箭头把这些方块连起来,再涂上点颜色,写上一些字,最后一烧,烧出一个亮晶晶的小方块”。
最近我女儿经常在用龙芯2号做的Linux PC上玩游戏。我告诉她这就是我们在九寨沟画的 方框“烧”出来的,她感到很诧异。在2002年8月10日龙芯1号首片调试成功之后,龙芯2号的设计工作又慢了下来,全组的主要力量放在了龙芯1号的系统开发上面。虽然由于龙芯1号的系统开发和性能分析耽误了一些时间,但我自己在龙芯1号上玩了近一个月后有很大的收获。尤其是对性能和主频的关系有了更深入的认识。比如,对于有一些访存密集的应用,主板频率83MHz而CPU频率250MHz时的性能还不如主板频率100MHz而CPU频率200MHz的性能。现在想起来,一个处理器的性能就象一个城市的交通系统的吞吐率,可能由于某几处的堵塞而影响整个城市的吞吐率,只要把这几处疏通了,虽然花的力气不大,但吞吐率会极大地提高。2002年9月28日龙芯1号发布会后,龙芯2号的设计工作全面展开。10月2日,我带着张福新和李祖松到母校中国科大利用十一长假进行龙芯2号的C模拟器封闭开发,顺便向母校报告一下我们的工作。在科大借了半间原来的库房呆了一个多星期,基本完成了C模拟器的代码编写。在对结构进行细化的过程中发现了好多原来没有考虑到的问题。对于这些问题我们有时候争辩得很激烈。例如在转移猜错取消时需要判断正在执行的指令中哪些是该转移指令前面的,哪些是该转移指令后面的,张福新和李祖松的观点是参照MIPS R10000使用的方法,而我觉得那个方法太麻烦,希望有更简洁的方法。我们一直争论了两天,在争论的过程中互相启发,终于找到了一种简洁而高效的方法。
2002年10月8日回北京时龙芯2号的C模拟器已经基本成型。我们继续在我的办公室进行半封闭式的开发,主要是继续完善C模拟器并开始调试。那段时间我们每周只有二、四、六晚上休息,其它时间都在调试。调试过程中也调动组里的其它人写了不少测试向量。11月中旬在C模拟器中成功启动LINUX操作系统,开始对C模拟器进行性能优化以加快模拟速度并用C模拟器对龙芯2号的结构进行性能分析。
在此期间以及以后的几个月内,我们在C模拟器上运行了完整的SPEC CPU2000的几乎所有程序以及八十年代比较流行的性能测试程序dhrystone和whetdstone等,对龙芯2号的性能进行初步的分析。在运行上述程序过程中还发现了不少设计上的bug和考虑不周的地方。印象比较深刻的是由于访存操作的乱序执行导致两个或多个访存操作之间互相替换CACHE 块并引起死锁。另外一件印象比较深刻的是MIPS指令系统规定转移指令的延迟槽指令不能是转移指令,否则处理器的行为不确定,但我们在C模拟器中发现在我们的设计中如果转移指令的延迟槽指令也是转移指令时也会导致处理器死锁。虽然这是由错误的程序引起的,但也是结构设计考虑不周的地方,对于错误的程序我们可以给出错误的结果,但不能把机器搞死。
由于张福新和李祖松的加入,龙芯2号的C模拟器比龙芯1号完善很多,包括checkpoint在内的很多功能都加到模拟器中,此外,C模拟器的运算速度也大大提高了。张福新还顺手开发了不少小工具。
2002年11月底,我觉得C模拟器已经基本稳定,就召开了龙芯1号总结以及龙芯2号部署的会议,全面部署龙芯2号的RTL设计工作。
2002年12月初我们组建了RTL设计的队伍,由于我们人手有限,RTL编写的人员都是从各组抽调的,我自己也负责寄存器重命名和几个队列模块。龙芯2号的RTL设计大致可以分为三个阶段。
第一阶段为设计阶段。从12月初开始大家花了约半个月的时间了解龙芯2号的结构,同时我开始进行顶层模块的设计,主要是每个模块的互连关系、接口总线及触发器的定义。12月28日完成顶层模块的设计并启动各模块RTL的编写。由于有Cycle-by-Cycle的C模拟器作为参照,2003年1月14日就完成所有模块RTL的编写并编译通过,1月21日成功运行第一条指令。在此基础上,经过三天三夜的努力,到1月25日成功运行龙芯1号中使用的包括所有MIPS指令的一段功能测试程序。由于2002年春节没有放假,因此1月25日后全组放假。
第二阶段为联调阶段。春节后开始在RTL仿真环境上运行LINUX操作系统。经过连续一个多星期的努力,2月18日成功运行LINUX操作系统。在龙芯1号的联调过程中,在运行LINUX后,整个流水线的设计就基本上没有发现什么问题,只发现了部分与浮点有关的问题。但在龙芯2号中,运行LINUX后试图运行whetdstone时碰到了巨大的困难,甚至一度出现停滞不前的情况。因为错误出现在调用动态库的过程中,而且没有动态库的源代码无法调试。不得已我组织RTL编写人员于3月7日和8日进行了两天的封闭式自查。通过自查发现了大大小小20多个错误,使运行whetdstone的联调取得突破性的进展。后来我们又进行了两次封闭自查,只发现一、二处小错误。
第三个阶段为调整和优化阶段,这个阶段是龙芯2号逻辑设计的关键阶段。与联调阶段相 比,优化阶段发现的bug较少,但根据对RTL进行综合以及用C模拟器进行性能分析的结果对整个设计的延迟、面积、性能进行了持续的优化。通过初步的优化,龙芯2号的延迟降低了一倍多,面积降低了30%以上,相同频率的性能提高了30%以上。在这个阶段的每一周都充满了激动人心的改进,深刻体会到精益求精的道理。孔子说“食不厌精”,处理器设计更是如此。用1%的工夫可以完成一个正确的设计,但需要用99%的工夫来优化它。
在龙芯2的RTL优化过程中,我们总结了三条经验。第一条是精益求精的经验。做一个正确的设计和做一个精品的设计是有很大区别的。为了做到精益求精,思想上要永不满足,执着改进。碰到复杂的问题,不能满足于用复杂的方法来解决,要努力把问题简单化再用简单的方法来解决。第二条经验是在执着于细节的理解和把握的同时退后一步进行的全局的观察和思考是十分必要的。在龙芯2号的优化中有很多都是在项目的推进过程中退后一步进行文档整理、看文章、或封闭自查时得到的启示。对设计的微观了解和宏观把握是不可偏废的。如果对设计的细节不做一定的了解,则在整理文档或看文章过程都比较虚,不会有灵感出现;反之,如果过于执着于细节,则可能只见树木,不见森林,忽略了一些大的改进。第三条经验是以事实为依据的经验。对设计进行持续的性能分析、物理综合、以及仿真验证为龙芯2号的改进和改正提供了大量了事实依据。在根据事实进行设计和改进时,一定要在大量的事实和数据的基础上(小量的、不具有代表性的不行)对事实进行深入的分析,弄清楚隐藏在这些事实后面的、本质的东西,这样做的设计和改进才是最优的。
与RTL设计和验证同时进行的是FPGA验证环境的建设。在这个方面我犯了个错误。由于觉得有了龙芯1号的FPGA验证的经验,龙芯2号的FPGA验证应该没有问题,因此只让范宝峡一个人负责FPGA验证工作。没想到由于龙芯2号的规模较大,设计也更加复杂,导致FPGA验证困难重重。主要困难是由于在一片FPGA中放不下,需要多片FPGA,而且多片FPGA之间互连信号太多需要在每片FPGA接口处进行倍频传输。此外由多发射引起的多端口寄存器堆也难以在FPGA中实现。到4月下旬我才意识到FPGA验证方面投入的力量很不够并加强了这方面的力量。直到6月下旬龙芯2号的第一个芯片tapeout之前的半个月,才完成FPGA验证工作并通过FPGA验证及时地发现了设计中的一个错误。
在进行处理器结构和逻辑设计的过程中,其它方面的工作也在同时展开,包括王剑和郑保建带领的龙芯1号系统的继续开发以及龙芯2号软件环境的开发,郑为民带领的龙芯2号主板的开发,许彤、赵继业、钟石强、张珩负责的物理设计和验证方法的总结和研究等等。
就在龙芯2号的RTL设计过程中,SARS在北京肆虐,并给我们极大的考验。那时候所里的政策是所里不统一放假,但各个部门可以根据自己的具体情况放假。我和唐志敏商量后决定我们采取一定的预防措施并适当减轻工作强度。我们要求凡是乘坐公共交通系统上下班的都不来上班,晚上9点前必须下班,每天的中饭和晚饭由室里统一安排在办公室吃。至于外界的来访,所里早就不允许进入北楼了。此外,所里和室里都给我们发放了有关的预防药物,我们自己也买了一些。在这段日子里,虽然我们的进度被迫放慢了一些,但依旧不断地向前推进。我在为全国人民面对灾难时众志成城战胜非典的精神所鼓舞的同时,也为全组在这么困难的情况下坚守岗位所感动。
2003年3月份我们开始部署龙芯2号中用到的一个9个端口的寄存器堆的全定制设计。为了保险,我们部署了两套方案来设计寄存器堆。首选方案是请一个大公司帮我们做这个寄存器堆,同时作为与中科院微电子中心的合作请微电子中心设计同样的寄存器堆作为备选方案。由于首次流片主要是对设计的正确性和结构性能进行验证,因此首次流片除了寄存器堆外还是用ASIC的设计方法,并准备用中科院EDA中心的Synopsys工具进行布局布线以减少购买EDA工具的费用,因此在5月份之前物理设计组的人员也对Synopsys的工具进行了进一步熟悉。2003年5月份开始龙芯2号的物理设计正式展开。从5月初到6月中下旬,我们对使用的方法和流程进行了反复的试验、比较和确定,尤其是关于是否使用层次化设计方法、使用何种Wireload Model、以及Floorplan的方案等进行了反复的试验和尝试,并最后确定方法和流程。到6月底时确定了布局布线的方案并基本完成了布局布线,与流片厂家TSMC联系好准备在7月10日前tapeout。本来一切都在“掌控之中”,但随后发生的两件事情却大大出乎我们的意料。
第一件事情是在6月底完成FPGA验证平台建设后,在用该平台运行SPEC CPU2000程序进行性能分析时有一个程序的浮点结果有时正确有时错误。由于其它程序都运行正确,而且操作系统对虚地址CACHE支持部分还有bug,因此刚开始我没有认为RTL有问题。7月2日下午,张福新在机房中说了一句话:“我觉得还是RTL有问题”,这句话使我心烦意乱,放下正在看的布线工具文档,决定要把这个事情搞清楚。在随后的几十个小时中,我们使用FPGA验证、C模拟器、以及RTL仿真对这段出错的程序进行追踪。终于在7月4日早上找到了一个RTL的bug。好在问题只涉及局部的设计,我们修改完RTL后通过手工修改网表花了一天就完成了ECO的布局布线。
一波未平、一波又起。刚想歇会儿,负责全定制寄存器堆仿真的王林楠报告说寄存器堆不能正常工作。我刚开始不相信,因为为我们设计寄存器堆的C公司是业内非常有名的大公司。但不同的仿真结果都说明寄存器堆有问题。我们花了两三天才说服C公司的设计人员认识到设计错误并且改正过来。此后我们又对寄存器堆做了更多的仿真,并跟一个工具的bug斗争了几天几夜。在此期间,微电子中心的黄令仪老师给了我们极大的支持,否则我们不会这么快对寄存器堆的设计有深入的了解。
由于这两件事情的发生,到7月14日我们终于把龙芯2号的第一个设计tapeout到TSMC时,我们已经连续在机房不分昼夜地干了十几天。但由于在临tapeout前曾经发现寄存器堆设计的问题,因此tapeout之后也不敢松懈,继续对寄存器堆进行分析和仿真。由于EDA工具对较大规模的模拟电路没有有效的支持,主要依靠设计者的经验,我们也请一些电路设计高手帮我们进行分析。经过一个多礼拜心惊肉跳的检查,在排除了一系列可能存在的问题后,最后一个关于电源地规划的问题成为我们关注的焦点,也成了我在此后的几十天中的一块心病。设计者似乎在这方面有疏忽,在最离谱的地方,几十毫安的电流只用了0.28微米的地线。我们与C公司的工程师联系时,他们觉得没有问题,反而说过多的电流会通过衬底流掉。这时候我们在很多高手的指点下已经对全定制设计有所了解,觉得这个问题比较严重,因此在与C公司反
参考资料:http://it.sohu.com/2003/12/20/63/article217166344.shtml