【问题标题】:Multicycle implementation of MIPS ISAMIPS ISA的多周期实现
【发布时间】:2021-12-03 06:02:41
【问题描述】:

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

【问题讨论】:

    标签: mips cpu-architecture


    【解决方案1】:

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

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

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

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

    从动态上讲,单周期处理器涉及很多状态:控制信号、解码值、符号扩展值、alu 结果,所有这些都超出了架构寄存器文件的范围。但是该状态不需要存储在任何地方,因为它只是在循环期间通过处理器传播——最后架构寄存器(reg 文件和 PC)被更新,因此下一条指令可以仅从架构可见状态开始.

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

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

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

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

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

    【讨论】:

    • 我明白了。所以简而言之,这些临时寄存器的存在是为了避免重复工作,并确保某些信息不会被意外覆盖。那是对的吗?我通过解释多周期实现的每个网站,他们总是说临时寄存器在那里,因为数据将在下一个周期丢失。我看不出这如何应用于 rs 和 rd ,因为只要 IR 保持不变,它们就应该从寄存器文件中读取。如果我们不存储这些值,他们从未提及重复工作。顺便谢谢 :D。
    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2017-10-30
    • 2016-07-14
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多