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.

Diagramma di dipendenza Read After Write

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.