## 📘 **Zusammenfassung: V6 Pipelining Datapath and Control – Computerarchitektur**

### 🔁 Wiederholung: Pipelined Datapath

- **Pipeline-Register** zwischen Stufen speichern Zwischenergebnisse:
    
    - IF/ID, ID/EX, EX/MEM, MEM/WB
        
- **Ziel:** jede Stufe arbeitet gleichzeitig an unterschiedlichen Instruktionen
    

---

### 📦 Pipeline-Steuerung

- **Steuersignale** werden wie im Single-Cycle-Design aus dem Opcode abgeleitet.
    
- Vereinfachte & detaillierte Steuerung für jede Pipeline-Stufe:
    
    - IF → ID → EX → MEM → WB
        
- Fehlerbehandlung und Hazard-Erkennung notwendig.
    

---

### ⚠️ Data Hazards & Forwarding

#### 📦 Beispiel-Hazard

```asm
sub $2, $1, $3  # Ergebnis wird in $2 geschrieben
and $12, $2, $5 # liest $2 → Hazard
or  $13, $6, $2 # liest $2 → Hazard
```

#### 🛠 Lösungen

- **Forwarding (Bypassing):**
    
    - Ergebnis wird direkt aus EX/MEM oder MEM/WB weitergeleitet.
        
- **Forwarding-Bedingungen:**
    
    - EX-Hazard (vorherige Instruktion schreibt):
        
        ```
        if EX/MEM.RegWrite && EX/MEM.RegisterRd ≠ 0
            && EX/MEM.RegisterRd == ID/EX.RegisterRs
        → ForwardA = 10
        ```
        
    - MEM-Hazard (vor-vorherige Instruktion schreibt):
        
        ```
        if MEM/WB.RegWrite && MEM/WB.RegisterRd ≠ 0
            && MEM/WB.RegisterRd == ID/EX.RegisterRs
        → ForwardA = 01
        ```
        
- **Revised Forwarding:** MEM-Forwarding nur, wenn kein EX-Hazard.
    

---

### 🔁 Load-Use Hazard

- Auftritt, wenn Instruktion direkt nach einem Load das geladene Register benötigt.
    
- **Lösung:** 1-Stall-Cycle (Bubble) einfügen.
    
- Erkennung:
    
    ```
    if ID/EX.MemRead && 
       (ID/EX.RegisterRt == IF/ID.RegisterRs || 
        ID/EX.RegisterRt == IF/ID.RegisterRt)
    → Stall
    ```
    

---

### ⏱ Stalls & Bubbles

- **Bubble:** NOP wird in die Pipeline eingefügt
    
- PC und IF/ID-Register werden nicht aktualisiert (Pipeline pausiert)
    
- Compiler kann Code oft umsortieren, um Stalls zu vermeiden.
    

---

### 🔥 Branch Hazards & Lösungen

#### ⏳ Problem:

- Branch-Entscheidung erst in MEM-Stufe bekannt → falsche Befehle im IF
    

#### 🛠 Lösungen:

1. **Early Branch Resolution:**
    
    - Zieladresse & Vergleich schon in ID berechnen
        
2. **Flush Pipeline:**
    
    - Falls Branch genommen → falsche Instruktionen entfernen
        
3. **Branch Prediction:**
    
    - **Static Prediction:**
        
        - Rückwärts: taken (Schleifen)
            
        - Vorwärts: not taken
            
    - **Dynamic Prediction:**
        
        - **1-Bit Predictor:** einfache Historie
            
        - **2-Bit Predictor:** robuster gegen wiederholte Fehleinschätzungen
            
    - **Branch Target Buffer (BTB):**
        
        - Cache für Zieladressen
            

---

### 📐 Visualisierung

- **Multi-Cycle-Diagramme:** Ressourcen-Nutzung über Zeit
    
- **Single-Cycle-Diagramme:** Pipeline-Zustand zu einem Takt
    

---

### 📊 Performance-Effekte

- Forwarding & Prediction minimieren Stalls
    
- Dennoch: Stalls notwendig für Korrektheit
    
- Compiler kann helfen: **Instruction Scheduling**
    

---

### 📝 Für die Klausur merken

✅ Pipeline-Register & ihre Funktion  
✅ Forwarding vs. Stalling: Bedingungen & Hardwarelogik  
✅ Load-Use Hazard: Erkennung & Behebung  
✅ Branch Hazards: Static & Dynamic Prediction, BTB  
✅ Unterschied Multi- und Single-Cycle-Diagramme

---