.mips 檔案)
// 偵測 EX 階段需求暫存器是否為前序指令寫入目標
if (ID_EX.rs == EX_MEM.rd && EX_MEM.RegWrite) ForwardA = 10; // 從 EX/MEM 前推
if (ID_EX.rs == MEM_WB.rd && MEM_WB.RegWrite) ForwardA = 01; // 從 MEM/WB 前推
// 同理處理 rt (ForwardB)
// LW 後緊接使用其結果的指令,即使有前推也需暫停一週期
if (ID_EX.MemRead && (ID_EX.rt == IF_ID.rs || ID_EX.rt == IF_ID.rt)) {
StallPipeline(); // 插入氣泡
}
| 策略 | 行為 | 週期成本 |
|---|---|---|
| 流水線清空 / 預測成功 | 分支解析前暫停,解析後正確路徑繼續 | 分支延遲槽數 |
| 預測不轉移 | 假設不跳轉繼續取指,跳轉時清空重取 | 跳轉時罰則 |
| 延遲轉移 | 分支指令後固定執行 N 條指令 (延遲槽) | 編譯器填充有用指令 |
# 測試資料危障與前推
ADD $1, $2, $3
SUB $4, $1, $5 # RAW: $1
LW $6, 0($7)
ADD $8, $6, $9 # Load-Use Hazard
# 測試分支預測
BEQZ $1, Label
ADDI $2, $2, 1
Label:
ADD $3, $4, $5
MIPS_Simulator/
├── bin/ # 執行檔
├── src/
│ ├── Instruction.h/.cpp # 指令基類與衍生類
│ ├── Pipeline.h/.cpp # 流水線核心邏輯
│ ├── HazardUnit.h/.cpp # 危障偵測與前推
│ ├── BranchPredictor.h/.cpp # 四種策略
│ ├── Parser.h/.cpp # 組語解析
│ ├── Statistics.h/.cpp # 統計收集
│ ├── MainDlg.h/.cpp # MFC 主對話框
│ └── Visualizer.h/.cpp # 流水線圖繪製
└── docs/ # 設計文件
完整原始碼與設計文件:https://www.vckbase.com/code/downcode/?id=2466
此模擬器完整實現 MIPS 五級整數流水線核心機制,支援多種前推與分支策略對比教學,視覺化介面直觀展示流水線動態行為,適合計算機組織架構課程教學與自學使用。