【Verilog语法】分支延迟槽
參考:MIPS中的跳轉(zhuǎn)/分支指令
關(guān)于跳轉(zhuǎn)指令
Branch delay slot 分支延遲槽
第一次看見分支延遲槽是在這里
查了一下解釋:
以下內(nèi)容摘自:MIPS中的分支延遲槽和存儲(chǔ)延時(shí)槽
在最初的MIPS五級(jí)流水線中,一條指令被分成了5個(gè)階段:取指,從源寄存器讀取內(nèi)容,邏輯運(yùn)算,內(nèi)存讀取,寫回到寄存器。
當(dāng)?shù)谝粭l指令的ALU結(jié)束時(shí),第二條指令的RD階段也已經(jīng)結(jié)束了。
那么如果第一條指令是分支跳轉(zhuǎn)指令,那么在ALU階段才會(huì)知道要不要跳轉(zhuǎn),以及跳轉(zhuǎn)的目標(biāo)指令地址是多少。而此時(shí),第二條指令已經(jīng)剛好結(jié)束RD,第三條指令 已經(jīng)到了IF階段。如果這個(gè)時(shí)候CPU直接跳轉(zhuǎn)到目標(biāo)指令地址去執(zhí)行,那么就需要清空現(xiàn)有流水線,從新的指令地址開始IF,RD。因?yàn)榉种D(zhuǎn)后面的指令 不能被執(zhí)行啊,程序已經(jīng)跳轉(zhuǎn)了呀。這樣就相當(dāng)于原先第2條指令的IF和RD操作,第3條指令的IF操作,這些CPU已經(jīng)做過的工作,都白做了。因?yàn)镃PU 此時(shí)是從的新的地址重新開始嘛!這叫流水線“冒泡”。
做這些工作也是需要耗費(fèi)CPU時(shí)間的呀,MIPS設(shè)計(jì)者們,覺得十分浪費(fèi)。于是就發(fā)明了一個(gè)叫分支延遲槽的東西。
這樣,如果第一條指令是分支跳轉(zhuǎn)指令,那么不用經(jīng)歷整個(gè)ALU階段才能得到要不要跳轉(zhuǎn)的結(jié)果,以及跳轉(zhuǎn)到哪里去?,F(xiàn)在只 需要半個(gè)ALU的時(shí)間就得到了結(jié)果和目標(biāo)地址。這時(shí),第二條指令才剛剛開始RD階段,而CPU就已經(jīng)知道要跳到哪里去了,并且第3條指令就可以從新的地址 去取指令來執(zhí)行。也就是說這個(gè)時(shí)候CPU的流水線是連貫的,不需要臨時(shí)清空一下。不過這樣做帶來了一個(gè)新的問題,那就是在目標(biāo)指令(也就是圖中的第3條指令)執(zhí)行的前面,第2條指令就執(zhí)行完畢了。
也就是說在CPU知道要跳轉(zhuǎn)的地址了(上圖的第一條指令),到執(zhí)行目標(biāo)地址指令(上圖的第3條指令)之間,會(huì)執(zhí)行第2條指令,也就是說緊跟著分支跳轉(zhuǎn)指令的那條指令。這條指令通常叫做“分支延遲槽”里面的指令。
所以要注意幾件事情:
“分支延遲槽”里面的指令,在目標(biāo)跳轉(zhuǎn)指令前面執(zhí)行,所以“分支延遲槽”里面的指令不能修改目標(biāo)跳轉(zhuǎn)指令會(huì)用到的寄存器或者變量的內(nèi)容,否則程序很容易搞錯(cuò)。
“分支延遲槽”里面的指令,通??梢员患右岳脮?huì)做一些比較意義的事情,例如清零內(nèi)存之類的。
總結(jié)
以上是生活随笔為你收集整理的【Verilog语法】分支延迟槽的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Verilog语法】读文件
- 下一篇: vb for循环 combobox的使用