我们研究beq指令,beq rs,rt,imm16
1. 条件分支指令的示例
if(i == j) f = g+h;
else f = g-h;
对应的MIPS指令是,
beq $s3,$s4,True # branch i==j
sub $s0,$s1,$s2 # f = g-h (false)
j Next # go to Next
True: add $s0,$s1,$s2 # f = g+h
Next: ...
2. beq指令
beq指令的指令格式如下图所示,
2.1 beq指令的操作步骤
<1> MEM[PC],取指
<2> if(R[rs] - R[rt] == 0),判断转移条件是否成立
<3> then PC = PC + 4 + SignExt[imm16] * 4;
else PC = PC + 4;
2.2 beq指令的操作
我们可以单单只看条件成立的情况,因为其他情况与顺序执行的指令相同。
首先看if(R[rs] - R[rt] == 0),这就需要对数据通路进行一定的改造,ALU增加功能,以判断两个输入的差是否相等,如下图所示,如果运算结果为0,就把zero信号置1。
那么,if判断完整的意思就是,
if(R[rs] - R[rt] == 0), then zero = 1; else zero = 0;
现在就可以给出beq指令的控制信号,
<1> nPC_sel = "branch",具体IFU如何处理,一会再看
<2> ALUSrc = 0
<3> ExtOp = x
<4> ALUCtr = "SUB"
<5> MemWr = 0
<6> MemtoReg = x
<7> RegWr = 0
<8> RegDst = x
这样给出控制信号后,数据通路就可以完成条件判断,现在来看IFU如何对PC进行更新。
2.3 PC的更新
下图所示,是增加zero信号输入的IFU示意图,
IFU中,关键是下图所示的2选1多路器,决定了PC更新为哪个地址,
可以列一个真值表,看这个MUX如何更新PC,
当nPC_sel = 0时,说明这个指令是运算指令或访存指令,不管zero信号如何,PC都被更新为PC+4;
当nPC_sel = 1时,说明这是一条分支指令,当zero信号为0,表示条件判断不成立,PC被更新为PC+4;
当nPC_sel = 1时,且zero信号为1,说明条件判断成立,将分支的目标地址更新到PC寄存器中。
一个与门就可以实现上面这个真值表,如下图所示,
现在需要解决的问题就是,如何得到目标地址TargetAddress。
TargetAddress = PC + 4 + SignExt[imm16] * 4
imm16可以直接从指令编码的低16位获得,乘4可以通过左移2位实现,再增加一个加法器就可以实现目标地址的计算了,完整的IFU如下图所示,
至此,我们在笔记12-14中已经完成了笔记10中的处理器设计的第4步,分析每条指令的实现,确定控制信号。