6.9 流水線冒險
冒隙訓干擾流水線并阻止下一條指令在目標時鐘周期內的執行,冒隙訓降低流水線在理想情況下所能帶來的速度提升,
冒險分類:
1、結構冒險:資源沖突導致硬體無法支持所有可能的指令組合同時執行,
2、資料冒險:指令執行需要之前指令計算結果,而這個結果還在流水線中沒計算出來,
3、控制冒險:分支的流水線的其他指令改變程式計數器的值,
通用方法:停止流水線直至風險消除,在流水線中插入多個“氣泡”,
6.9.1 結構冒險

如圖,MEM在一個周期內被兩個指令使用,產生沖突,

解決方法:如圖,停一個周期,待對MEM的沖突解除后再恢復流水線,
另一種方法:IF和MEM階段使用不同的存盤器來避免同時訪問同一塊存盤器,缺點:消耗更多資源,
6.9.2 資料冒險
對于下面指令:


如圖,ADD之后的指令無法得到正確的執行結果,因為后續指令的ID階段都需要ADD指令的結果,

解決方法:資料/暫存器轉移,大概意思就是把第一個指令的ALU寄存后直接輸出到下一級ALU的輸入,對于兩個、三個周期后的指令,則需要把MEM輸出、REG輸出直接連接到后續流水線,

對于下面指令:


如圖6.20,路徑1永遠無法實作,因為XOR指令需要在ALU輸入端使用R1暫存器的值,該值在LW指令執行后才能更新,
簡單的方法:使用縱向旗袍,將ALU周期延一個時鐘,

除了使用硬體技術,也可以使用基于編譯器調度的軟體方式來解決資料冒險的問題,這時,編譯器跟蹤每個暫存器中的資料,并重新安排指令次序阻止資料冒險的產生,
6.9.3 控制冒險
如下指令:


T2在執行第二條指令時就需要PC值,但是該值要在第二條指令的MEM操作后才可能,
解決方法:分支陳述句中用新的PC值重新獲取下一條指令,這種情況下,需要將流水線停止幾個周期,直到重新獲取下一條指令,如圖:

6.9.4 其他風險
指令獲取或在資料讀寫時會訪問存盤器,指令獲取時,資料應該由PC暫存器保持穩定,該值應該一直保持到把獲取的指令寫入IF/ID流水線暫存器的IR域為止,因此,對IF/ID暫存器的IR操作必須在PC寫操作之前,
資料讀寫時,有效地址在EX階段由ALU計算得到,在將存盤器中的資料存入LMD暫存器或存盤器寫信號被激活使資料寫入存盤器之前,該地址不能變化,
6.10 ADC流水線——一個例子

該ADC有四級流水線,每級流水線提供三位數字量,所以一共是12位ADC,每級流水線采樣并得到差值傳遞到下一級,提高了ADC的處理能力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/540195.html
標籤:其他
上一篇:第十一次打靶
