西西河

主题:【原创】分析一下龙芯2和MIPS的关系--1 背景 -- 随园过客

共:💬48 🌺192
全看分页树展 · 主题 跟帖
家园 【原创】3. 龙芯核心与MIPS核心的关系

MIPS的R10000是一个经典RISC核,虽然诞生于10多年前,但是它的设计已经有了很多所谓“后RISC”特点。它是第一个四发射超流水芯片。那篇Yeager 于96年写的介绍R10000的文章是学CPU设计学生的必读资料,公开的R10000资料也非常丰富详尽,也有质量很高的开源模拟器,甚至核心本身都不难拿到。这一方面因为MIPS老板是学界出身,对教学用途很支持,另一方面R10000到底是10年的技术了。而后来的MIPS芯片以及其他RISC芯片的资料就难拿多了。

可以说龙芯从一开始就打算仿造R10000。863立项时说的两个指标,主频达500MHz和SPEC CPU 2000达300分。其实这基本就是R10000的后继R12000在2000年的性能指标,R12000基本沿用了R10000的设计,不过采用了更新的工艺。为什么不仿IBM的Power芯片,为什么不仿Alpha芯片?这些都是非常成功的RISC芯片。主要原因就是R10000资料丰富。863立项时说指标,成功的把握还是很大的,因为当初的R12000是.25micron的工艺,用现代.18工艺重造即使不做任何设计上的改进性能也会超出的。这就是现在很多486/586芯片设计又被重新生产的原因,比如AMD的Geode系列芯片,在性能尤其功耗上面比当初有很大改进,改头换面作为低功耗嵌入式芯片在卖。所以看到胡李二人事后说的什么当初说什么做不出“提头来见”之类的话其实很可笑,因为这里面风险并不大。

先说说龙芯2和R10000的相似点。

两者都是四发射芯片,也就是说每一个周期可以同时取四条指令。这个不稀奇,大多数RISC芯片都是四发射。而考虑复杂程度,再往上用增加发射来提高性能也不大值得了。

但是两者都有的五个功能模块,其间的差别更多只是在名称上。这五个模块分别是两个整数计算模块(龙芯的叫ALU1和ALU2,R10000的叫Integer ALU1和Integer ALU2),两个浮点计算模块(龙芯的叫FPU1和FPU2,R10000的叫FP Adder和FP Multiplier),再加上一个地址计算模块(R10000叫Address Calculation,龙芯叫AGU或者Address Generation Unit)。功能块有几个各是什么用途是结构设计上很重要的一点,不同芯片,既是都是64位4发射的RISC芯片,往往会做出不同的选择。比如IBM的Power3芯片,却有三个整数计算模块,两个浮点计算模块,两个地址计算模块;HP PA8000则是四个整数计算模块,四个浮点计算模块,两个地址计算模块;DEC的Alpha 21164总共四个功能模块。即使同样是MIPS64架构的SB1 core也是两个整数计算模块,两个浮点计算模块,两个地址计算模块的构成。

龙芯和R10000这样的大结构框架上的一致我认为很能说明龙芯与R10000之间结构上的继承关系。因为这样的大框架定了,基本的电路设计就定下了,剩下的只是如何存取指令,如何做地址转换这些事情了。

好了说明了结构上相似点,再看看龙芯所说的不同点。

首先是龙芯的九级流水线,这似乎是很明显的区别,被很多地方提到作为龙芯与R10000不同的证据,因为R10000用的是五到七级流水线。但是细看就有了些疑问。龙芯的九级分别是:取指、预译码、译码、重命名、送入队列、发射、读寄存器、执行、提交。R10000对应整数指令的各级是:取指、译码+重命名+送入队列,发射+读寄存器,执行、提交。而对于浮点和地址指令,相对应的执行级有所不同,因为复杂程度被分成了两个或三个级(时钟周期)。从这里可以看出,龙芯的所谓九级流水和R10000的七级流水,很可能不是苹果与苹果之间的比较。R10000的一级包括了一个时钟周期内可完成的所有操作,而龙芯的级只是操作。另外龙芯的最后两级又太概括,比如所说的执行级,对于浮点和地址的执行操作很可能不是在一个时钟周期内完成的。当然也可能龙芯一个时钟周期内只可完成一个操作,每个操作都在一个时钟周期内完成,不过我对此深表怀疑。至于龙芯的预译码级,我手头没有相关资料所以没法评论,不知是否和龙芯新加的那些指令有关,得把它们先转换处理了。总的来说对于流水线深度因为龙芯公开的九级资料比较模糊不好分析,但其间差别远没有宣传的那么大。

龙芯还有一个被提到的“不同点”,就是龙芯2号在发射指令时把指令分成定点(包括访存)以及浮点两组而R10000在发射指令时把指令分成定点指令、浮点指令、和访存指令三组。这一点细推敲也不容易成立,因为R10000的访存指令虽然有自己的队列,但走的数据路径却和整数指令一样经过整数寄存器阵列,从这个意义上说也可以讲R10000一样分两组,分别走浮点寄存器阵列和整数寄存器阵列。所以很可能这一区别也只是说法上的不同而已。

剩下的另两个不同点的确是龙芯与R10000的主要区别,在分支处理和存储层比如针对溢出写覆盖的保护这两块。不过这里面涉及的技术性东西太多,对这个论坛不大合适,另外也写累了没兴趣再写了,所以就不多说了。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河