14. 分支指令的控制信号

我们研究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指令的指令格式如下图所示,

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。

数据通路稍加改造,ALU可以输出zero信号

那么,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示意图,

增加zero信号输入的IFU示意图

IFU中,关键是下图所示的2选1多路器,决定了PC更新为哪个地址,

PC更新什么内容

可以列一个真值表,看这个MUX如何更新PC,

PC更新条件的真值表

当nPC_sel = 0时,说明这个指令是运算指令或访存指令,不管zero信号如何,PC都被更新为PC+4;

当nPC_sel = 1时,说明这是一条分支指令,当zero信号为0,表示条件判断不成立,PC被更新为PC+4;

当nPC_sel = 1时,且zero信号为1,说明条件判断成立,将分支的目标地址更新到PC寄存器中。

一个与门就可以实现上面这个真值表,如下图所示,

增加功能后的IFU

现在需要解决的问题就是,如何得到目标地址TargetAddress。

TargetAddress = PC + 4 + SignExt[imm16] * 4

imm16可以直接从指令编码的低16位获得,乘4可以通过左移2位实现,再增加一个加法器就可以实现目标地址的计算了,完整的IFU如下图所示,

完整的IFU

至此,我们在笔记12-14中已经完成了笔记10中的处理器设计的第4步,分析每条指令的实现,确定控制信号。

你可能感兴趣的:(14. 分支指令的控制信号)