我想檢查我的作業和對管道的理解,不幸的是 MARS 不支持此功能,因此很難驗證我的假設。
我將說明放在電子表格中以幫助我了解正在發生的事情,并且我想確保這是正確的。我用藍色表示回圈中的每個階段,與書上不同,我沒有表示每個階段發生在回圈的哪一半(IE WB在前半部分,ID在后半部分)

根據 Patterson 和 Hennessey 的書,ID 階段發生在結尾,而 WB 位于開頭。

所以這應該意味著最后一個 SW 命令應該按預期作業,因為前一個(有效指令)的 WB 發生在該周期的開始 - 而 ID 在尾部。
uj5u.com熱心網友回復:
是的,這看起來是正確的。
后一條指令的 ID 階段可以與前一條指令的 WB 階段重疊,仍然可以得到正確的值。
這是因為,對于 WB 中的人來說,新資料在回圈的一開始就完全準備好進入暫存器——沒有什么要計算的;完整的答案在前一個周期結束時已被完全計算出來,因此回寫記錄的值不需要更改任何位。(與 ALU 操作相比,其中大量邏輯遵循前一個周期的輸入,然后才能計算輸出。)
在 ID 階段,在暫存器檔案中查找值,或者周期時間足夠長以允許值穩定以包括在同一周期中發生的新寫入的 WB 值,否則設計人員將放置一個暫存器檔案內的內部旁路/轉發。無論哪種方式,ID 階段都將獲得在同一周期寫入 (WB) 的暫存器的最新值,而不是之前的陳舊值。
他們的說法是,WB 發生在周期的前半部分,ID 發生在后半部分。然而,它實際上是在各種處理器內部實作的——這個想法是我們可以依靠讀取在同一周期中寫入的值。(我相信他們沒有說明他們是否建議使用時鐘的另一個轉換(例如下降沿)將周期物理地分成兩半,但這是另一種實作可能性。)
來自同一本教科書:
(在時鐘周期內讀取暫存器會回傳在前半個周期結束時寫入的值,此時發生此類寫入。)
圖 4.52 的標題,以及,
最后一個潛在的危險可以通過暫存器檔案硬體的設計來解決:當暫存器在同一個時鐘周期內被讀取和寫入時會發生什么?我們假設寫是在時鐘周期的前半部分,讀是在后半部分,所以讀傳遞了所寫的內容。與許多暫存器檔案實作的情況一樣,在這種情況下我們沒有資料危險。
來自圖 4.52 上方的正文。這些相同的文本出現在本書的 RISC V 版本中(盡管相對于圖號 4.50 而不是 4.52)。
我們還要注意,當引入轉發(也稱為繞過)以減輕危險(而不是程式員插入nops)時,需要從 EX->EX 以及 MEM->EX 進行轉發。第一個是針對 ALU 上的背靠背 RAW 危害,第二個針對負載使用 RAW 危害(背靠背)以及由 1 條指令分隔的 ALU 危害!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/468270.html
上一篇:關于NASM串列檔案中的括號
