documento utilizzato http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html
lo riscrivo EX e MEM condizione di pericolo (lasciando cadere = 0 parte per semplicità!), Prima che prenderemo in considerazione "doppio pericolo dati" (regole originali):
EX Hazard
if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs) # =EX_h_Rs
) ForwardA = 10
if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt) # =EX_h_Rt
) ForwardB = 10
chiamerò condizioni EX_h_Rs e EX_h_Rt di tenere le formule più brevi
MEM Hazard (stato originale)
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRs)) ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRt)) ForwardB = 01
====
E il nostro esempio con due tipi di pericolo in una sola volta, tra il (1 ° e 3 °) & (2 ° e 3 °) allo stesso tempo:
add $1, $1, $2
add $1, $1, $3
add $1, $1, $4
o (ciclo promlem è contrassegnato con **
sopra e sotto)
**
add C+A -> A ... A
v ?
add B+A -> A
v
add C+ A -> A
**
Secondo il mio link, dopo aver tenuto conto doppio pericolo EX + MEM: (! Senza = 0 e riordinato termini booleani), regole aggiornate di MEM Hazard:
Diamo rivedere le condizioni di inoltro per pericolo di MEM per prendersi cura di dati 'doppio' Pericoli
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and
not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs))
)
ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and
not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt))
)
ForwardB = 01
o lo stesso utilizzando breve record di EX_h_ *
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and
not (EX_h_Rs)
)
ForwardA = 01
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and
not (EX_h_Rt)
)
ForwardB = 01
che significa:
tenta di inoltrare da MEM/WB diEX; se non ci sono in avanti nello stesso operando di input dai registri della conduttura EX/MEM.
o lo stesso
Non provare nemmeno a trasmettere da MEM/WB per EX; se c'è già l'inoltro di risultati più recenti da EX/MEM.
Cercherò di illustrare:
add C+A -> A A'
v? (forwarding to 3rd instruction)
A -> A''
v?
add C+A -> A
così, per la terza istruzione regole originali diranno che entrambi A'
dalla prima istruzione e A''
dalla seconda istruzione dovrebbero essere trasferite (ma mux non possono essere alimentati da due fonti in un singolo momento). E la modifica della condizione di rischio MEM dice che A'
non deve essere tentato di inoltrare se c'è l'inoltro attivo di A''
che è più recente.
Quindi; il disegno è a destra,ci saranno 2 inoltro di pericolo EX; Tuttavia, l'inoltro di rischio MEM non dovrebbe essere provato se esiste già un inoltro di emergenza EX attivo.
PS, il mio ultimo anello, http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html dice qualcosa circa errori di battitura nel libro: "* Si noti che la condizione di inoltro per il rischio di MEM nel libro di testo a pagina 369 è ERRATA! * "e penso che possa riguardare la tua immagine. – osgx
Questo è chiaramente un errore nel libro (le parentesi sono sbilanciate, per uno). Curiosamente l'ultima edizione del libro (4a edizione rivista) aggiunge una chiusura mancante ' – Ilya