欢迎光临散文网 会员登陆 & 注册

第七章-微体系结构(2):处理器设计概述

2023-02-02 21:55 作者:开发员阿梦  | 我要投稿

系统设计

书中提到,设计复杂的系统,一种好方法是从包含状态元件的硬件开始。状态原件包括存储器和体系结构状态(寄存器文件与程序计数器),如下图所示[P229]。在最初的设计中,根据用途不同存储器分为指令存储器和数据存储器。在这些存储组件之间增加组合逻辑,再基于当前状态计算出新的状态。


分析处理器系统性能的一个重要标准是”指令执行时间“。指令执行时间一般是通过基准测试获得的。执行基准测试的程序被称为基准测试程序(benchmark)。基准测试程序是指一组类似用于应用的程序集合。在很多学术组会中,经常听到基准测试这个词。这里算是明了了这个词的由来以及含义。benchmark测出的执行时间代表处理器的性能。一个程序的执行时间由以下公式给出[P230]:


其中 周期数/指令(数),即CPI,也就是执行一条平均指令所需要的周期数。相反,其倒数IPC描述的是处理器的吞吐量,表示每周期的指令数。处理器执行的某个功能会对应多条指令,计算这样一组指令总的执行时间,就是指令的执行时间。仍然承接第六章的内容——复杂的指令集(CISC),其指令数量多,但是单个指令就能实现复杂的功能,不过其硬件实现通常工作较慢;像MIPS这样精简的指令集(RISC),单个功能需要多条指令完成,当然好处就是MIPS体系结构下硬件的实现工作更快。所以不管是CISC还是RISC,其性能好与坏都是相对折中的。

在本章的后文中,将实现三种微处理器体系结构。三者的直观特点如下:

单周期微体系结构:一个周期执行一条完整的指令。时钟周期由执行时间最长的指令决定。

多周期微体系结构:相对于单周期微体系结构的重要改进是,对加法器、存储器等昂贵硬件的复用设计,来减少硬件成本。顾名思义,多周期处理器也就是使用多个较短的周期执行一条指令。

流水线微体系结构:将单周期微体系结构流水线化,使得可以同时执行多条指令,显著提高了吞吐量。

 

注:下述图中黑色加粗的线条为新加入的部分。

 

单周期处理器设计

[P231~P240]详细说明了单周期处理器的RTL扩充过程。除了状态元件是组合逻辑电路,增加数据路径和控制逻辑都属于组合逻辑电路。

所有处理器设计的第一步都是从指令存储器中读取指令,如下图所示[P231]。程序计数器寄存器提供待执行指令的地址,从指令存储器中读取待执行的指令Instr。

(1)数据路径设计

首先设计lw指令和sw指令的数据路径。对于lw来说,要解析出32位的指令Instr中的[25:21],这个是lw所需要的包含基地址的源寄存器的地址。lw指令涉及到对寄存器文件的读操作(基地址)、立即数扩展操作、ALU操作(计算存储器地址)、数据存储器读操作(读取所需数据)、寄存器写操作(将数据写入目的寄存器);在此基础上,还需要增加对数据存储器的写操作的路径。lw和sw指令需要使用指令中包含的立即数,这个立即数是16位的,需要进行符号扩展到32位,于是在指令的RTL图中需要增加立即数的符号扩展模块。每次执行一条指令后,程序计数器寄存器(PC寄存器)中的地址需要自增4(4个字节,一个字长)来获取下一条指令的地址,于是还需要对PC寄存器增加一个ALU单元来计算下一条指令的地址。完成以上功能的RTL图如下所示[P234]。

R型指令一般是需要将两个源寄存器的运算结果存入到一个目的寄存器中。因此,上图的路径,寄存器文件的输入信号WD3还要有一个来自于ALU单元计算结果的选项;同样,写入寄存器文件的地址信号A3,在R型指令中来自于指令中的[15:11]字段(rd)。于是扩展RTL图如下[P234]。

最后是扩展实现分支指令beq的数据路径。关于beq指令的功能见[P193]。最终的只包含数据路径的单周期处理器效果如下[P235]:


(2)控制逻辑设计

单周期处理器的控制逻辑则借助于指令中的opcode字段和funct字段来确定控制信号。

上述图中,根据不同指令的功能,已经标出了很多控制信号,它们将由控制单元统一管理。强调:所有R型指令的opcode是一样的(6位0),不同的功能使用funct字段来区分;I型指令和J型指令的opcode每一个都不同。对寄存器、存储器的读写操作都可以由opcode来确定。不过不同的R型指令,对ALU单元的操作不同。ALU执行的运算包括加、减、与、或、slt(小于置位)。于是,将单周期处理器的控制逻辑分为两部分:主译码器和ALU译码器,如下所示[P236]。

如上图所示,大部分的控制信号将由主译码器赋值;主译码器还有一个2位输出ALUOp。从本章最后的单周期处理器的Verilog实现中[P272]可以读懂ALUOp的逻辑。除了R型指令需要使用ALU单元,I型指令如lw和sw需要使用ALU来计算存储器地址(加法);如beq需要对两个寄存器的值做减法,来判断两个寄存器的值是否相等。因首先使用ALU单元的指令有不同的类型。第一类是非R型指令执行加法,比如lw和sw指令;第二类是非R型指令执行减法,比如beq指令;第三类是R型指令使用ALU单元,需要根据指令中funct字段来进一步确定操作。因此ALUOp需要2位2进制数来包含以上三种情况。前面讲到,R型指令包含的ALU操作包括加、减、与、或、以及slt5种,因此ALUControl需要3位二进制数来标识不同的ALU操作。书中使用了两个表[P236]来说明ALUOp的值和ALUControl的值的确定。

其中,表5-1[P153]就是ALU对不同计算操作的编码。

这样一来,最终的单周期处理器设计RTL如下:

以下多周期处理器和流水线处理器重点讲述与单周期处理器之间的不同。 

多周期处理器设计

单周期处理器有三个明显的缺点。

首先,要有足够长的周期时间来完成最慢的指令。再者,是对重要数字模块的重用性不高。在上述的单周期处理器的设计中,用到了三个ALU单元。但是在实际的电路中,ALU是相对占用芯片面积的电路。第三,单周期处理器设计中采取了独立的指令存储器和数据存储器。但在实际的计算机中只有一个大容量的存储器来存储指令和数据,并且支持读写操作。

状态元件都是同步时序逻辑电路,且采用同样的CLK信号。在单周期处理器的设计中,除了状态元件,其他的数据通路和控制逻辑都由组合逻辑完成,也就是不引入时序逻辑(有限状态机)才能保证一条指令只使用一个周期。因此每一次时钟周期必须足够长,像lw这样的指令,就需要在同一个时钟上升沿完成读取寄存器文件、读取数据存储器,并在最后写入寄存器文件(总监组合逻辑完成的计算和立即数符号扩展操作耗时暂且不计),则单个时钟周期必须足够长来完成这些操作。

多周期处理器不要求指令在一个周期内完成,而是使用多个周期完成一条指令。因此,状态元件的使用就宽松得多;比如,同一个ALU单元,在本周期内被用于lw计算存储器地址,在下一个周期可以被用来计算R型指令的计算结果。因此在控制逻辑中,多周期处理器将通过有限状态机来复用ALU单元。(这里我想了一下,其实在单周期处理器中也可以使用复用ALU的设计。可以在控制单元中对ALU单元的使用增加复用器。但是,这样新引入的数字模块和控制信号将使控制逻辑变得复杂,为了说明设计则没有必要。)同样的,存储器也没有必要分类了,也使用有限状态机来复用一个存储器来操作指令或数据即可。此时从存储器取指令的示意图如下[P241]。

取指操作也由时序逻辑控制,因此需要一个额外的寄存器来存储结果。这个寄存器叫做指令寄存器(Instruction Register)。在后续的多周期处理器设计中将增加多个如此的非体系结构寄存器来保存中间结果。

 

流水线处理器设计

流水线处理器的设计思路是,将单周期处理器分解成5个流水阶段。分别是:

取指(Fetch):处理器从指令存储器中读取指令。

译码(Decode):处理器从寄存器文件读取源操作数,并对指令译码以便产生控制信号。

执行(Execute):处理器使用ALU执行计算。

存储器(Memory):读或写数据存储器。

写回(Writeback):将结果写回到寄存器文件。

流水线处理器的数据路径设计和单周期处理器相似,不过将其划分为5个阶段;控制逻辑设计则和单周期处理器一样。不过流水线处理器还需要增加额外的硬件模块来解决多条指令同时执行引起的冲突。

 

(第七章的总结暂时告一段落。重点是回顾了单周期处理器的设计和多周期处理器、流水线处理器的设计思路。关于多周期处理器的详细思路,以及流水线处理器中用到的冲突解决方案,我们再娓娓道来。要先去学其他的内容了,主攻SSD和PCIe)。


第七章-微体系结构(2):处理器设计概述的评论 (共 条)

分享到微博请遵守国家法律