N.B. I “data hazard” che coinvolgono la scrittura o lettura del registro generale
x0
non sono veri data hazard perchéx0
è read-only e immutabile, il suo valore è sempre 0.
Esempio:
add s0, t0, t1 IF ID EX MM [WB]
sub t2, s0, t3 IF [ID] EX MM WB
Questa pipeline è impossibile (per ora) perché a ID di sub
serve il dato scritto nei registri da WB di add
, quindi bisogna “traslare” le fasi di esecuzione di sub
di altri due cicli, non 3 perché WB viene sempre eseguita nella prima metà del ciclo di clock, mentre ID (e anche IF) viene sempre eseguita nella seconda metà del ciclo di clock, quindi sono sovrapponibili.
add s0, t0, t1 IF ID EX MM [WB]
sub t2, s0, t3 -> -> IF [ID] EX MM WB
Come si fa a “traslare” le fasi dell’esecuzione di un’istruzione? aggiungendo fasi di stallo.
add s0, t0, t1 IF ID EX MM [WB]
[stallo] - - - - -
[stallo] - - - - -
sub t2, s0, t3 IF [ID] EX MM WB
Questa è una possibile soluzione per risolvere il data hazard, ma una migliore usa il forwarding. Eventualmente si può anche usare il riordinamento delle istruzioni.