Assembly MIPS中分支指令的NOP数

Assembly MIPS中分支指令的NOP数,assembly,process,mips,cpu-architecture,Assembly,Process,Mips,Cpu Architecture,我们最近在电路课上讨论了单周期和流水线处理器时的NOP。如果我们有以下代码: add $t1, $t2, $t3 sub $t4, $t1, $t0 由于$t1,存在数据危险。在没有数据危险检测单元的流水线处理器中,在更新的$t1值被写回寄存器之前,子指令使用旧值-因此是数据危险。如果我们添加2个NOP,那么我们可以解决这个问题,或者,如果有数据危险检测单元,我们可以在执行阶段后将结果转发给$t1 但是,如果我们有分支指令呢?例如: add $t1, $t2, $t3 beq $t0, $t1

我们最近在电路课上讨论了单周期和流水线处理器时的NOP。如果我们有以下代码:

add $t1, $t2, $t3
sub $t4, $t1, $t0
由于
$t1
,存在数据危险。在没有数据危险检测单元的流水线处理器中,在更新的
$t1
值被写回寄存器之前,子指令使用旧值-因此是数据危险。如果我们添加2个NOP,那么我们可以解决这个问题,或者,如果有数据危险检测单元,我们可以在执行阶段后将结果转发给
$t1

但是,如果我们有分支指令呢?例如:

add $t1, $t2, $t3
beq $t0, $t1, Label

如果我们不能使用转发,我们是否也在这里添加2个NOP?

在没有分支预测的标准流水线MIPS处理器中,在ALU中执行
beq
的相等性测试,即在前阶段-这意味着它受到相同的ALU->ALU危害,相同的旁路将减轻该危害

(这与执行分支指令后可能发生的管道重新填充暂停无关,与执行或预测失误的分支无关,而只与显示的数据相关性的延迟有关。)


如果理论处理器是流水线的,但没有危险保护(旁路或延迟),则需要与第一个场景相同的2个NOP。

如果没有架构的额外细节,很难明确回答。还有很多版本的mips体系结构

但首先看看你的声明

add $t1, $t2, $t3
sub $t4, $t1, $t0
由于$t1存在数据危险

如果我们添加2个NOP,那么我们可以解决这个问题

不是真的。没有任何数据转发意味着,有了一个NOP,新的$t1将在MM/WR管道REG中,有了第二个NOP,它将被写回注册库。但不适用于DI/EX管道注册。因此,要在只有两个NOP的情况下获得正确的行为,您需要一个将写回寄存器组的数据转发回DI/EX REG的方法,或者使用一些技巧,比如在寄存器组的时钟下降沿上写入数据,然后在周期的第二部分读取数据

我们将假设您的假设是正确的,并且在寄存器库的输入和输出之间存在某种类型的转发

关于分支指令,有几种方法可以实现它们

最明显的方法是使用EX-stage同时计算条件($t0=?$t1)和ALU以及带有附加加法器的分支地址。但是is有一个主要的缺点:在完成此计算时,LI阶段正在获取一条新指令(其中一条已经处于解码阶段),这将导致2个周期的分支惩罚

在经典mips管道中所做的是在解码阶段处理分支。在此阶段,加法器使用PC+立即数计算分支地址,并添加专用比较器以直接比较寄存器组的输出(顺便说一句,这就是为什么您只能对分支指令进行比较eq/neq,以简化此比较器,而ALU比较器可以进行其他类型的比较)。这样,分支惩罚仅为一个周期

如果我们假设这是您的实际架构,并且除了注册库之外,我们没有任何转发手段,那么一个NOP就足够了。一次不之后,新的 $t1的价值在MEM/WR管道注册表中。在下一个周期,它将在前半个周期内写回注册银行,并可用于下半个周期内分行的比较


当然,如果您假设分支是在EX阶段处理的(并且您有2个循环的分支惩罚),则需要第二个NOP

Real MIPS I/R2000在EX阶段的前半部分评估分支条件,因此“是”转发到分支与转发到任何ALU指令相同。在没有转发的假设MIPS上,谁知道呢?其他可能性包括在ID阶段评估分支条件(就像我过去认为真实的MIPS那样)有MIPS实际操作的全部细节。MIPS R2000(经典的MIPS I)实际在EX周期的前半部分评估分支,而不是像我过去认为的在ID中。解释全部细节:如果仅在一个周期的后半部分开始,则允许1个周期的分支延迟(由1个延迟槽隐藏),同时分支仍能够在不暂停的情况下使用上一条ALU指令的结果。除非你说的是重新设计成为R2000之前的研究MIPS?但是
slt
/
beq
会暂停。