[英]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
可以轉發。
因此,在研究了幾個小時之后,解決方案如下:需要兩個關鍵事實:
IF DEC EXE MEM WB
1
2 1
3 2 1
4 3 2 1
4 3 2 1
IF DEC EXE MEM WB
4 NOP 3 2
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.