簡體   English   中英

Risc-V 組裝 - 使代碼可操作所需的氣泡數量 - [假設]

[英]Risc-V Assembly - amount of bubbles needed to make the code operational - [Hypothetical]

我想知道為什么在流水線 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。 我哪里錯了?

正如 Erik 所說,不需要NOP指令。 CPU 實現應該處理依賴關系並在需要時停止流水線。 如果由於某種原因,實現沒有這樣做(我將其稱為 BUG),則有一些解決方法可以在稍后階段修復它,編譯器在檢測依賴項時注入 nop 等。

如果 CPU 支持轉發,如您在傳統的 5 級流水線 CPU 上所說,則不需要NOP BEQ指令到達 CPU 解碼階段時, t0已經寫入寄存器文件,而t1可以轉發。

因此,在研究了幾個小時之后,解決方案如下:需要兩個關鍵事實:

  • 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,並且我們在 Comperator 計算我們無法影響的分支條件,因此我們必須等待並放置一個 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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM