企業(yè)oa系統(tǒng)免費優(yōu)化網站建設seo
萌新的RiscV學習之在寫代碼之前對于關鍵路徑的分析-11
首先我們最簡單的control 模塊
全分段 因為只有分段 , 分開使用之后 , 各個階段的具體功能才會合理使用 就像是為了后續(xù) “氣泡” 賦值 為 0 還有單獨比較前遞這種
EX : ALUOP ALUSrc |||| 選擇ALU執(zhí)行何種模式
M : branch Memread Memwrite ||| 分支 加載 存儲
WB : Memtoreg RegWrite ||| 選擇ALU結果還是存儲器值 寫入所選值
第二我們開始研究前遞的具體使用
首先對于 前遞模塊 我們有6輸入2輸出 輸出是ForwardA ForwardB
前遞模塊是專門為了ALU設計的 用來確定ALU的兩個輸入端的取值是三者的哪一個
Forwarding 6個輸入 有 Rs1 Rs2 EX/MEM. RegisterRd MEM/WB.RegisterRd
還有Regwrite
對于第一個regwrite=1 其實很好理解 我們匹配一下是否是相等的 Rs== EX/MEM. RegisterRd
選擇來自ALU計算完成的結果
對于第二個Regwrite
一般來說用的比較少
(我自己腦補了一下 沒腦補出來) 但是說是這么說 MEM/WB.RegisterRd = = Rs
選擇最后來自MEM/WB 寄存器的值
第三個是加載冒險
Hazard Defection Unit 模塊
四個輸入三個輸出
三個輸出很好理解 因為加載冒險要產生一個“氣泡”停頓 把 control 置為 0 (只要將Re Writ MemWrit 信號設置為 即可)
讓PC 和 IF/ID 保持
四個輸入 檢測 rs1 rs2與 rd是否相同 與 memread 是否是ld指令
第四個是跳轉冒險
沒有特定的控制大單元 在 ID階段依靠各個小單元控制
此圖多出一點的單元