【Verilog语法】分支延迟槽

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

关于跳转指令

在这里插入图片描述

Branch delay slot 分支延迟槽

第一次看见分支延迟槽是在这里
在这里插入图片描述
查了一下解释:
在这里插入图片描述
在这里插入图片描述
以下内容摘自: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条指令,也就是说紧跟着分支跳转指令的那条指令。这条指令通常叫做“分支延迟槽”里面的指令。

所以要注意几件事情:

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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值