Hazards
Un'hazard è una situazione in cui un'istruzione dipende da quella prima, per esempio:
add $s0, $t0, $t1
sub $s1, $s0, $s2 ; Necessita del WB precedente per poter leggere su ID il register file
Per rimediare, la pipeline entrerà in stallo, continuando a rieseguire ID (bloccando un'ipotetica terza istruzione su IF perchè ID è in uso) finché l'istruzione precedente non finisce.
L'ultimo ID avrà lo scopo di aggiornare i registri ID/EX con il valore scritto dalla precedente WB. Questo può avvenire nello stesso ciclo di WB nel caso il register file supporti lettura e scrittura in un unico ciclo.
Questo hazard è un data hazard detto dipendenza RAW (Read After Write), ma esistono altre dipendenze come Write After Write e Write After Read (creano problemi solo quando si cambia l'ordine delle istruzioni).
Soluzione software
Un'alternativa software è sfruttare il compilatore per inserire dei nop
tra le istruzioni dipendenti:
add $s0, $t0, $t1 ; IF
nop ; ID
nop ; EXE
nop ; MEM
sub $s1, $s0, $s2 ; WB durante l'IF di sub, quindi esegue ID dopo WB
Oltre ad alleggerire lo sforzo della CPU nell'identificazione dello stallo (che effettua confrontando registri correnti e precedenti nel passo ID), ammette anche ulteriore ottimizzazione, rimpiazzando i nop
con alcune istruzioni successive, così da risparmiare tempo.