MIPS pipeline中load use hazard与分支ID阶段比较的技术疑问
Great question—this is a super common point of confusion when learning about MIPS pipeline hazards, especially with early branch evaluation. Let’s break this down step by step using your instruction sequence:
I1: lw $s1, 0($s3) # Loads data into $s1; finishes memory access in MEM stage, writes to register file in WB I2: add $s4, $s5, $zero # Totally independent, no impact on our hazard question I3: beq $s1, $s5, 8 # Compares $s1 and $s5 in the ID stage (early branch detection)
Is this a load-use hazard?
Strictly speaking, the classic "load-use hazard" refers to when an instruction right after a lw tries to use the loaded register in its EX stage (for ALU operations). But your scenario is a related hazard: the branch needs the loaded register in the ID stage for comparison. This counts as a hazard because the value of $s1 isn’t available when the branch needs it. Let’s map the pipeline timing to see why:
| Cycle | I1’s Stage | I2’s Stage | I3’s Stage |
|---|---|---|---|
| 1 | IF | — | — |
| 2 | ID | IF | — |
| 3 | EX | ID | IF |
| 4 | MEM | EX | ID |
At cycle 4, I3 is in the ID stage, ready to compare $s1 and $s5. But I1 is only in the MEM stage right now—it won’t write the new $s1 value to the register file until cycle 5 (the WB stage). The register file still holds the old value of $s1, so using that would lead to an incorrect branch decision.
Will this cause a pipeline stall?
In the standard basic 5-stage MIPS pipeline (the one taught in most introductory textbooks like Patterson & Hennessy), yes—this requires a 1-cycle stall. Here’s the key reason:
The basic pipeline only includes these forwarding paths:
- EX → EX: For ALU instructions that depend on the previous ALU instruction’s result
- WB → EX: For when an instruction’s ALU stage needs a value that’s being written back in the same cycle
- WB → ID: For register reads in ID that depend on a value just written to the register file
There’s no built-in forwarding path from the MEM stage to the ID stage in the basic design. That means the branch in ID can’t directly grab the newly loaded $s1 value from I1’s MEM stage.
To fix this, the pipeline controller inserts a bubble (stall) in cycle 4 for I3, pushing its ID stage to cycle 5. By then, I1 will have finished its WB stage, and the correct $s1 value will be available in the register file for the branch comparison.
What about your guess of no stall?
Your hunch would be correct in a more advanced MIPS implementation that adds a MEM→ID forwarding path. Some real-world MIPS processors do this to eliminate stalls in exactly this scenario, but it’s not part of the standard basic pipeline that’s covered in most introductory materials.
内容的提问来源于stack exchange,提问作者J.Hsieh

