取指令阶段

Instruction fetch stage

在 Hamacher(著名的计算机组织书籍)中,一条指令处理被分成 5 个阶段,每个阶段 运行 在一个时钟周期内。第一阶段为取指阶段,表示为:

Stage 1--Memory address<--[PC], Read memory, IR<--Memory data, PC<--[PC] + 4
Stage 2--Decode instruction, RA [R4], RB [R5]
Stage 3--RZ [RA] + [RB]
Stage 4--RY [RZ]
Stage 5--R3 [RY]

我看到PC中的increment可以用Combinational ciucuits来完成,但是费了好大劲还是找不到内存读取的方法,PC分配到内存地址寄存器和加载IR中的指令都可以在一个时钟内完成循环.

首先,流水线的目的是减少 CPU 在单个周期内需要完成的工作量。当每个阶段花费大致相等的时间时,流水线将是最有效的,但不可避免地某些阶段将不得不花费最长的时间,这将决定处理器的最大频率。

因此,问题实际上不是指令获取阶段的所有事情是否可以在 1 个周期内完成,而是做这项工作是否需要与其他周期相似的时间。

5 级流水线是一种经典设计,但今天大多数 CPU 设计都没有使用它。大多数现代高性能 CPU 都有更多的流水线阶段。

我已经复制了您在下面列出的阶段及其常用名称,我将用一个字母来引用它们。

Fetch     --Memory address<--[PC], Read memory, IR<--Memory data, PC<--[PC] + 4
Decode    --Decode instruction, RA [R4], RB [R5]
Execute   --RZ [RA] + [RB]
Memory    --RY [RZ]
Writeback --R3 [RY]

在 Fetch 阶段,CPU 必须使用当前 PC 从内存中读取(通常是读取指令缓存)。并行地,它可以有一个计算下一个 PC 的 ALU。在周期结束时,从内存中读取的数据被锁存到 IR 中,下一个已计算的 PC 被锁存到 PC 中。所以这个周期实际上只需要足够的时间从指令缓存中读取并将结果存储在寄存器中。其他步骤并行完成,花费的时间更少。

解码阶段接受指令并确定它是什么类型,并设置一堆控制逻辑来控制指令在流水线的其余部分中的执行方式。这包括确定哪些寄存器具有操作源并从这些寄存器读取值。它还可以执行其他操作来检查指令之间的冲突。

执行阶段在大多数情况下实际执行操作(例如做加法)。

Memory 阶段与 Execute 是分开的,因为它可能依赖于 Execute 来计算 load/store 将访问的内存地址。

最后Writeback阶段将最终结果写入寄存器文件。这取决于前面阶段的结果。

总的来说,每个阶段的工作量大致相等,很难将部分工作从一个阶段转移到另一个阶段。同样,在现代系统中,这些阶段中的每一个阶段通常都进一步细分为更多阶段。但是 5 阶段流水线是了解流水线如何工作的一个很好的起点,其中的每个阶段都需要相似的时间量,并且阶段之间存在逻辑依赖顺序。