我想知道為什么在流水線 RiscV 上執行此匯編代碼時 - 不會自動停止 - 轉發(內部暫存器檔案 WB->DEC 轉發除外)我們需要在第三個命令之后立即放置兩個 NOP 命令,不會一個 NOP 就夠了嗎?
addi t0, x0, 0
addi t1, x0, 5
addi s1, x0, 0x200 //why are two NOPS required after this command?
beq t1, t0, finish
這是我的想法 - 在 nop 之后,第一個命令完成編譯,我們可以將 t1 從第二個命令的 WB 轉發到 beq 的 EXE。我哪里錯了?
uj5u.com熱心網友回復:
正如 Erik 所說,不應該需要NOP指令。CPU 實作應處理依賴關系并在需要時停止管道。如果由于某種原因,實作沒有這樣做(我將其稱為 BUG),則有一些解決方法可以在稍后階段修復它,編譯器在檢測依賴項時注入 nops 等。
如果 CPU 支持轉發,就像您在傳統的 5 級流水線 CPU 上所說的那樣,則不需要NOP. 當BEQ指令到達 CPU 解碼階段時,t0已經寫入暫存器檔案,同時t1可以轉發。
uj5u.com熱心網友回復:
因此,在為此作業了幾個小時之后,解決方案如下:需要兩個關鍵事實:
- Beq 只能從 WB 轉發,因為它的分支條件是由分支計算器計算的,并且轉發只存在于 ALU。
- 根據問題說明,我們不能從 WB->DEC 轉發,所以基本上我們不能轉發到 Beq。讓我們撰寫階段并“運行程式”:
IF DEC EXE MEM WB
1
2 1
3 2 1
4 3 2 1
4 3 2 1
- 注意我們不能執行 4 (beq t1, t0, finish) 因為它依賴于來自指令 2 的 t1 的值。我們必須等待 t1 的值。MEM->DEC 轉發不存在。我們只能在 DEC 階段獲取一個新的 t1,因為所有到 EXE 的轉發都鏈接到 ALU,并且我們在計算器處計算了我們無法影響的分支條件,因此我們必須等待并放置一個 NOP。讓我們繼續。
IF DEC EXE MEM WB
4 NOP 3 2
- 注意我們仍然不能做任何事情 - 我們正在等待 t1 但我們沒有 WB->DEC 轉發(如問題中所述),所以我們必須等待 2 在 DEC 完成它的 WB 階段,所以我們可以采用 t1 的更新值,因此我們必須放置另一個 NOP。讓我們繼續。
IF DEC EXE MEM WB
4 NOP NOP 3 - notice 2 has finished, we can now continue with the correct t1.
4 NOP NOP
4 NOP
4
DONE.
是的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365368.html
上一篇:在螢屏上列印一句話
