MIPS ISA 的多周期实现

Multicycle implementation of MIPS ISA

我正在尝试了解 MIPS 多周期实现的工作原理。显然,我们需要临时寄存器来存储内存读取、寄存器读取和 ALU 的结果。但是,我正在努力找出原因。我只知道是因为数据会在下一个周期丢失。我想弄清楚为什么会这样。如果寄存器A和B的内容是从rs和rt读取的数据,那么只要IR的值一样,它们的值不就一样吗?此外,如果内存数据寄存器 (MDR) 不在电路中会怎样?这样不行吗?另外,我想确认我们需要指令寄存器 (IR),因为我们不想不小心执行要作为指令加载的数据?此外,ALUOut 是必需的,因为我们希望在它被分支指令的 ALU 结果覆盖之前拥有 PC+4+偏移量?我可能是错的,所以一些反馈会很好。提前致谢。

我们先打个比方。命令式语言程序的工作方式是将必要的工作分解为语句,然后这些语句通过变量相互连接。

在这个类比中,假设您要计算 k = 2i+j,但将计算分成两部分 operations/statements/cycles:首先计算 2i,然后计算 +j — 但是将 2i 的中间结果存储在哪里?答案在一些内部和中间存储中,当然不在任何程序变量中,因为清除其中一个对程序不利。所以,我们可以计算 t0 = 2i;那么 k = t0 + j;其中 t0 是额外的、隐藏的、内部存储,因此不与任何变量冲突。

将一条指令的执行分成多个周期必然会根据这样的中间结果进行操作,例如一个周期的输出和另一个周期的输入,与程序语句相互连接的方式相同,有时通过临时变量。

多周期或流水线处理器中涉及的临时寄存器用于内部和中间结果,这些结果与前一个周期中的指令进度以及该进度如何传递到下一个周期有关,这是状态。

动态地说,单周期处理器涉及很多状态:控制信号、解码值、符号扩展值、运算结果,所有这些都在架构寄存器文件之外。但是该状态不需要存储在任何地方,因为它只是在周期内在处理器中传播——最后架构寄存器(reg 文件和 PC)被更新,所以下一条指令可以只从架构可见的状态开始.

但是,当我们像使用多周期或流水线处理器一样将执行分成多个部分时,需要捕获本应在单周期处理器中传播的额外内部中间状态,以便下一个周期开始。

例如,在add R 型指令中,从指令中提取rs & rt & rd 寄存器号以及读取rs & rt 的寄存器通常在解码周期中完成。后期阶段需要这些寄存器值,如果他们必须返回寄存器文件来获取它们,那将在循环中花费一些宝贵的时间。重新读取寄存器文件所需的那些 rs 和 rt 值也可以通过重新解码指令来获得,但是如果您按照该逻辑返回到指令获取,那么您基本上已经得到了一个处理器,它在上一个周期中从头开始完成所有工作— 还不如有一个单周期处理器。

因此,这些中间周期或阶段寄存器用于保存下一个周期需要的结果,以便下一个周期可以在周期开始时开始工作,而无需重复前一个周期所做的工作.

目标寄存器编号(有时 rd,有时 rt)在解码 cycle/stage 中解码,然后在写回 cycle/stage 中使用。这是中间状态(目标寄存器的编号)的又一示例,需要从一个周期转发到另一个周期,以便该指令的执行在以后的周期中继续进行,而无需重做先前完成的工作。

在多周期处理器中,如果需要一个指令寄存器,它可能会在获取和解码之间,并且可能会进一步转发给其他 cycles/stages,但更可能是某些控制信号和指令字段被单独转发,而不是转发整个指令并可供重新解释。