Laboratorul 6: Diferență între versiuni

De la WikiLabs
(Actualizarea stării procesorului)
(Rularea unui program cu instrucțiuni de salt)
Linia 85: Linia 85:
 
   1  LOADC R1 #254
 
   1  LOADC R1 #254
 
   2  LOADC R2 #253
 
   2  LOADC R2 #253
   3  LOAD  R4 R0
+
   3  JMP  #7
   4  LOAD  R5 R1
+
   4  ADD  R6 R5 R4
   5  JMP  #7
+
   5  STORE R2 R6
 
   6  HALT
 
   6  HALT
   7  ADD  R6 R5 R4
+
   7  LOAD  R4 R0
   8  STORE R2 R6
+
   8  LOAD  R5 R1
   9  JMP  #6
+
   9  JMP  #4
10  NOP
 
11  NOP
 
 
</syntaxhighlight>
 
</syntaxhighlight>

Versiunea de la data 21 noiembrie 2019 02:20

Pipeline cu avansarea datelor

Procesorul implementat in laboratorul 4 are numai trei etaje pipeline. Singura dependență de date ce poate apare este cea de tip RAW între instrucțiunea aflată în etapa de EXECUTE și instrucțiunea imediat următoare din etapa de READ, dacă aceasta din urmă folosește rezultatul primeia. Pentru evitarea hazardului de date este necesară gestiunea dependențelor de tip RAW. În laboratorul 4 dependența se elimina din program prin adăugarea unei instrucțiuni NOP între cele două instrucțiuni ce depind una de alta. Această metodă simplă lungește timpul de execuție al programului. Alternativa avansării datelor elimină acest neajuns, dar necesită detecția și gestiunea în HW a dependențelor. Calea de avansare permite citirea operandului direct de la instrucțiunea precedentă, de la ieșirea nivelului EXECUTE.

Asc lab5 procesor fw.png


Detecția dependențelor RAW

Dependența de date de tip RAW poate apare numai între instrucțiunea aflată în execuție și instrucțiunea următoare, aflată în faza de citire, dacă rezultatul primeia este folosit ca operand de instrucțiunea imediat următoare, adică registrul destinație al primeia coincide cu unul din registrele sursă ale instrucțiunii următoare. Detecția dependenței se face comparând adresa destinație a instrucțiunii din etapa de execuție cu adresele sursă ale instrucțiunii aflate în etapa de citire.

Asc lab5 pipeline fw cmp.png


Avansarea rezultatului

Odată detectată dependența RAW, rezultatul instrucțiunii din etapa de execuție este selectat ca operand în locul valorii registrului sursă.

Asc lab5 pipeline fw mux.png


Salturi în pipeline

Procesarea instrucțiunilor de salt în pipeline necesită detecția și gestionarea dependețelor de control deoarece decizia de execuție sau nu a salturilor are loc într-una din etapele de procesare ulterioare extragerii instrucțiunii. Pipeline-ul simplu din Laboratorul 4 va executa instrucțiunea de salt în etapa de execuție. La sfârșitul etapei de execuție a instrucțiunii de salt (pe frontul de ceas) contorul de program se încarcă cu adresa de salt iar instrucțiunile ce au intrat sau intră în pipeline după instrucțiunea de salt sunt anulare, înlocuindu-se cu instrucțiuni NOP.

Asc lab5 procesor jmp.png


În acest laborator setul simplu de instrucțiuni RISC se va completa cu o instrucțiune de salt necondiționată la o adresă specificată în corpul instrucțiunii, JMP #target. Codul instrucțiunii de salt se alege 'b1110, iar adresa de salt ocupă octetul inferior al instrucțiunii (la fel ca și constanta instrucțiunii LOADC.


Detecția dependenței de control

Constă în detecția instrucțiunii de salt în etapa de execuție. Instrucțiunea de salt nu scrie nimic în setul de registre și nici în memorie. Logica de generare a semnalelor regs_wen și write trebuie să genereze 0 dacă instrucțiunea curentă din execuție este JMP. Nivelul de execuție se completează cu logica generării semnalului de control pc_load ce va determina actualizarea PC și înlocuirea cu NOP a instrucțiunilor mai noi ce deja au intrat în pipeline:

assign pc_load = r2_opcode == 4'b1110;


Actualizarea stării procesorului

La execuția instrucțiunii JMPcontorul de program, PC se va încărca cu adresa de salt. Descrierea PC din laboratorul precedent se completează cu o ramură corespunzătoare condiționată de semnalul pc_load :

always @(posedge clk) begin
    if(rst)
        pc <= 0;
    else if(halt)
        pc <= pc;
    else if(pc_load )
        pc <= pc_target;
    else 
        pc <= pc + 1;
end

La sfârșitul execuției instrucțiunii de salt, instrucțiunile mai noi ce sunt deja în nivelurile inferioare de pipeline se înlocuiesc cu instrucțiuni NOP. Astfel registrul pipeline R1 se va încărca cu instrucțiunea NOP (ce are codul binar 'b0000) dacă semnalul de control pc_load este activ:

always @(posedge clk) begin
    if(rst)
        r1 <= 0;
    else if(halt)
        r1 <= r1;
    else if(pc_load )
        r1 <= 0;
    else
        r1 <= instr;
end

Analog se completează și descrierea registrului pipeline R2.

Asc lab5 pipeline jmp.png

Rularea unui program cu instrucțiuni de salt

Pentru testarea calculatorului se modifică programul din memoria de program astfel:

  0   LOADC R0 #255
  1   LOADC R1 #254
  2   LOADC R2 #253
  3   JMP   #7
  4   ADD   R6 R5 R4
  5   STORE R2 R6
  6   HALT
  7   LOAD  R4 R0
  8   LOAD  R5 R1
  9   JMP   #4