编者:本文作者为“龙芯2号”主要研发人员,本文是他在BBS上发表的一篇文章。
第三个阶段为调整和优化阶段,这个阶段是狗剩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公司反复交涉得不到他们的积极配合后决定起用备份方案,再做一个流片。刚好黄老师她们做的寄存器堆也已经完成了。我们把已经tapeout的第一个芯片叫做狗剩2号的A方案,把准备做的叫做B方案。
在我跟李老师和唐志敏提出再做一个流片后,他们提出这次可以在SMIC流片,因为刚好Artisan为SMIC做的库在6月份发布了。事实上,李老师在去年就提出狗剩2号在SMIC流片,我不干。这次我也是不大愿意,因为我那时对SMIC不了解。李老师说,我们自己希望别人支持民族产业,用我们的芯片;而我们自己不支持大陆厂家,怎么行。我还是不愿意。 后来有一次在所里培训时碰到李老师又说起了这件事。他说:“不管SMIC的工艺怎么样, 总得有人去试,大不了不成功,下次再来”。我说:“要的就是您这句话”。因此就定下 来8月份在SMIC流片。
我们在7月30日下午拿到SMIC的库,那时侯离tapeout只有两个星期了,而且SMIC的库还存在不少问题,我们不得不一边发现并修改库的bug一边把物理设计向前推进。这真是做得最辛苦的一次物理设计,连续的熬夜搞得我们吃饭也没胃口,每天只在晚饭时吃一顿。室 里的刘凤芹老师看我们不去食堂吃饭,每天早上都熬一些紫米粥来给我们喝,我爱人有时候晚上也给我们熬些鱼汤什么的。8月10日下午布完线后心里塌实了一些,我和钟石强、 杨旭去四环志新桥边上的一个粥铺吃晚饭,才觉得饿坏了。吃完后数数桌上竟有17个空盘子,出来时撑得腰都弯不下来,三人一路走回中关村。
布完线后我们又根据分析的结果做了些手工调整修复信号完整性问题和进一步降低延迟, 并修复了DRC和天线的问题。到8月12日中午LVS经过几次修改也基本通过,我们觉得差不多了。那天正是农历七月半,因此在加上guard ring后趁计算机做最后的LVS检查时我和钟石强、杨旭去天安门广场瞻仰毛主席去,可惜那天下午纪念堂没开,我们只好绕纪念堂一圈回来,路上猛然想起今年是毛主席诞辰110周年,于是约定把明天tapeout的这个芯片的起名叫MZD110。
回到所里时没想到刚才LVS运行的结果还是有错。于是赶快对刚加的guard ring进行检查。guard ring是围绕芯片最外边的一圈保护环,奇怪的是加上guard ring后LVS检查就显示芯片里边的逻辑有错,去掉guard ring后再检查芯片里边的逻辑又没错。那天晚上一直在找这个问题,黄老师也跑过来帮我们一起找。第二天天亮后就要tapeout了,但一直到后半夜还搞不定。眼看时间一分一秒地过去,真是又困又累又着急,几乎要放弃。快天亮时王林楠重做的guard ring做好了,又折腾了几次LVS检查终于通过,这时候清晨的阳光已斜斜地照进机房。把文件传给SMIC后我们又取回来再做一次LVS和DRC。计算机在运行时,我和杨旭斜靠在椅子上等待。杨旭说:“昨天晚上真怕睡着,我有时候靠在椅子上歇一会儿,看见你们躺下了就赶忙起来,怕咱们三人都睡着了就不知道睡到什么时候了”。这句话让我十分感动,因为昨晚最困的时候我自己也是一直用这个念头强撑着不敢闭眼。那时候我们已经连续十几天没有正常休息而且莫名其妙的问题搞得我心力交瘁,我第一次感到人的体能是有极限的,人的精神是会崩溃的,真想一觉睡过tapeout的时间算了。我仰头看着天花板,好不让杨旭看见我的眼泪,很动情地说:“杨旭,你有这样的责任心,以后在我们这里肯定前途无量”。杨旭是刚从微电子中心毕业后到我们这里来工作的,他还没有到所里报到,就先来跟我们一起苦熬。
我经常把我们课题组比做一个硬骨头连队,把自己比做连长。在狗剩1号流片成功后,我这个连长得到了很多本来应该属于全连的荣誉,包括获得“中国青年五四奖章”并受到总书记的接见,而每天跟我一起冲锋陷阵的兄弟们什么也没有。我真是愧对他们。
去年在狗剩1号tapeout之后,我曾经说,我觉得三个都能成,如果两个成功也可以接受,如果只有一个成功我会觉得比较失败,如果全部不成功那就没有天理了。但狗剩2号tapeout之后,我对A方案和B方案都没有必胜的信心。但不管最后结果怎么样,有两点是肯定的。一是全组已经尽了最大努力,Godson-2的设计比Godson-1辛苦得多,难度大得多。在狗剩1号发布会后狗剩2号的工作才全面铺开,10个月后我们就完成了这么复杂的设计,没有全组兄弟们玩命的工作是不可能做到的。二是即使流片不成功,我们已经有了很好的基础,以前的至少90%的工作没有白费,即使这次不成以后总会成功的。
9月5日下午我在丝毫没有准备的情况下收到了狗剩2号的A方案的芯片,当晚我组织了联调,虽然在加电后很快就能够启动一个简单的BIOS系统,但系统运行得很不稳定。在连续三天的调试后,我们虽然得到了一些有用的结论,如验证了跨时钟域的信号握手机制,但一直无法让系统稳定运行,因此我决定终止继续联调并给李老师和唐志敏发EMAIL报告了这一情况。
虽然由于寄存器堆的问题我已经对A方案的流片不抱太大的希望,但真正面对这个结果时还是很难受。那阵子我经常坐在机房里,痴痴地看着寄存器堆的版图发呆;或者独自呆在办公室,想想过去一年中我们在实验室里度过的日日夜夜,狗剩1号发布后我们立即马不停蹄地展开狗剩2号的设计甚至在非典期间也不敢松懈。狗剩2号的设计比狗剩1号复杂得多,连续的加班也惨烈得多。在这段日子里,我自己每周的工作时间都在80小时以上,而课题组的不少同学比我还多。多少次为了一个小问题而夜不能寐,多少次为了一个小细节而殚精竭虑;每一个进步的脚印都充满了汗水,每一点进展都是心血的凝聚。竟得到这样一个结果,心里十分难受。
我和唐志敏十几年的兄弟,基本上是心意相通的,点滴的想法我都跟他讨论,点滴的进展和挫折他也都知道,有些大的决策一起做出。因此,A方案流片的失败,我跟他还是坦坦然的。虽然李老师见到我象没事似的(也许他觉得这样会让我少些压力),但这样让我更不安,本来我希望他骂我一通或者安慰我一下,可惜没有。这段日子我觉得最对不住的还是邓书记。在我们研制狗剩2号的日子里,她给了我们很多的特殊照顾,包括我们的办公环境以及我自己和课题组里员工和学生的生活条件,我一直说书记是我们的活菩萨。因此这段日子我自己都觉得不好意思见她,有时候在路上碰到,我就远远地绕开走。
由于狗剩2号A方案的流片失败,我们更加迫切地等待B方案流片的结果。这种等待有时候让我坐卧不宁,必须时时刻刻地找事情做心里才好受一些。因此在这个阶段我们对狗剩2号B方案的结构和RTL继续进行优化(真算是化悲痛为力量)。不仅延迟又降低了0.5ns,而且通过对存储层次的改进,相同主频下性能也提高了很多。
在SMIC完成流片后,我们得到了封装厂家的大力支持,以最快的速度完成了封装。我又派专人去上海立等芯片的封装结束并把芯片直接取回来,这种在煎熬中等待的日子我是一刻也不想过了。好在天道酬勤,在拿到芯片的40分中内我们就用狗剩2号把操作系统启动了起来。此后,我们又化了大约三个礼拜针对狗剩2号虚地址CACHE和猜测执行的特点把操作系统搞稳定。
现在,基于狗剩2号的Linux-PC已经稳定运行了一个多月。目前的狗剩2号最高频率为300MHz,功耗1W-2W,成品率约为80%左右。在性能方面,在联调的第一天我们只把狗剩2号的主频调到133MHz时已经明显感觉到比266MHz的狗剩1号还要快很多。狗剩1号不能胜任的许多应用,包括流媒体的软解压、GNU 2.4的支持、Mozilla浏览器、Open Office办公软件等重量级的应用,在狗剩2号中都能比较流畅地运行。尤其是流媒体的软解压,我曾经化了三天三夜进行软件优化来提高狗剩1号软解压的效果,但最后还是差一点;把狗剩1号勉强能软解压播放的一个mpeg文件在200MHz的狗剩2号上播放,只要23%的CPU。而对于标准的MP3播放,狗剩2号只要不到1%的CPU就应付裕如了。通过使用SPEC CPU2000对狗剩2号的性能分析表明,相同主频下狗剩2号的性能已经明显超过PII的性能,是狗剩1号的3-5倍。
我曾经终日坐在用狗剩2号做的计算机前,玩着各种游戏,使用各种重量级的软件来感受狗剩2号的性能。虽然对于有些大型的应用软件还感到有些迟钝,但我们的狗剩2号已经明显表现出她作为PC机中使用的CPU的资格和风范。每当我在狗剩2号上玩着LINUX PC中的各种游戏,想想一年前玩狗剩1号时觉得性能不理想时的郁闷心情,真是我这一年来最爽的体验。
狗剩2号的性能提高主要来自先进的结构设计,包括四发射和乱序执行结构的设计。而乱序执行的关键技术是狗剩2号结构设计的重点和难点,四发射的RISC结构如果没有乱序执行技术的支持是发挥不出效率的。例如典型的定点程序中平均每六、七条指令就有一条转移指令,意味着在四发射结构中每两拍就有一条转移指令。如果等转移指令的目标地址确定再进行后面的取指,意味着每取两拍指令就得等五、六拍甚至更多才能继续后面的取指。又如,做一个简单的加法需要两个操作数,而如果这两个操作数都需要从内存中(即主板上的内存条)取回来,那么在做这个加法之前,需要至少上百拍的时间为这个加法准备数据。指令乱序执行的核心思想就是减少各种相关引起的等待,充分发挥处理器的效率。
主要做法包括:(1)转移猜测,即在转移指令目标尚未确定的时候,根据过去转移指令执行的历史猜测该转移指令的转移方向和转移目标,并根据猜测的结果进行后续指令的取指,为处理器提供连续稳定的指令流。如果最后发现猜测错误,则取消猜错的转移指令后面的指令。(2)动态调度,即在前面的指令由于操作数未准备好而等待时,后面的操作数已经准备好的指令可以越过前面的指令先执行。(3)寄存器重命名,即指令运算后先写到一个临时的寄存器,等确定该指令不会被取消后再写到真正的目标寄存器中去。这样做的好处除了便于前面指令发生例外或转移猜错时取消外,还避免了由于两条指令写同一个寄存器时的等待。
此外,访存指令的乱序执行又有新的特征。除了通过增大CACHE和对CACHE进行有效的组织尽量提高CACHE命中率并降低CACHE访问的延迟外,还需要对访存指令进行乱序执行以提高效率。访存指令乱序执行的关键技术包括:(1)Non-blocking技术,即在前面的访存指令由于CACHE不命中进行长延迟的存储访问时,后面的指令可以继续访问CACHE。(2)Memory Disambiguation技术,即在存数和取数指令都乱序执行的情况下,保证取数指令都能取回它前面的最近一条对同一地址的存数指令所存的值。比如如果一条取数指令在一条存数指令之后且两条指令的地址相等,但取数指令先访问CACHE,也要保证取数指令取回该存数指令的值;又如如果一条取数指令在一条存数指令之前且两条指令的地址相等,但存数指令先访问CACHE,也要保证取数指令取回原来CACHE中的值,而不是存数指令新存的值。(3)Load Speculation技术,即在取数指令访问CACHE后,它前面的存数指令地址还没有确定(即取数指令从CACHE中取回的值有可能是错误的),先把取数指令从CACHE中取回的值送给后续的指令用,如果后来发现它前面的存数指令和该取数指令访问的是同一个单元,再取消该取数指令后面的指令。(4)Write Buffer技术,由于存数指令也是乱序执行的,存数指令所存的值不能立即写到CACHE或内存,而是要根据存数指令在程序中的次序写到CACHE或内存。
在乱序执行的结构中,虽然指令执行是乱序的,但开始和结束是有序的。指令在译码和寄存器重命名后就放在一个有序的队列中,由该队列来记录每一条指令的执行阶段并有序地结束指令。即指令在流水线中是有序进入、乱序执行、有序结束。
狗剩2号的主要结构特点包括,64位设计,7-10级流水线,包括取指、译码、重命名、发射、读寄存器、执行写回、提交等,其中乘除、浮点操作、以及访存操作在执行写回阶段需要多拍。四发射结构,最多可以有64条指令乱序执行。共有5个功能部件,包括定点ALU1(完成定点加减、逻辑、移位、转移),定点ALU2(完成定点加减、逻辑、移位、乘除),浮点ALU1(完成定点加减、转换、转移),浮点ALU2(完成乘除、开方),以及访存部件(完成访存、系统管理、数据传送)。通过对浮点指令fmt域的简单扩充,浮点部件可以执行完整的定点指令以及4路SIMD的媒体指令。在乱序执行方面,转移猜测使用混合预测+Gshare + BTB + RAS的转移猜测方式;通过物理寄存器到逻辑寄存器映射进行寄存器重命名,定点浮点寄存器堆各为64项;动态调度方面定点和浮点保留站各16项,Reorder Buffer为64项。
在存储管理方面,TLB为64项全相联,每项两页,页大小在4KB-4MB之间可变。此外,有一个独立的8项的指令TLB是数据TLB的子集。与狗剩1号一样,在TLB中增加可执行位,防止缓冲区溢出攻击。数据CACHE和指令CACHE各为32KB,二路组相联。最多允许32个访存操作的Non-blocking访问,访存相关在访存队列中通过全相联的查找解决,避免了象Alpha21264或MIPS R10000中碰到访存相关时需要重新发射。实现load-speculation,允许前面的store操作未确定的情况下执行load操作并返回结果。Cache失效时实现关键字优先访问,以减少访存等待,Uncached操作实现uncached accelerate算法加速I/O访问。
目前的狗剩2号只是我们所承担的项目的阶段性成果。它的作用主要体现在四个方面。一是对目前的处理器核设计进行验证;二是用于进行性能分析以及对性能分析方法的改进;三是验证新的物理设计方法和生产厂家;四是提前提供软件开发平台,为LINUX PC的正式推出做好准备。现在看来,这几个目的都达到了。
我们的下一步目标是在目前狗剩2号的基础上把性能再提高到现在的3-5倍,并利用明年完成的狗剩2号做一台每秒运算一千亿次的计算机。我还是博士生时唐志敏曾经带我到中科院网络中心去算题,有一次他隔着玻璃指着一台计算机对我说,这台就是从日本引进的计算机,现在系统管理的权限还在日本人手里,增加一个用户都要它们批准,什么时候我们自己做一台比它还快的计算机,就放在这台计算机边上,告诉它们这台机器就是用来做核模拟的。所以做一台自己的高性能机是我学生时期的梦想,虽然现在国内最快的高性能机已经达到每秒几万亿次,但我一定要圆这个梦。
计算所的一位研究员曾经说过,创新工作一个重要特征就是这个工作让人感到“狠”。我觉得,狗剩1号“狠”的地方就是进度快,从零开始,用了不到一年半的时间完成一个通用处理器的设计;而目前的狗剩2号“狠”的地方就是在结构上对性能的大幅提高。我相信,更“狠”的还在后头。
2003年11月30日于中国科大(完)