【Verilog语法】分支延迟槽

参考:MIPS中的跳转/分支指令

关于跳转指令

【Verilog语法】分支延迟槽_第1张图片

Branch delay slot 分支延迟槽

第一次看见分支延迟槽是在这里
【Verilog语法】分支延迟槽_第2张图片
查了一下解释:
【Verilog语法】分支延迟槽_第3张图片
【Verilog语法】分支延迟槽_第4张图片
以下内容摘自:MIPS中的分支延迟槽和存储延时槽

在最初的MIPS五级流水线中,一条指令被分成了5个阶段:取指,从源寄存器读取内容,逻辑运算,内存读取,写回到寄存器。

当第一条指令的ALU结束时,第二条指令的RD阶段也已经结束了。

那么如果第一条指令是分支跳转指令,那么在ALU阶段才会知道要不要跳转,以及跳转的目标指令地址是多少。而此时,第二条指令已经刚好结束RD,第三条指令 已经到了IF阶段。如果这个时候CPU直接跳转到目标指令地址去执行,那么就需要清空现有流水线,从新的指令地址开始IF,RD。因为分支跳转后面的指令 不能被执行啊,程序已经跳转了呀。这样就相当于原先第2条指令的IF和RD操作,第3条指令的IF操作,这些CPU已经做过的工作,都白做了。因为CPU 此时是从的新的地址重新开始嘛!这叫流水线“冒泡”。

做这些工作也是需要耗费CPU时间的呀,MIPS设计者们,觉得十分浪费。于是就发明了一个叫分支延迟槽的东西。

这样,如果第一条指令是分支跳转指令,那么不用经历整个ALU阶段才能得到要不要跳转的结果,以及跳转到哪里去。现在只 需要半个ALU的时间就得到了结果和目标地址。这时,第二条指令才刚刚开始RD阶段,而CPU就已经知道要跳到哪里去了,并且第3条指令就可以从新的地址 去取指令来执行。也就是说这个时候CPU的流水线是连贯的,不需要临时清空一下。不过这样做带来了一个新的问题,那就是在目标指令(也就是图中的第3条指令)执行的前面,第2条指令就执行完毕了。

也就是说在CPU知道要跳转的地址了(上图的第一条指令),到执行目标地址指令(上图的第3条指令)之间,会执行第2条指令,也就是说紧跟着分支跳转指令的那条指令。这条指令通常叫做“分支延迟槽”里面的指令。

所以要注意几件事情:

“分支延迟槽”里面的指令,在目标跳转指令前面执行,所以“分支延迟槽”里面的指令不能修改目标跳转指令会用到的寄存器或者变量的内容,否则程序很容易搞错。
“分支延迟槽”里面的指令,通常可以被加以利用会做一些比较意义的事情,例如清零内存之类的。

你可能感兴趣的:(MIPS汇编)