2011-11-17 11 views
6

Nel Patterson & Hennessy libro:MIPS Pipeline Forwarding (pericolo di dati doppio)

Ma non può questo essere trattato come un pericolo EX:

Perché l'inoltro viene eseguito nella fase MEM? E come? Con 1 stallo (per il 2 ° add, avrò bisogno di un risultato da EX nella prossima EX)?

+0

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

+1

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

risposta

6

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.

2

Questo è chiaramente un errore nella 4a edizione del libro (le parentesi sono sbilanciate, per una). Curiosamente più recente edizione del libro (4 ° edizione riveduta) aggiunge una chiusura mancante ')', ma ... finisce con una condizione non corretta ancora:

enter image description here

penso che questo sarebbe la versione corretta di le condizioni:

if (MEM/WB.RegWrite 
and (MEM/WB.RegisterRd ≠ 0) 
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0) 
     and (EX/MEM.RegisterRd = ID/EX.RegisterRs)) 
and (MEM/WB.RegisterRd = ID/EX.RegisterRs)) Forward = 01 

if (MEM/WB.RegWrite 
and (MEM/WB.RegisterRd ≠ 0) 
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0) 
     and (EX/MEM.RegisterRd = ID/EX.RegisterRt)) 
and (MEM/WB.RegisterRd = ID/EX.RegisterRt)) Forward = 01