[理工] 計組 branch stall的位置

作者: sate1128 (小夯夯)   2016-12-26 11:00:23
我最近在做題目的時候有個疑問
Branch在ID判斷時
要和前面的R-type空一格 lw空兩格
但是詳細來看的話空的那個stall應該放在哪?
我舉一個例子:
add後接bne 接下來bne predict 錯誤
我的想法是branch的stall接在它的IF之後
http://i.imgur.com/Lsm84Xw.jpg
如此一來bne的ID有在add的EX後 拿到正確的值
之後的add(correct)的IF也接在bne的ID後 也很合理
但是有些題目好像把stall放在branch的ID後
http://i.imgur.com/IV611EN.jpg
這樣add的EX的結果沒辦法給bne做判斷啊?
難道bne在stall還可以拿add的結果做運算?
但是這樣就沒有stall吧(暫停)
後面的add(correct)這樣接也蠻詭異
請問各位哪種才是對的?
如果是下面那種該怎麼解釋?
作者: ken52011219 (呱)   2016-12-27 21:20:00
訊號傳遞 來達到 stall 的功能
作者: Transfat (Transfat)   2016-12-27 21:20:00
我大概了解你們的說法了。因為預測錯誤,所以要在branch的ID階段執行flush和把control signal設為0,所以下一個指令add(PC+4)的IF需要在第九個cycle才可以執行。
作者: ken52011219 (呱)   2016-12-27 21:19:00
flush 與 stall 的差別最主要是一個直接洗掉某個指令 而 Stall只是藉由延遲instruction 和避免
作者: yupog2003 (屁股)   2016-12-27 21:08:00
那麼stall cycle似乎就只要列出data hazard就好?但是在算總cycle數的時候還是要把預測錯誤浪費的cycle算進去?flush跟stall我也常常搞混,他們共同點就是會浪費cycle但是發生data hazard的時候是要"暫停"pipeline,所以是stall,而branch prediction錯誤是要"洗掉"之前的指令所以是flush,這樣直接硬分不知道有沒有錯誤?
作者: ken52011219 (呱)   2016-12-27 21:07:00
沒錯,當預測成功時就會繼續執行跳至的address 不用flush
作者: yupog2003 (屁股)   2016-12-27 21:04:00
要在bne的ID之後才會知道,如果預測錯誤的話就要像K大這樣把真正的branch target的IF放在bne的ID之後如果預測正確的話是不是可以直接畫在bne的IF之後就好?也就是當作什麼問題都沒有直接執行下去
作者: ken52011219 (呱)   2016-12-27 21:03:00
上面有點小錯,是在8 cycle時就將signal 設為0
作者: yupog2003 (屁股)   2016-12-27 21:03:00
我也來確認一下自己的觀念,因為真正的branch target
作者: ken52011219 (呱)   2016-12-27 20:50:00
http://i.imgur.com/Iezmxcz.jpg因為習慣性直接省略一些instruction來節省空間 但實際上當第8 cycle 的時候,ID判定需要flush並將PC改成原address+4 ,第九cycle時 ID將control signal 設0 ,而IF 則會執行 原address+4 並不會與ID的flush衝突到Trans大 的問題是沒有把flush算進總 cycle中且這題flush並非為stall 故不用寫入 stall cycle中(依稀記得去年九月張凡說的)
作者: Transfat (Transfat)   2016-12-27 19:56:00
ken大你的那張圖,為什麼第五個add的IF不是從第八個cycle開始呢?為什麼從第九個cycle才IF啊還有最後一個add也是為什麼從cycle14不是cycle13呀而且你說的p.534那題呀,如果stall cycle是c4,c7,c8,c13那麼total number of cycles不是等於5-1+8+1+2+1=16 嗎為什麼後面又多加了兩個1變成18啊阿我再回一篇好了
作者: PTTleader (PTT領導)   2016-12-26 13:02:00
有下面那種的題目嗎
作者: newpuma (還很新)   2016-12-26 13:10:00
第一種stall是為了解決1,2指令相依,有第二種的題目嗎?
作者: ken52011219 (呱)   2016-12-26 13:17:00
你這麼想吧 detect unit 是在ID偵測的 ,當偵測到 if判斷式為true 時 會執行stall那它所謂的stall 在實際面向該怎麼執行停止 control signal 往下一個stage 傳遞 停止 PC +4傳達到 Instruction memoryID 就會在下一個cycle時,持續執行ID 的指令 這樣就很明顯了第二個ID才是實際上的stall 所以你第二個才是對的但 stall功能自己要知道 為了方便檢查 寫2次ID 會比較好
作者: aa06697 (todo se andarà)   2016-12-26 14:01:00
第一個例子舉的怪怪的感覺@@ 猜錯是flush不是stall 另外不管是flush還是stall都是透過pipeline register操作 不是你要stall就「馬上」stall 是下個cycle才算是stall
作者: newpuma (還很新)   2016-12-26 14:24:00
我以為原po是在問branch指令跟前一個指令的相依解決stall+forwarding耶 哈
作者: k2shouai (coding....)   2016-12-26 19:51:00
要改13沒錯,舊文有這題
作者: ken52011219 (呱)   2016-12-26 20:00:00

Links booklink

Contact Us: admin [ a t ] ucptt.com