引言
為什么不采用單周期實(shí)現(xiàn),硬件比較簡單?
主要是因?yàn)樾侍退傅牵幚砥髦凶铋L的路徑(一般是ld指令)決定了時鐘周期
流水線概述
流水線是一種能使多條指令重疊執(zhí)行的技術(shù)。
流水線更快的原因是所有的工作都在并行執(zhí)行,所以單位時間能夠完成更多的工作狗热,流水線提高了吞吐率。
file
RISC-V是五級流水線 約等于五倍加速比
- 從存儲器中取出指令I(lǐng)F
- 讀寄存器并譯碼指令I(lǐng)D
- 執(zhí)行操作或計(jì)算地址EX
- 訪問數(shù)據(jù)存儲器的操作數(shù)MEM
- 將結(jié)果寫入寄存器WB
流水線冒險
當(dāng)講到流水線型的處理器的時候虑省,冒險是絕對不能忽視的匿刮。
結(jié)構(gòu)冒險
即硬件不支持多條指令在同一時鐘周期執(zhí)行。但是RIscv是面向流水線設(shè)計(jì)的探颈,一些結(jié)構(gòu)冒險早已經(jīng)考慮到了熟丸。比如IM與DM的硬件分離。
數(shù)據(jù)冒險
由于一個步驟必須等待另一個步驟完成而導(dǎo)致的流水線停頓加Data Hazard
一種基本的解決方案是前遞法伪节,后面再詳細(xì)介紹光羞,這里提一下。
例子:
add x19, x0, x1
sub x2, x19 ,x3
sub指令x19使用的是add指令的rd也就是19號寄存器架馋,這里會產(chǎn)生冒險狞山。
前遞解決圖示:
但是請注意,前遞不能解決所有的數(shù)據(jù)冒險叉寂,比如有ld use型指令萍启。ld指令的rd被下一條指令進(jìn)行使用,這個時候必須要停頓一個周期才能用前遞解決。
控制冒險
出現(xiàn)在需要根據(jù)一條指令的結(jié)果后做決定勘纯,而其他指令在執(zhí)行局服。
控制冒險的解決,可以采用停頓法或者預(yù)測法驳遵。停頓法這種保守的方法固然有效淫奔,但是太慢了。但是預(yù)測也有時候會出錯堤结,總之這個是個有優(yōu)化空間的方案唆迁。
預(yù)測其實(shí)有種動態(tài)預(yù)測的方法來處理分支。就是比如:上一次預(yù)測失敗了竞穷,這次改變預(yù)測的策略唐责。
流水線的通路與控制
概覽圖
流水線:
WB階段問題
考慮:
ld x10 0(x11) A
add x1 x2 x3 B
add x4 x5 x6 C
add x7 x8 x9 D
ld運(yùn)行到WB階段,將DM中的值寫回寄存器但是由于D號指令此時正讀瘾带,表示X7為writeReg,那么值就會寫錯鼠哥!解決這個問題要添加額外的數(shù)據(jù)通路
如圖:
時鐘周期切片
如圖
控制的添加
既然添加了額外的器件,為了實(shí)現(xiàn)流水線看政,還要添加控制
完整的數(shù)據(jù)通路
看圖看圖朴恳!
關(guān)于冒險進(jìn)一步說明
關(guān)于數(shù)據(jù)冒險
數(shù)據(jù)冒險實(shí)際上有兩對條件。
EX/MEM.RegisterRd = ID/EX.RegisterRs1
EX/MEM.RegisterRd = ID/EX.RegisterRs2
MEM/WB.RegisterRd = ID/EX.RegisterRs1
MEM/WB.RegisterRd = ID/EX.RegisterRs2
下一條要用到上一條的結(jié)果允蚣。
前遞法解決
檢測冒險的條件以及解決相應(yīng)冒險的控制信號
EX冒險
ME冒險
更復(fù)雜的
數(shù)據(jù)冒險與停頓
載入使用型指令必要阻塞(停頓)stall
完整圖示
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布于颖!