看板 Grad-ProbAsk 關於我們 聯絡資訊
最近讀到pipeline有些疑問 希望板上的大大能幫小弟解答 1.) load-use data hazard 在白算盤上看到的forwarding hardware 可分成以下四種情況 1a. EX/MEM.RegisterRd = ID/EX.RegisterRs 1b. EX/MEM.RegisterRd = ID/EX.RegisterRt 2a. MEM/WB.RegisterRd = ID/EX.RegisterRs 2b. MEM/WB.RegisterRd = ID/EX.RegisterRt 想請問load-use的情況使用stall+forwarding來解決的話 其中forwarding 可否歸類於上述四種 還是白算盤上的forwarding hardware並沒有寫出這種情形的實作 2.)題目如下 http://i.imgur.com/uERHSsL.jpg
小弟有參考到前面討論的文章 請參考這篇#1KCePaVb (Grad-ProbAsk) 也更正了a,b小題的答案 但做到這題的「分支是否發生在ID階段決定」和解答以及先前參考文章算得不同,看了許 久仍不確定哪裡錯 以下是我做出來的答案 http://i.imgur.com/iEKKZdN.jpg
有想過是不是在ID階段決定的前提是拿到正確的$s1 但如果等到C6的EX再從C5前饋過來亦可正常執行beq指令? 麻煩板上大大幫忙解惑 感激不盡 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.130.102 ※ 文章網址: https://www.ptt.cc/bbs/Grad-ProbAsk/M.1478665573.A.E8C.html
ken52011219: 試想 Forwarding 的用處是將ID傳進EX錯誤的值提前先 11/09 13:51
ken52011219: 把上一個指令OR上上個指令的正確值 直接傳回「EX」的 11/09 13:52
ken52011219: input端 那把BEQ運算提前改為由ID Stage就先行運算 11/09 13:54
ken52011219: 是否 Forwarding在「ID」內就失去功用了 11/09 13:55
ken52011219: 我認為 BEQ 必須乖乖等到 LW到WB才可以開始運算 @@ 11/09 13:56
ken52011219: 許久未碰Pipeline 有誤請更正 謝謝 11/09 13:57
gary19941208: Beq 要等到C6才能用forwarding 從lw的MEM拿到正確 11/09 14:00
gary19941208: 的s1,所以C6時beq還在ID,C7時add才會IF 11/09 14:00
Gabino: 大概了解兩位想表達的意思 若beq在X階段決定是否分支 前 11/09 14:17
Gabino: 提是在X階段 須拿到正確的資料 11/09 14:17
Gabino: 在書上都找不太到相關說明 不知道是不是太顯而易見..... 11/09 14:18
gary19941208: 應該吧...在哪個階段決定只是硬體不一樣,但是程式 11/09 14:38
gary19941208: 要正確執行input當然要是正確的資料 11/09 14:38
ken52011219: 再難的題目把原理攤開來看基本上都可以解決 11/09 14:39
ken52011219: 剩下的就是解題速度了 11/09 14:41
Gabino: 感謝兩位大大的指點 第一個問題 不知道有沒有什麼看法 還 11/09 14:56
Gabino: 是覺得我語焉不詳... 11/09 14:56
ken52011219: 第一個問題 是可以呀 並沒有衝突 11/09 15:29
gary19941208: 2.a或2.b吧 11/09 15:31
gary19941208: 不過 如果是lw連beq然後又是在ID決定的話就不是上述 11/09 15:35
gary19941208: 四種了 11/09 15:35
Gabino: 以lw連beq來說的話 forwarding 11/09 15:43
Gabino: 是該看 MEM/WB.RegisterRt ? 11/09 15:44
Gabino: 應該說從lw前饋回去都要看Rt不是嘛? 11/09 15:57
Gabino: 可是上述四種都是只有從Rd看 11/09 15:58
gary19941208: 噢對,lw要看rt,所以不行 11/09 16:10
ken52011219: Forwarding看Rd 呀@@ 跟hazard Detect Unit搞混了吧 11/09 16:48
ken52011219: If (ID/EX.MemRead and ((ID/EX.Register.Rt = IF/ID 11/09 16:49
ken52011219: .RegisterRs)or(ID/EX.RegisterRt =IF/ID.RigisterRt 11/09 16:50
ken52011219: ))) then stall Pipeline 11/09 16:51
ken52011219: 在ID中偵測是否為load-use 後 EXE 偵測是否需要For- 11/09 16:53
ken52011219: warding 這兩段偵測是不同的 沒有衝突 11/09 16:53
ken52011219: 若在ID偵測到是Load-use 就先Stall一次 11/09 16:56
Gabino: 可是lw不是沒有Rd嘛? 11/09 17:06
ken52011219: 我大概知道哪邊誤解了 所以Rd帶入0 不合forwarding 11/09 17:17
ken52011219: 但對於整個系統不會有衝突 我的意思是這個 11/09 17:18
Gabino: 那lw要怎在MEM/WB 前饋給 ID/EX ? 11/09 17:25
ken52011219: Load use 時 會先stall 也因此不用再帶入forwarding 11/09 17:25
ken52011219: 抱歉講錯 Rd不會為0 而是由IF/EXE RegisterRs Regis- 11/09 17:45
ken52011219: 更正 是由 ID/EXE RegisterRt,RegisterRd mux控制 11/09 17:46
ken52011219: 根據Mux來決定 哪一個為EXE/MEM RegisterRd 及 11/09 17:47
ken52011219: MEM/WB RegisterRd 隨意找一張擁有pipeline的圖便知 11/09 17:48
ken52011219: http://i.imgur.com/qPNu07m.jpg 也不能隨便找啦@@ 11/09 17:52
ken52011219: 啊啊啊 IF/ID 11/09 18:02
Gabino: 感謝大大 懂了~ 看到那個mux了QAQ 11/09 18:09
Gabino: 怎麼計組每張圖都東簡化一點西簡化一點... 找到快起笑 11/09 18:10
ken52011219: 不會 pipeline我也都忘記了QQ.. 11/09 18:31
gary19941208: 感謝大大,都忘了那個mux,雖然實際上是rt不過名字 11/09 20:37
gary19941208: 都是rd 11/09 20:37