这是一本强调从实践中学理念的计算机体系结构的教材。作者结合自身从事国产龙芯高性能通用处理器研制的实践,以准确精练、生动活泼的语言,将计算机体系结构的知识深入浅出地传授给读者。
全书共13章,第1~4章从计算机体系结构的研究内容和发展趋势、二进制和逻辑电路、指令系统结构等方面介绍计算机体系结构的基础内容。第5~7章从静态流水线、动态流水线、多发射数据通路等方面介绍指令流水线结构。第8~11章从转移预测、功能部件、高速缓存、存储管理等方面介绍处理器的模块级结构。第12章介绍多处理器结构。第13章主要介绍作者在龙芯处理器设计过程中的经验教训。
本书适合作为高等学校计算机专业的高年级本科生、研究生的教材,也可以作为相关工程技术人员的学习参考书。
2002年初,我刚开始龙芯处理器的研制没多久,中科院计算技术研究所负责研究生教育的徐志伟老师就找我说有没有可能在计算技术研究所开设一门计算机系统结构方面的“大课程”。他进一步解释说,在国外很好的学校经常有这样的课程,让学生每天都忙得“死去活来”,熬夜到凌晨两三点才能完成作业,但从中还“真正能学到东西”。我便欣然应允。
我从2002年秋季开始给计算技术研究所博士生开设“处理器设计”课程,讲课后才知道给学生上课比做研究难。一方面是因为授课比做研究在内容上要求更加全面系统,尤其是讲体系结构课程,除了体系结构本身外,还需要对操作系统、编译器原理、晶体管原理和基本工艺流程等相关领域的知识融会贯通;另一方面做研究时很多内容只要宏观了解就可以了,但授课就必须对其搞清楚,不清楚就不敢讲或者讲起来不生动。例如,在龙芯处理器设计时我安排了专门的人负责浮点模块,因为自己对于IEEE的浮点数据格式标准只是大致了解,但要给学生讲自己就得搞清楚;又如,在讲TLB时,就得搞清楚操作系统的存储管理,否则越讲学生就越糊涂。基于上述原因,这门课程几乎花掉了我前3年的所有业余时间,每一讲都至少需要花一周的时间做准备,而且每一年都要对讲义做大幅度调整,成为一个沉重的负担。经过3年的积累,课程的章节框架才基本定型。
在此基础上,2005年开始在中国科学院研究生院同时针对硕士和博士讲授“高性能计算机系统结构”课程。硕士和博士课程的主要区别在于作业和考试内容不同。由于要针对硕士讲授,因此在基础性方面又做了补充和加强,并根据授课的实际需要每年再对各章的内容进行了调整和完善。到2008年,准备根据讲课的内容出版一部教材,因此对2008年的讲授进行了录音整理。为了增加教材的可读性和趣味性,在整理教材时保持了第一人称的形式,同时尽量做到句子及内容的简洁和严谨。
本教材具有如下几个特点。
一是基础性,在快速变化的体系结构学科中总结出其中不变的原理性东西。计算机体系结构发展得很快,不断有新的内容出现,但几十年来积淀下来的东西并不多。关键是要发现快速变化中不变的原理性的东西,如果掌握了这些原理,就能以不变应万变。因此,在教材编写时“不赶时髦”且“不跟风”,把计算机体系结构在几十年的发展过程中形成的里程碑的工作讲透,重点介绍具体结构背后的原理和思路。
二是系统性,做到对体系结构、基础软件、电路和器件的融会贯通。根据我自己从事处理器设计的经验,一个体系结构的设计者就像一个带兵打仗的将领,结构设计就是“排兵布阵”。更重要的是要“上知天文,下知地理”。所谓“上知天文”,指的是在结构设计过程中要充分地了解与处理器联系紧密的操作系统、编译器以及应用程序的原理和行为;所谓“下知地理”,指的是在做结构设计时要充分考虑到所设计的模块和功能部件的电路和版图结构。要做到一以贯之。例如在打字时,要很清楚地知道从按键盘到屏幕上出现一个字的过程中应用程序、操作系统、硬件、芯片、晶体管等的完整的交互行为。
三是实践性,做“在硅上工作(work on silicon)”的设计。在龙芯处理器的研发中深刻感觉到,计算机体系结构是实践性很强的学科。因此,在本教材的内容中充分结合了龙芯处理器研发过程中获得的体验,强调要做work on silicon的设计,而不要停留在work on paper的设计上。本教材的最后一章“实践是最好的课堂”,通过龙芯研制过程中发生的10个故事来进一步强调学习计算机体系结构设计实践的重要性。此外,在教材的习题部分安排了不少需要学生动手实践的内容。这些习题是对内容的延伸,需要学生在领会教材内容的精神之后进行发挥。
由于体系结构这门学科发展迅速,涉及面广,因此本教材中难免有不当和疏漏之处,敬请批评指正。同时我也意识到,以活泼生动的形式编写教材是一种大胆的尝试,需要面临很多挑战。因此,非常欢迎使用本教材的教师和学生对本教材提出宝贵意见。
胡伟武2017年暑期前言计算机体系结构(第2版)
第5章静态流水线前4章分别介绍了计算机系统结构的基本概念、二进制和逻辑电路以及指令系统结构。有了这些基础,这一章以一个简单的CPU为例介绍CPU的流水线设计,后面2章再介绍比较复杂的流水线和多发射结构。
我们从MIPS指令集拣选部分代表性的指令作为简单CPU需要实现的指令集,其中指令及其编码列举在表5.1中,指令的具体含义及指令集的其他定义请参看本书的第4章。
表5.1简单CPU指令和指令编码t第5章静态流水线计算机体系结构(第2版)5.1数据通路设计基于指令系统的定义,先设计这个简单CPU的数据通路,其主要模块包括一个指令存储器、一个数据存储器、一个通用寄存器堆、一个指令寄存器(IR)和一个程序计数器(PC),如图5.1所示。
图5.1主要数据通路CPU工作时,首先用PC作为地址去指令存储器中取指令。PC的值是怎么来的呢?有两种情况,第一种是执行完一条指令顺序执行时,下一条指令的PC(Next PC,NPC)的值是PC+4,因为指令占4个字节;第二种是执行转移指令时NPC值是延迟槽PC+offset。因为延迟槽指令总是需要执行的,所以当前指令是跳转的转移指令时并不能立即修改PC为跳转目标,只能是延迟槽指令在CPU里时才能修改。这样,生成NPC的部分有一个2选1逻辑根据转移指令跳转是否成功来选择offset值和4,选择之后再由一个加法器跟PC的值相加,并送到PC中。然后,根据这个PC的值到指令存储器取指,指令取出来以后放到指令寄存器IR中。IR中的指令包含操作码(op)和功能码(func),目标寄存器号(rd),两个源寄存器号(rs、rt),还有立即数/偏移量(imm),其中立即数/偏移量有16位,与rd和func域有部分重叠。
通用寄存器堆、运算部件和存储器的通路由IR中的域统一控制。通用寄存器的内部电路结构如图5.2所示,其读地址RA1通过控制一个32选1逻辑从32组寄存器中选出一组将其值输出至RD1,同样的RA2控制另一个32选1逻辑从32组寄存器中选出另一组将其值输出至RD2;当发生写操作时,写地址WA1通过译码器得到各组的选择信号再与上全局写使能WE1形成每一组寄存器的写使能,用来控制将写入数据WD1写入到相应的寄存器组中。IR的rs域连接到通用寄存器堆的读端口1的地址输入,从中选出一个将其值送到ALU的其中一端;IR的rt域连接到通用寄存器堆的读端口2的地址输入,从中也选出一个值来,并和符号扩展后的立即数/偏移量2选1后送到ALU的另外一端。这是因为ADDIU、LW和SW指令不用寄存器读出的值作为第二个源操作数进行运算,而是用指令中的立即数/偏移量进行运算。转移指令也用到立即数/偏移量,但仅在计算NPC时使用,这里我们使用独立的加法器进行NPC的计算。ALU完成计算操作之后要把算术运算或逻辑运算的结果写回到通用寄存器堆里去,具体写回到哪个寄存器由指令中的rd或rt域来控制,目标连接到通用寄存器堆的写端口1的地址输入,进而选中一个寄存器并打开其写使能。对于LW指令来说,其目标寄存器号来自于指令的rt域而非其他指令的rd域,所以需要通过一个2选1逻辑选择出目标寄存器号。访存指令LW和SW把ALU的运算结果作为访存地址。LW从数据存储器中把值取出,然后写回到目标寄存器去,所以写入通用寄存器堆的数据也需要通过一个2选1逻辑从ALU运算结果和数据存储器读出结果之间选择。SW将寄存器堆中读出的值写入到数据存储器中。
图5.2寄存器堆电路结构上述描述实现了这个CPU中的主要数据通路,并涵盖了指令系统中定义的所有指令,但没有描述这个通路的控制逻辑部分。下面我们一步一步地往里加东西。
5.2控制逻辑设计实现了CPU的数据通路之后,下面先添加CPU的控制逻辑。控制逻辑根据指令的要求控制数据在数据通路中流动。
从上述数据通路可以看出,为了让数据根据指令的要求在数据通路中正确地流动,需要对以下通路进行控制: 计算PC的加法器是否需要看转移跳转情况决定是加4还是加offset(C1);是选择寄存器的值还是选择立即数作为ALU的第二个源操作数(C2);ALU做什么运算(ALUOp);运算结果是把ALU的运算结果写回,还是把从数据存储器读出来的结果写回(C3);目的寄存器号是来自指令的rd域还是rt域(C4);什么情况下使能通用寄存器堆的写使能(C5),因为有一些指令是不写寄存器的,例如SW指令和转移指令;什么情况下使能数据存储的写使能(C6)。
根据指令的功能和数据通路的情况,表5.2给出了CPU中控制逻辑的真值表,其中X表示是0或1无所谓。
……