9. Execution of a Complete Instruction – Control Flow

完整指令的执行——控制流
AP SHANTHI博士

 

完整指令的执行——控制流

 

本模块的目标是讨论当指令在处理器中执行时如何实现控制流,使用 MIPS 架构作为案例研究,并讨论微程序控制的基础知识。

 

控制单元必须能够接受有关指令的输入并生成执行该指令所需的所有控制信号,例如。每个状态元素的写信号、每个多路复用器的选择器控制信号、ALU 控制信号等。下面的图 9.1 显示了 MIPS 架构的完整数据路径实现以及所需的各种控制信号的指示。

 


 

我们首先来看 ALU 控件。此处讨论的实现专门针对 MIPS 体系结构和前面指出的指令子集。你只需要从这个讨论中获得概念。ALU 使用 4 位进行控制。在 16 种可能的组合中,只有 6 种用于考虑中的子集。如图 9.2 所示。根据指令类的类型,ALU 将需要执行前五个功能之一。(此处未讨论的 MIPS 指令集的其他部分需要 NOR。)对于加载字和存储字 指令,我们使用 ALU 来计算内存地址。这是通过加法完成的。对于 R 型指令,ALU 需要执行五种操作之一(AND、OR、减法、加法或设置小于),具体取决于指令中 6 位函数(或函数)字段的值指令的低位(参考指令格式)。对于相等指令的分支,ALU 必须执行减法以进行比较。


 

我们可以使用一个小型控制单元来生成 4 位 ALU 控制输入,该单元将指令的功能字段和一个 2 位控制字段作为输入,我们称之为 ALUOp。ALUOp 指示要执行的操作是为加载和存储添加 (00),为 beq 减去 (01),还是由功能字段 (10) 中编码的操作确定。ALU 控制单元的输出是一个 4 位信号,它通过生成前面显示的 4 位组合之一来直接控制 ALU。在图 9.3 中,我们展示了如何根据 2 位 ALUOp 控制和 6 位功能代码设置 ALU 控制输入。第一列中列出的操作码决定了 ALUOp 位的设置。当 ALUOp 代码为 00 或 01 时,所需的 ALU 操作不依赖于功能代码字段,这表示为不关心,并且功能字段显示为XXXXXX。当 ALUOp 值为 10 时,则该功能码用于设置 ALU 控制输入。

 

为完整起见,还显示了 ALUOp 位和指令操作码之间的关系。稍后我们将看到 ALUOp 位是如何从主控制单元生成的。这种使用多级解码的风格(即,主控制单元生成 ALUOp 位,然后将其用作 ALU 控制的输入,该控制生成实际信号以控制 ALU 单元)是一种常见的实现 技术。使用多级控制可以减小主控制单元的尺寸。使用几个较小的控制单元也有可能提高控制单元的速度。这种优化很重要,因为控制单元通常对性能至关重要。

 

有几种不同的方式来实现从 2 位 ALUOp 字段和 6 位功能字段到三个 ALU 操作控制位的映射。因为函数字段的 64 个可能值中只有一小部分是感兴趣的,并且仅当 ALUOp 位等于 10 时才使用该函数字段,所以我们可以使用一小段逻辑来识别可能值的子集并导致正确的ALU 控制位的设置。

 


 

现在,我们将考虑主控单元的设计。为此,我们需要记住以下有关 MIPS ISA 指令格式的详细信息。所有这些细节都显示在图 9.4 中。

对于所有格式,操作码字段始终包含在位 31:26 – Op[5:0]
要读取的两个寄存器始终由 Rs 和 Rt 字段指定,位于位置 25:21 和 20:16。这适用于 R 类型指令、相等分支和存储
加载和存储指令的基址寄存器总是在位位置 25:21 (Rs)
目标寄存器位于两个位置之一。对于加载,它位于位位置 20:16 (Rt),而对于 R 型指令,它位于位位置 15:11 (Rd)。要选择这两个寄存器之一,需要一个多路复用器。
分支相等、加载和存储的 16 位偏移量始终位于 15:0 位置。
 

对于已经显示的简单数据路径,我们将添加所有需要的控制信号。图 9.5 显示了这些添加加上 ALU 控制块、状态元素的写信号、数据存储器的读信号和多路复用器的控制信号。由于所有多路复用器都有两个输入,因此它们每个都需要一条控制线。有七个单位控制线加上 2 位 ALUOp 控制信号。下面列出了七个控制信号:

 

1. RegDst:决定寄存器写操作的目的寄存器的控制信号——Rt域或Rd域中的寄存器

 

2. RegWrite:写入寄存器文件的控制信号

 

3. ALUSrc:决定ALU来源的控制信号——寄存器操作数或符号扩展操作数

 

4. PCSrc: The control signal that decides whether PC+4 or the target address is to written into the PC

 

5. MemWrite: The control signal which enables a write into the data memory

 

6. MemRead: The control signal which enables a read from the data memory

 

7. MemtoReg: The control signal which decides what is written into the register file, the result of the ALU operation or the data memory contents.

 

The datapath along with the control signals included is shown in Figure 9.5. Note that the control unit takes in the opcode information from the fetched instruction and generates all the control signals, depending on the operation to be performed.

 


 

现在,我们将跟踪不同类型指令的执行流程,看看必须激活哪些控制信号。让我们首先考虑 R 类型指令的执行。对于所有这些指令,源寄存器域是 Rs 和 Rt,目的寄存器域是 Rd。使用寄存器操作数进行算术/逻辑运算的各种操作是:

 从代码存储器中取出指令
由于Branch控制信号设为0,PC无条件替换为PC+4
从寄存器文件中读取指令中指定的两个寄存器
ALU 对从寄存器文件中读取的数据进行操作,使用功能代码(位 5:0,即指令的功能域)生成 ALU 函数
ALUSrc 控制信号被置低,表明第二个操作数来自一个寄存器
R 型指令的 ALUOp 字段设置为 10 以指示应从功能字段生成 ALU 控制
使用指令的位 15:11 将 ALU 的结果写入寄存器文件以选择目标寄存器
RegWrite控制信号置位,RegDst控制信号为1,表示Rd为目的寄存器
MemtoReg 控制信号设为 0,表示馈入寄存器写入数据输入的值来自 ALU
 

此外,R 型指令写入寄存器(RegWrite = 1),但既不读取也不写入数据存储器。因此,MemRead 和 MemWrite 控制信号设置为 0。这些操作以及所需的控制信号如图 9.6 所示。

 


 

Similarly, we can illustrate the execution of a load word, such as lw $t1, offset($t2). Figure 9.7 shows the active functional units and asserted control lines for a load. We can think of a load instruction as operating in five steps:

The instruction is fetched from the code memory
Since the Branch control signal is set to 0, the PC is unconditionally replaced with PC + 4
A register ($t2) value is read from the register file
The ALU computes the sum of the value read from the register file and the sign-extended, lower 16 bits of the instruction (offset)
The ALUSrc control signal is asserted, indicating that the second operand comes from the sign extended operand
The ALUOp field for R-type instructions is set to 00 to indicate that the ALU should perform addition for the address calculation
来自 ALU 的总和用作数据存储器的地址,并执行数据存储器读取
MemRead 被断言,MemWrite 控制信号设置为 0
使用指令的位 20:16 将 ALU 的结果写入寄存器文件以选择目标寄存器
RegWrite控制信号置位,RegDst控制信号为0,表示Rt为目的寄存器
MemtoReg 控制信号设为1,表示馈入寄存器写数据输入的值来自数据存储器
 


 

存储指令类似于地址计算的加载。它分四步完成 与负载不同的控制信号是:

MemWrite 为 1,MemRead 为 0
正则写入为 0
MemtoReg 和 RegDst 是 X(不在乎)
 

分支指令类似于 R 格式操作,因为它将 Rs 和 Rt 寄存器发送到 ALU。分支的 ALUOp 字段设置为减法(ALU 控制 = 01),用于测试相等性。当 RegWrite 信号为 0 时,MemtoReg 字段无关紧要。由于未写入寄存器,因此不使用寄存器数据写入端口上的数据值。分支控制信号设置为 1。ALU 对从寄存器文件中读取的数据值执行减法运算。PC + 4 的值被添加到符号扩展的指令(偏移量)的低 16 位左移;结果是分支目标地址。ALU 的零结果用于决定将哪个加法器结果存储到 PC 中。Branch指令的控制信号和数据流如图9.8所示。

 


 

Now, to the subset of instructions already discussed, we shall add a jump instruction. The jump instruction looks somewhat similar to a branch instruction but computes the target PC differently and is not conditional. Like a branch, the low order 2 bits of a jump address are always 00. The next lower 26 bits of this 32-bit address come from the 26-bit immediate field in the instruction, as shown in Figure 9.9. The upper 4 bits of the address that should replace the PC come from the PC of the jump instruction plus 4. Thus, we can implement a jump by storing into the PC the concatenation of the upper 4 bits of the current PC + 4 (these are bits 31:28 of the sequentially following instruction address), the 26-bit immediate field of the jump instruction and the bits 00.


图 9.10 显示了在前面讨论的控件中添加的跳转控件。

 

额外的多路复用器用于选择新 PC 值的源,它是递增的 PC (PC + 4)、分支目标 PC 或跳转目标 PC。额外的多路复用器需要一个额外的控制信号。这个称为Jump 的控制信号仅在指令为跳转时(即操作码为 2 时)才被置位。


 

由于我们假设所有指令都在一个时钟周期内执行,因此最长的指令决定了时钟周期。对于所考虑的指令子集,关键路径是加载路径,它采用以下路径指令存储器®寄存器文件®ALU®数据存储器®寄存器文件

 

对于这个简单的指令集,单周期实现可能是可以接受的,但是对于不同的指令改变周期是不可行的,例如。浮点运算。此外,由于时钟周期等于最坏情况延迟,因此改进普通情况没有意义,这违反了使普通情况快速的设计原则。此外,在这种单周期实现中,每个功能单元每个时钟只能使用一次。因此,某些功能单元必须重复,增加了实施成本。单周期设计在其性能和硬件成本方面都是低效的。这些缺点可以通过使用具有较短时钟周期(源自基本功能单元延迟)的实现技术来避免,并且每个指令需要多个时钟周期。

 

接下来,我们将简要讨论另一种类型的控件,即。微程序控制。在硬连线控制的情况下,我们看到了如何使用硬件生成 CPU 内部所需的所有控制信号。有一种替代方法可以生成 CPU 内部所需的控制信号。这种替代方法被称为微程序控制单元。在微程序控制单元中,控制单元的逻辑由微程序指定。微程序由微程序语言中的指令序列组成。这些是指定微操作的指令。微程序控制单元是一种相对简单的逻辑电路,能够(1)对微指令进行排序和(2)产生控制信号以执行每个微指令。

 

微程序的概念类似于计算机程序。在计算机程序中,程序的完整指令存储在主内存中,在执行过程中,它会一个接一个地从主内存中获取指令。取指令的顺序由程序计数器(PC)控制。微程序存储在微程序存储器中,执行由微程序计数器(PC)控制。微程序由微指令组成,微指令只不过是由 0 和 1 组成的字符串。在一个特定的例子中,我们读取了一个微程序内存位置的内容,它只不过是一条微指令。微程序存储器的每条输出线(数据线)对应一个控制信号。如果存储单元的内容为0,则表示没有产生信号,如果存储单元的内容为1,

 

There are basically two types of microprogrammed control – horizontal organization and vertical organization. In the case of horizontal organization, as mentioned above, you can assume that every bit in the control word corresponds to a control signal. In the case of a vertical organization, the signals are grouped and encoded in order to reduce the size of the control word. Normally some minimal level of encoding will be done even in the case of horizontal control. The fields will remain encoded in the control memory and they must be decoded to get the individual control signals. Horizontal organization has more control over the potential parallelism of operations in the datapath; however, it uses up lots of control store. Vertical organization, on the other hand, is easier to program, not very different from programming a RISC machine in assembly language, but needs extra level of decoding and may slow the machine down. Figure 9.11 shows the two formats.


 

与微程序控制单元相关的不同术语是:

 

控制字 (CW) :控制字被定义为一个字,其各个位代表各种控制信号。因此,指令控制序列中的每个控制步骤定义了 CW 中 0 和 1 的唯一组合。与机器指令的控制序列对应的 控制字 (CW) 序列构成了该指令的微程序。该微程序中的各个控制字称为微指令。对应于计算机指令集的微程序存储在一个特殊的存储器中,该存储器将被称为微程序存储器或控制存储器。与所有指令相关的控制字存储在微程序存储器中。

 

控制单元可以通过从微程序存储器中顺序读取相应微程序的CW来生成任何指令的控制信号。为了从微程序存储器中顺序读取控制字,需要一个微程序计数器 (PC)。微程序控制单元的基本结构如图 3.7 所示。起始地址生成器块负责每次在IR中加载新指令时将微程序的起始地址加载到PC中。然后 PC 自动按时钟递增,并从内存中读取连续的微指令。每个微指令基本上都提供了那个时间步所需的控制信号。微程序计数器确保控制信号以正确的顺序传送到 CPU 的各个部分。

 

我们有一些指令的执行取决于条件码和状态标志的状态,例如分支指令。在分支指令执行期间,需要在替代动作之间做出决定。为了通过微程序控制处理此类指令,控制单元的设计基于微程序中条件分支的概念。为此,需要包含一些条件分支微指令。在条件微指令中,需要指定控制必须指向的微程序存储器的地址。它被称为分支地址。除了分支地址之外,这些微指令还可以指定哪些状态标志、条件代码或可能的,

 

在计算机程序中,我们已经看到每条指令的执行由两部分组成 - 指令的获取阶段和执行阶段。还观察到所有指令的提取阶段是相同的。在微程序控制单元中,使用一个普通的微程序来获取指令。该微程序存储在特定位置,并且每条指令的执行都从该存储位置开始。在获取微程序结束时,起始地址生成器单元为当前存在于 IR 中的指令计算微程序的适当起始地址。之后,PC 控制微程序的执行,微程序以适当的顺序产生适当的控制信号。在微程序执行过程中,

  1、当遇到End指令时,PC加载微程序中第一个CW的地址,用于下一个取指周期。

 

2. 当一条新指令加载到 IR 中时,PC 将加载该指令的微程序的起始地址。

 

3、当遇到分支微指令,且满足分支条件时,PC加载分支地址。

 

图 9.12 给出了微程序控制单元的组织结构。

 


 

微程序控制的优缺点

易于设计
灵活性
易于适应组织、时间、技术的变化
可以在设计周期后期甚至现场进行更改
可以实现非常强大的指令集(只是更多的控制内存)
概论
可以在同一台机器上实现多个指令集
可以根据应用程序定制指令集。
兼容性
许多组织,相同的指令集
实施成本高
慢的
 

总而言之,我们已经研究了 MIPS 架构实现指令子集所需的控制信号。我们已经查看了算术/逻辑指令、加载/存储指令、分支指令和跳转指令的控制流程。我们还研究了与微程序控制相关的概念。

 

网页链接/支持材料

计算机组织与设计——硬件/软件接口,David A. Patterson 和 John L. Hennessy,第 4 版,Morgan Kaufmann,Elsevier,2009 年。
计算机组织,Carl Hamacher、Zvonko Vranesic 和 Safwat Zaky,第 5 版,McGraw-Hill 高等教育,2011 年。