0

5 级流水线 CPU 具有以下阶段序列:

  • IF——从指令存储器中取指令。

  • RD——指令解码和寄存器读取。

  • EX – 执行:用于数据和地址计算的 ALU 操作。

  • MA – 数据存储器访问 – 对于写访问,使用在 RD 状态下读取的寄存器。

  • WB——寄存器回写。

考虑以下指令序列:

I1: L  R0, loc 1       ; R0 <=M[loc1]
I2: A  R0, R0 1        ; R0 <= R0 + R0
I3: S  R2, R0 1        ; R2 <= R2 - R0

让每个阶段占用一个时钟周期。从 I1 的取指开始,完成上述指令序列所需的时钟周期数是多少?

所以这是我的解决方案。

    1   2   3   4   5   6   7   8   9   10  11  12  13
I1: IF  RD  EX  MA  WB
I2:     IF  -   -   -   RD  EX  MA  WB
I3:         IF  -   -   -   -   -   -   RD  EX  MA  WB

通过这种方式,我总共获得了 13 个周期。我假设由于问题中没有明确提到操作数转发。因此注册将仅在 WB 阶段后可用。但选项如下:

  • A. 8
  • B. 10
  • C. 12
  • D. 15
4

2 回答 2

2

对于写访问,使用在 RD 阶段读取的寄存器 - 这意味着如果我们不能将操作数转发到 MA 阶段。因此,我们可以假设可以为其他阶段完成操作数转发。

带数据转发:

T1 T2 T3 T4 T5 T6 T7 T8

IF RD EX MA WB
-IF RD - EX MA WB --IF
- RD EX MA WB

因此,答案将是 8。

http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/forward.html

于 2016-11-05T11:44:16.983 回答
1

由于下面的行,给定的问题是基于结构危险的

MA – 数据存储器访问 – 对于写访问,使用在 RD 状态下读取的寄存器

而不是数据依赖,虽然它似乎有数据依赖。因此,问题中没有提及数据转发。

结构危险是针对加载指令的。因此下一条指令的执行要等到第一条指令执行后才能开始执行,因为M[loc1]所指的内存位置的有效地址只会在流水线的执行阶段计算。所以在那之前总线不会被释放,因此第二条指令不能被提取。因此第二条指令将需要额外的2 个时钟周期

并且在第一条指令成功将数据加载到寄存器 R0 之前,第三条指令无法开始执行。这导致第三条指令多出3 个时钟周期。

Hence, total clock cycles = (CC for I1) + (CC for I2) + (CC for I3) 
= 5 + 2 + 3
= 10 clock cycles
于 2014-02-14T09:59:22.343 回答