TargetWrite/IorD 控制线在多周期 MIPS 处理器上的作用

What does the TargetWrite/IorD Control Line do on a multicycle MIPS processer

我们在单周期和流水线中了解了有关控制线和 MIPS 芯片一般功能的所有主要细节。

但是,在多周期中,除了其他变化外,控制线并不相同。

TargetWrite (ALUout) 和 IorD 控制线具体修改了什么? 根据我的分析,TW 似乎会根据它接收到的位修改 PC 指向的位置(对于跳转、分支或标准移动到下一行)...我是否遗漏了什么?

另外,IorD 线究竟有什么作用? 我看了两门课程教科书:参见 Mips 运行 和计算机体系结构:Patterson 和 Hennessy 的定量方法,它们似乎没有提到这些行...

首先,请注意此框图没有单独的指令存储器和数据存储器。这意味着它要么有一个统一的缓存,要么直接进入内存。 MIPS 的大多数其他框图将具有单独的专用指令存储器(高速缓存)和数据存储器(高速缓存)。这样做的好处是处理器可以并行读取指令和read/write数据。在多周期处理器的简单版本中,可能不需要并行读取指令和数据,因此统一缓存简化了硬件。

所以,IorD 正在做的是选择提供给内存的地址的来源——至于它是在为一条指令做一个获取周期,还是一个 read/write from/to 数据.

IorD=0时,PC提供要读取的地址(即取指),当IorD=1时,ALU提供地址给read/write 数据来自。对于数据操作,ALU 正在计算基址+位移寻址模式:Reg[rs] + SignExt32(imm16) 作为数据读取或写入操作的有效地址。

此外,请注意,此框图不包含用于将 PC 递增 4 的单独加法器,而大多数其他框图都有。查找前几个 MIPS 单周期数据路径图像中的任何一个,您将看到该 PC 增量的专用加法器。使用专用加法器允许 PC 与 ALU 完成的操作并行递增,而省略专用加法器意味着主 ALU 必须执行 PC 的递增。但是,这可能会在多周期实现的简单版本中节省晶体管,其中 ALU 并非每个周期都在使用,因此可以以其他方式使用。

由于 Target 有一个控件 TargetWrite,我们可能会假设这是一个内部寄存器,可能有助于缓冲预期的分支目标地址,例如,如果分支目标是在一个循环,最后在另一个循环中使用。

(我认为这可能是关于分支延迟槽实现的缓冲(因为这些分支被延迟了一条指令),但如果是这样的话,J-Type 指令也会通过 Target,而他们没有。)

所以,在我看来,这个多周期处理器的机制是处理分支指令,比如 beq,它必须:

  • PC + 4
  • 计算下一个顺序 PC 地址
  • (PC+4) + SignExt32(imm32)
  • 计算分支目标地址
  • 计算分支条件(Reg[rs] == Reg[rt] ?)

但是它们的计算顺序是什么?从状态 0 的控制信号可以清楚地看出:首先计算 PC+4,然后写回 PC,用于所有指令(即对于分支,无论是否采用分支)。

在我看来,在下一个周期中,(PC+4) + SignExt32(imm16) 被计算(通过重用现在在 PC 寄存器中的先前 PC+4 — 这个结果存储在 Target 来缓冲该值,因为它还不知道分支是否被采用。在下一个循环中,比较 rsrt 的内容是否相等,如果相等,则应该采用分支,因此 PCSource=1, PCWrite=1 从缓冲区中选择 Target 来更新 PC,如果不采用,因为 PC 已经更新为 [=23] =],即 PC+4 代表 (PCWrite=0, PCSource=don't care) 下一条指令的开始。在任何一种情况下,下一条指令 运行 的地址为 PC 所在的地址。

或者,由于处理器是多周期的,计算顺序可以是:计算 PC+4 并存储到 PC。计算分支条件,决定运行下一个什么样的循环,即对于not-taken条件,直接进入下一个取指循环(PC+4PC),或者,对于采取的分支条件,计算 (PC+4) + SignExt32(imm16) 并将其放入 PC,然后继续下一个取指令周期。

这种替代方法需要动态更改 cycles/state 分支,因此会使多周期状态机稍微复杂一些,也不需要缓冲分支 Target — 所以我认为它是更有可能是前者而不是这个替代方案。