Prozessor-Datenpfad und Pipelining

Sieh dir an, wie ein Prozessor Befehle tatsächlich ausführt. Baue aus Registern, einer ALU, Speichern und Multiplexern einen RISC-V-Einzyklus-Datenpfad auf, entwirf die Steuersignale und verfolge konkrete Befehle mit konkreten Werten durch den Datenpfad. Unterteile ihn anschließend in fünf Pipelinestufen, berechne den Speedup und lerne, wie Datenweiterleitung, Pipeline-Stillstände, Befehlsplanung und Sprungvorhersage die Pipeline trotz Daten- und Steuerkonflikten auslasten.

MittelEinheit 4 von 6 in Kurs: Rechnerarchitektur – Prozessoren, Speicher und RISC-V

Was du lernst

  1. Benenne die Hardwareeinheiten, die ein RISC-V-Prozessor benötigt, verschalte sie so, dass arithmetische Befehle, Speicherbefehle und bedingte Sprünge jeweils in einem Taktzyklus abgeschlossen werden, und verfolge konkrete Befehle durch den entstandenen Datenpfad.
    • Benenne die Bausteine eines Datenpfads und beschreibe ihre Taktung
      Unterscheide kombinatorische Schaltungselemente von Speicherelementen und beschreibe die Aufgaben von Befehlszähler, Speichern, Registersatz, ALU, Direktoperandengenerator, Addierern und Multiplexern.
    • Verschalte den Datenpfad für arithmetische Befehle, Speicherbefehle und bedingte Sprünge
      Ermittle, welche Einheiten und Verbindungen jede Befehlsklasse nutzt, und verbinde die einzelnen Pfade zu einem Datenpfad, wobei du an ihren Schnittstellen Multiplexer einsetzt.
    • Verfolge Befehle durch den Einzyklus-Datenpfad
      Verfolge konkrete Befehle mit konkreten Register- und Speicherwerten durch jede Einheit, gib die Werte auf den wichtigsten Leitungen an und benenne, was sich an der Taktflanke ändert.
  2. Leite die Steuersignale ab, mit denen der Datenpfad jeden Befehl ausführt. Nutze dazu ein vom Operationscode gesteuertes Hauptsteuerwerk und eine kleine, von den Funktionsfeldern gesteuerte ALU-Steuerung.
    • Lege die Hauptsteuersignale für jeden Befehl fest
      Erkläre die Wirkung jedes Hauptsteuersignals, erstelle die Steuertabelle für R-Typ-, Lade- und Speicherbefehle sowie bedingte Sprünge und verwende Don't-Care-Werte korrekt.
    • Leite den ALU-Steuercode aus ALUOp und den Funktionsfeldern ab
      Wandle mit zweistufiger Dekodierung das 2-Bit-Signal ALUOp sowie die Felder funct7 und funct3 des Befehls in den 4-Bit-Code um, der die ALU-Operation auswählt.
  3. Erkläre, wie die überlappende Ausführung von Befehlen den Durchsatz erhöht, beschreibe den fünfstufigen Pipeline-Datenpfad mit seinen Pipelineregistern und seiner Steuerung und verfolge Befehle anhand von Pipelinediagrammen.
    • Erkläre, warum Pipelining einen Prozessor beschleunigt
      Bestimme die Taktperiode eines Einzyklusentwurfs anhand seines kritischen Pfads und berechne dann Durchsatz, Latenz und Speedup einer Pipelineversion.
    • Beschreibe den fünfstufigen Pipeline-Datenpfad und seine Pipelineregister
      Erkläre, was die Pipelineregister enthalten, wie Steuersignale mit jedem Befehl weitergegeben werden und warum jeder Befehl alle fünf Stufen durchläuft.
    • Verfolge Befehle anhand von Pipelinediagrammen
      Zeichne und lies Pipeline-Zeitdiagramme, bestimme für einen gegebenen Zyklus den Befehl in jeder Stufe und zähle die Gesamtzahl der Zyklen mit und ohne Pipeline-Stillstände.
  4. Erkenne, wann Befehle in der Pipeline in Konflikt geraten, und behebe Datenkonflikte durch Datenweiterleitung, Pipeline-Stillstände und Befehlsplanung.
    • Erkenne Konflikte und die Datenabhängigkeiten, die sie verursachen
      Ordne Konflikte als Struktur-, Daten- oder Steuerkonflikte ein, finde die Abhängigkeiten zwischen Befehlen und ermittle, welche davon in einer Pipeline ohne Datenweiterleitung Stillstände verursachen.
    • Leite Ergebnisse weiter, um Pipeline-Stillstände zu vermeiden
      Erkläre die Weiterleitungspfade und die Bedingungen der Weiterleitungseinheit und bestimme für eine gegebene Befehlsfolge die Herkunft jedes ALU-Operanden.
    • Füge bei Load-Use-Konflikten Wartezyklen ein und vermeide sie durch Befehlsplanung
      Erkenne Load-Use-Konflikte, erkläre, wie die Pipeline eine Pipelineblase einfügt, und ordne Befehle um, um Pipeline-Stillstände zu vermeiden, ohne das Programmergebnis zu ändern.
  5. Verringere die Kosten von Sprüngen durch frühe Sprungentscheidung, Pipeline-Flush und statische oder dynamische Sprungvorhersage und schätze ab, wie sich alle Konflikte zusammen auf die Rechenleistung der Pipeline auswirken.
    • Verringere die Sprungverzögerung in der Pipeline
      Erkläre, warum Sprünge Steuerkonflikte verursachen, vergleiche Pipeline-Stillstände, die Vorhersage „Sprung nicht genommen“ und frühere Sprungentscheidungen und behandle Ausnahmen als verwandte Änderung des Kontrollflusses.
    • Sage Sprünge anhand ihres bisherigen Verlaufs dynamisch voraus
      Verfolge 1-Bit- und 2-Bit-Sprungprädiktoren, erkläre die Sprungverlaufstabelle und den Sprungzielpuffer und erkenne, wo einfache Prädiktoren versagen.
    • Schätze die Rechenleistung einer Pipeline unter Berücksichtigung von Konflikten ab
      Fasse Load-Use-Stillstände und Sprungverzögerungen zu einem effektiven CPI-Wert zusammen, berechne Ausführungszeiten und vergleiche Strategien zur Sprungbehandlung und Prozessorentwürfe.

Prozessor-Datenpfad und Pipelining einfach erklärt

5 Kapitel

1

Baue einen Einzyklus-Datenpfad auf

Ein Prozessor setzt Befehlsbits in Änderungen an Registern, Speicher und der nächsten Befehlsadresse um. Verfolge die Bausteine, die diese Arbeit leisten, und verbinde sie anschließend zu Pfaden für arithmetische Befehle, Lade- und Speicherbefehle sowie bedingte Sprünge. Konkrete Abläufe zeigen die Werte auf den Leitungen und die Änderungen, die an jeder Taktflanke gespeichert werden. Der Entwurf verwendet RV64-Register und eine kleine Auswahl von 4 Byte langen RISC-V-Befehlen, sodass jede Verbindung einen klaren Zweck hat.

1.1 Erkenne die Hardware und die Taktgrenze

Ein Datenpfad hält und verändert die Werte, die ein Befehl benötigt. Das Steuerwerk lenkt diese Werte und gibt Schreibzugriffe frei. Zusammen führen sie Befehle wie add, sub, and, or, ld, sd und beq aus.

Verfolge Werte zwischen Taktflanken

Ein Speicherelement merkt sich einen Wert: Beispiele sind der Befehlszähler, der Registersatz und der Datenspeicher. Ein kombinatorisches Schaltungselement erzeugt aus seinen aktuellen Eingaben eine Ausgabe. Addierer, Multiplexer, die ALU und der Direktoperandengenerator erfüllen diese Aufgabe, ohne das Ergebnis eines Befehls zwischen Zyklen zu speichern.

An der aktiven Taktflanke übernehmen Speicherelemente ihre nächsten Werte. Zwischen den Flanken speisen ihre Ausgänge die kombinatorische Logik. Der PC kann daher während eines Zyklus die aktuelle Adresse liefern und an dessen Ende die nächste Adresse übernehmen. Das Lesen eines Speicherelements überschreibt es nicht.

Befehle holen und auf Register zugreifen

Der Befehlszähler (PC) enthält die Befehlsadresse. Der Befehlsspeicher gibt den 32-Bit-Befehl an dieser Adresse zurück. In diesem Modell wird er während der Programmausführung nur gelesen und ordnet einer Adresse einen Befehl zu. Ein separater Addierer bildet PC + 4, weil die Befehle dieser Teilmenge 4 Bytes belegen.

Der Registersatz enthält x0–x31. Zwei Leseports nehmen die Quellregisternummern rs1 und rs2 entgegen und geben ihre Werte zurück. Ein Schreibport erhält das Zielregister rd, die Schreibdaten und RegWrite. Lesezugriffe erfolgen kombinatorisch; ein freigegebener Schreibzugriff wird an der Taktflanke gespeichert. Aus Register x0 wird immer null gelesen; Schreibzugriffe darauf werden verworfen. RV64-Register enthalten 64 Bit. Eine RV32-Version nutzt 32-Bit-Register und lw/sw mit denselben grundlegenden Verbindungen.

Rechnen, auswählen und auf den Speicher zugreifen

Die arithmetisch-logische Einheit (ALU) addiert, subtrahiert oder führt eine bitweise Operation aus. Ein 4-Bit-Steuercode wählt die Operation. Ihr Zero-Ausgang ist 1, wenn das Ergebnis null ist; durch Subtraktion lässt sich daher prüfen, ob zwei Werte gleich sind.

Der Direktoperandengenerator, ImmGen, setzt den Direktoperanden eines Befehls wieder zusammen und erweitert ihn mit Vorzeichen auf 64 Bit. Das Kopieren des Vorzeichenbits erhält einen negativen Wert. Das 12-Bit-Muster 1111 1111 1000 stellt −8 dar; eine Nullerweiterung würde daraus 4088 machen und eine Speicheroperation an die falsche Adresse lenken.

Ein Multiplexer, kurz Mux, wählt einen Eingang aus. Multiplexer wählen den zweiten ALU-Operanden, die Schreibdaten für den Registersatz und den nächsten PC-Wert. Ein Multiplexer ändert den Weg; eine Schreibfreigabe entscheidet, ob sich ein gespeicherter Wert ändert.

Der Datenspeicher hat Eingänge für Adresse und Schreibdaten, einen Ausgang für Lesedaten und die Steuersignale MemRead und MemWrite. Ein Ladebefehl muss im selben einzelnen Zyklus einen Befehl holen und auf Daten zugreifen. Getrennte Befehls- und Datenspeicher ermöglichen beide Zugriffe. Separate Addierer erlauben außerdem die Berechnung von PC + 4 und des Sprungziels, während die ALU andere Arbeit ausführt.

Nicht verwendete Ausgänge können sich während eines Zyklus trotzdem ändern. Eine korrekte Steuerung sorgt dafür, dass nur die ausgewählten Ausgänge zu freigegebenen Schreibzugriffen auf Speicherelemente gelangen. Ein berechneter Wert auf einer nicht ausgewählten Leitung hat keine Auswirkung auf das Programm.

Wichtige Erkenntnisse

  • Der Datenpfad verarbeitet Werte; Steuersignale wählen Wege aus und geben Schreibzugriffe frei.
  • Speicherelemente bewahren Werte über Taktflanken hinweg; kombinatorische Schaltungselemente verändern aktuelle Eingaben.
  • Der Registersatz hat zwei Leseports und einen Schreibport, und aus x0 wird immer null gelesen.
  • Die Vorzeichenerweiterung erhält den vorzeichenbehafteten Wert eines Direktoperanden.
  • Getrennte Speicher und Addierer ermöglichen Arbeiten, die in einem einzelnen Zyklus gleichzeitig nötig sind.

1.2 Verschalte die Pfade für jede Befehlsklasse

Beginne mit der Frage, was jeder Befehl lesen und was er ändern muss. Der gemeinsame Datenpfad verbindet diese Wege; überall dort, wo alternative Werte auf einen Eingang treffen, steht ein Multiplexer.

Befehle holen und Felder dekodieren

Beim Holen wird der PC verwendet, um den Befehlsspeicher zu lesen; parallel wird PC + 4 berechnet. Der Operationscode belegt die Bits 6–0. Sofern vorhanden, liegt rd in den Bits 11–7, funct3 in 14–12, rs1 in 19–15 und rs2 in 24–20; funct7 beim R-Typ belegt die Bits 31–25. Da die Positionen der Quellfelder gleich bleiben, können Register gelesen werden, während die Steuerung für den Befehl dekodiert wird. Ein Speicherbefehl oder bedingter Sprung hat kein rd-Feld: Die Bits 11–7 tragen zu seinem Direktoperanden bei.

Vergleiche die Ausführungspfade
BefehlALU-Eingaben und AktionDatenspeicherGespeichertes Ergebnis
add x5, x6, x7x6 + x7Kein ZugriffSumme nach x5
ld x5, 16(x6)x6 + 16Lesen an der effektiven AdresseSpeicherdaten nach x5
sd x5, 24(x6)x6 + 24x5 an die effektive Adresse schreibenSpeicher ändert sich
beq x8, x9, offsetx8 − x9Kein ZugriffNächsten PC-Wert auswählen

Bei einem Ladebefehl ist das ALU-Ergebnis eine effektive Adresse, also die Adresse der zu lesenden Daten. Die Speicherausgabe gelangt dann zurück zum Registersatz. Auch ein Speicherbefehl bildet mit der ALU eine Adresse, aber sein zweiter Quellwert gelangt getrennt zum Schreibdateneingang des Speichers. Wird ein Direktoperand als ALU-Operand ausgewählt, darf dieser Speicherwert nicht verworfen werden. ImmGen setzt den Offset im S-Format aus seinen beiden Bitgruppen wieder zusammen.

Ein bedingter Sprung führt zwei Operationen parallel aus. Die ALU subtrahiert die verglichenen Registerwerte; Zero zeigt an, ob sie übereinstimmen. Der Sprungaddierer addiert den vorzeichenbehafteten Byteoffset zum PC-Wert des Sprungbefehls. Die Kodierung im B-Format lässt das stets null gesetzte niederwertigste Bit aus. ImmGen kann den vollständigen Byteoffset einschließlich dieser Null rekonstruieren; eine Darstellung, die den Offset stattdessen in Halbwort-Einheiten erzeugt, benötigt eine Linksverschiebung um ein Bit. Die Verschiebung gehört genau einmal in den Pfad.

Führe die Pfade mit Multiplexern zusammen

ALUSrc wählt entweder den Wert von rs2 oder den Direktoperanden für den zweiten ALU-Eingang. MemtoReg wählt entweder das ALU-Ergebnis oder die Datenspeicherausgabe für das Zurückschreiben in den Registersatz. PCSrc wählt PC + 4 oder das Sprungziel. Zwei konkurrierende Ergebnisse benötigen einen Auswahlschalter, keine direkte Verbindung ihrer Ausgänge.

Diese Pfade zeigen, warum der Ladebefehl die längste Kette hat: Befehl holen, Register lesen, Adresse berechnen, Speicher lesen und Register schreiben tragen alle dazu bei. Arithmetische Befehle umgehen den Datenspeicher; ein Speicherbefehl umgeht das Zurückschreiben in den Registersatz.

Erweitere die bestehenden Wege

addi x5, x6, 3 nutzt den ALU-Pfad für den Direktoperanden und den Rückschreibpfad für das ALU-Ergebnis erneut. Er benötigt eine passende Steuerung, aber keine neue Datenpfadeinheit. jal hat eine zusätzliche Anforderung: Der Befehl schreibt PC + 4 nach rd und lenkt gleichzeitig den PC ohne Gleichheitsprüfung um. Sein Multiplexer für das Zurückschreiben benötigt daher einen Eingang für PC + 4, und die Logik für den nächsten PC-Wert muss einen unbedingten Sprung unterstützen.

Wichtige Erkenntnisse

  • Ein Ladebefehl schreibt Speicherdaten nach rd; seine ALU-Ausgabe ist die Adresse.
  • Ein Speicherbefehl sendet rs2 an den Speicher, während die ALU Basis und Offset addiert.
  • Ein bedingter Sprung vergleicht Registerwerte und berechnet parallel PC + Offset.
  • ALUSrc, MemtoReg und PCSrc wählen gemeinsame Wege aus.
  • Bei der Rekonstruktion des Byteoffsets im B-Format wird das implizite Nullbit genau einmal berücksichtigt.
  • Die Addition mit Direktoperand nutzt vorhandene Hardware erneut; ein Sprung mit Rückadressensicherung benötigt zusätzlich einen Rückschreibpfad für PC + 4.

1.3 Verfolge die Werte und Zustandsänderungen

Das Nachverfolgen eines Befehls verbindet die Assembleroperation mit konkreten Leitungswerten. Unterscheide Werte, die während des Zyklus berechnet werden, von Werten, die an der abschließenden Taktflanke gespeichert werden.

Verwende eine einheitliche Reihenfolge
  1. Hole den Befehl am aktuellen PC-Wert und bestimme seine Felder.
  2. Lies die Quellregister und bilde den vorzeichenbehafteten Direktoperanden.
  3. Wähle die ALU-Operanden und berechne das Ergebnis.
  4. Führe den angeforderten Datenspeicherzugriff aus.
  5. Wähle die Schreibdaten für den Registersatz und den nächsten PC-Wert.
  6. Liste die Schreibzugriffe auf Speicherelemente an der Taktflanke auf.
Addiere zwei Registerwerte

Bei PC 400 hat add x5, x6, x7 die Kodierung 0x007302B3. Seine Felder sind Operationscode 0110011, rd 5, funct3 000, rs1 6, rs2 7 und funct7 0000000. Bei x6 = 25 und x7 = −9 geben die Leseports 25 und −9 aus. ALUSrc wählt den zweiten Registerwert, und die ALU erzeugt 16. MemtoReg wählt 16 zum Zurückschreiben. An der Flanke wird x5 zu 16 und der PC zu 404. MemRead und MemWrite sind beide null.

Lade und speichere ein Doppelwort

Betrachte bei PC 404 den Befehl ld x5, 16(x6) mit x6 = 1000 und dem Wert 42 im Speicher an Adresse 1016. ImmGen gibt 16 aus. Die ALU berechnet die Adresse 1016, und der Datenspeicher gibt 42 zurück. MemtoReg wählt diesen Speicherwert, sodass x5 an der Flanke zu 42 und der PC zu 408 wird. Würde 1016 in x5 geschrieben, wäre die Adresse mit dem dort gespeicherten Wert verwechselt worden.

Bei PC 408 liest sd x5, 24(x6) die Werte x5 = 42 und x6 = 1000. Die ALU berechnet 1024, während der rs2-Pfad dem Speicher den Wert 42 liefert. MemWrite gibt das Speichern frei; RegWrite ist null. An der Flanke wird das Doppelwort an Adresse 1024 zu 42 und der PC zu 412. Speicheradresse und Speicherwert laufen über unterschiedliche Leitungen.

Die Offsets werden in Bytes gemessen. Benachbarte RV64-Doppelwörter beginnen im Abstand von 8 Bytes: Nach dem Doppelwort an Adresse 1016 beginnt das nächste bei 1024. Ein Schritt um ein Byte würde nicht zum nächsten Doppelwort führen.

Entscheide einen Sprung

Bei PC 412 vergleicht beq x8, x9, 12 den Wert x8 = 7 mit x9 = 7. Die ALU subtrahiert und erhält null. Branch ist 1, also ist Branch AND Zero gleich 1, und PCSrc wählt das Sprungziel. Der Sprungaddierer erzeugt 424, indem er 12 zu 412 addiert. Nur der PC ändert sich.

Ist x9 stattdessen 8, ergibt die Subtraktion −1 und Zero ist 0. Der nächste PC-Wert ist dann 416. Der kodierte Offset wird in Einheiten von 2 Bytes angegeben, sodass der gespeicherte vorzeichenbehaftete Wert für diesen Versatz von 12 Bytes gleich 6 ist; der vom Addierer verwendete vollständige Versatz ist weiterhin 12.

Lies den Zustand für den nächsten Befehl

Jeder Einzyklusbefehl schließt seine Arbeit zwischen benachbarten Taktflanken ab. Der nächste Befehl liest den Zustand, der an der vorherigen Flanke gespeichert wurde. Somit kann der Speicherbefehl im nächsten Zyklus den neuen x5-Wert des Ladebefehls ohne Datenweiterleitung in einer Pipeline lesen. Jeder Befehl benötigt einen Taktzyklus, was einen Einzyklus-CPI-Wert von 1 ergibt, unabhängig davon, wie viele Hardwareeinheiten sein Pfad nutzt.

Wichtige Erkenntnisse

  • Ein Ablauf zeigt numerische Leitungswerte und benennt gesondert die Zustandsänderungen an der Taktflanke.
  • Ein arithmetischer Befehl schreibt ein ALU-Ergebnis; ein Ladebefehl schreibt die Speicherausgabe.
  • Ein Speicherbefehl ändert den Speicher und den PC, ohne in den Registersatz zu schreiben.
  • Bei beq wählt Gleichheit das Ziel aus, dessen Offset vom PC-Wert des Sprungbefehls aus gemessen wird.
2

Entwirf das Steuerwerk für den Einzyklusprozessor

Dieselbe Hardware kann zwei Register addieren, eine Speicheradresse berechnen oder Werte für einen bedingten Sprung vergleichen. Steuersignale entscheiden, welche Aktion in jedem Zyklus wirksam ist. Leite diese Signale aus der Arbeit ab, die ein Befehl ausführen muss, einschließlich der Schreibfreigaben, die gespeicherte Zustände schützen. Verfolge dann die beiden Dekodierungsstufen, die einen Operationscode und Funktionsbits in eine bestimmte ALU-Operation umwandeln, und erweitere den Entwurf um die Addition mit Direktoperand.

2.1 Leite die Hauptsteuertabelle her

Das Hauptsteuerwerk übersetzt einen Operationscode in Auswahlsignale und Schreibfreigaben. Es ist eine kombinatorische Wahrheitstabelle, die mit Logikgattern implementiert wird: ein festverdrahtetes Steuerwerk.

Weise jedem Signal eine Aufgabe zu

RegWrite gibt einen Schreibzugriff auf rd frei. ALUSrc wählt den zweiten ALU-Eingang: 0 für rs2, 1 für einen Direktoperanden. MemRead und MemWrite fordern den entsprechenden Datenspeicherzugriff an. MemtoReg wählt die Schreibdaten für den Registersatz: 0 für das ALU-Ergebnis, 1 für Speicherdaten. Branch kennzeichnet einen Gleichheitssprung. Das 2-Bit-Signal ALUOp teilt der separaten ALU-Steuerung mit, welche Operationsklasse benötigt wird.

PCSrc ist anders: Es hängt vom Befehl und den verglichenen Werten ab. Das Hauptsteuerwerk setzt Branch, und die ALU liefert Zero. Deren AND-Verknüpfung bildet PCSrc, sodass ein gewöhnliches arithmetisches Ergebnis von null allein keinen Sprung auslösen kann.

Erstelle die Tabelle aus den nötigen Aktionen
KlasseALUSrcMemtoRegRegWriteMemReadMemWriteBranchALUOp
R-Typ00100010
ld11110000
sd1X001000
beq0X000101

Bei ld benötigt die ALU einen Offset als Direktoperanden, also ist ALUSrc gleich 1. Die geladenen Daten gelangen nach rd, sodass MemtoReg und RegWrite beide 1 sind. Der Speicher wird gelesen, nicht beschrieben; daraus folgen MemRead = 1 und MemWrite = 0. Branch ist 0, und ALUOp = 00 fordert die Addition zur Adressbildung an.

Bei sd addiert die ALU ebenfalls einen Offset, aber das Ziel ist der Speicher. Setze MemWrite = 1 und RegWrite = 0. MemRead bleibt null: Den Speicher zu nutzen bedeutet nicht, ihn zu lesen. Bei beq nutzt die ALU beide Registerwerte und subtrahiert, während die einzige mögliche Änderung des architektonischen Zustands den PC betrifft.

Verwende Don't-Care-Werte nur bei ignorierten Ergebnissen

X ist ein Don't-Care-Wert: Beide Auswahlwerte führen zum selben Verhalten. MemtoReg darf bei einem Speicherbefehl oder bedingten Sprung X sein, weil RegWrite null ist. Der Schreibdateneingang des Registersatzes wird ignoriert, sodass beim Entwurf der Auswahlwert gewählt werden kann, der die Schaltung vereinfacht.

Eine Schreibfreigabe für ein Speicherelement darf nicht so behandelt werden, wenn ein Schreibzugriff verboten ist. Ein versehentliches MemWrite während eines arithmetischen Befehls kann den Speicher verändern, obwohl der arithmetische Befehl die entsprechende Speicherausgabe sonst nicht benötigt. RegWrite und MemWrite müssen daher für Befehle, die diese Schreibzugriffe nicht ausführen, ausdrücklich null sein.

Ergänze eine Zeile für Arithmetik mit Direktoperand

addi x5, x6, 3 bezieht seinen zweiten Operanden von ImmGen und schreibt die ALU-Summe. Seine Zeile lautet ALUSrc 1, MemtoReg 0, RegWrite 1, MemRead 0, MemWrite 0, Branch 0, ALUOp 00. Sein Operationscode 0010011 unterscheidet sich vom R-Typ-Operationscode 0110011, daher benötigt das Hauptsteuerwerk diese zusätzliche Zeile. Um andi und ori zu unterstützen, müssen auch ihre funct3-Werte dekodiert werden, um die Operation auszuwählen.

Signalnamen hängen vom Entwurf ab. RegWEn, BSel und WBSel in anderen Kursdiagrammen beschreiben verwandte Aufgaben der Schreibfreigabe und Eingangsauswahl. Achte beim Lesen eines neuen Diagramms auf die Definition eines Signals und die Eingänge seines Multiplexers.

Wichtige Erkenntnisse

  • Das Hauptsteuerwerk leitet aus dem Operationscode die Auswahl der Wege und die Schreibfreigaben ab.
  • PCSrc verknüpft Branch mit dem Zero-Flag der ALU.
  • Ein Speicherbefehl aktiviert MemWrite und deaktiviert RegWrite und MemRead.
  • Ein Auswahlsignal ist nur dann ein Don't-Care-Wert, wenn der ausgewählte Wert das Verhalten nicht beeinflussen kann.
  • addi benötigt eine neue Operationscodezeile, nutzt aber den vorhandenen Datenpfad für die Addition mit Direktoperand erneut.

2.2 Dekodiere die ALU-Operation in zwei Stufen

Der Operationscode allein kann add nicht von sub unterscheiden: Beide gehören zur R-Typ-Klasse. Die zweistufige Steuerung bestimmt zuerst die Klasse und nutzt dann die Funktionsbits, wo sie relevant sind.

Von ALUOp zur Operation

Das Hauptsteuerwerk liefert neben seinen anderen Ausgaben ein 2-Bit-Signal ALUOp. Die ALU-Steuerung kombiniert es mit funct3 und Bit 30 des Befehls, einem Teil von funct7, und erzeugt vier Operationssteuerbits.

ALUOpZusätzliche InformationALU-SteuercodeOperation
00Funktionsbits ignoriert0010Addieren
01Funktionsbits ignoriert0110Subtrahieren
10funct3 000, Bit 30 = 00010Addieren
10funct3 000, Bit 30 = 10110Subtrahieren
10funct3 1110000AND
10funct3 1100001OR

Diese Codes beschreiben diese ALU-Implementierung, keine RISC-V-Befehlskodierungen. Lade- und Speicherbefehle nutzen ALUOp 00, weil sie Basis und Offset addieren. Gleichheitssprünge nutzen ALUOp 01, weil die Subtraktion bei übereinstimmenden Operanden Zero erzeugt. R-Typ-Befehle nutzen ALUOp 10 und benötigen weitere Dekodierung.

Verfolge eine kodierte Subtraktion

sub x5, x6, x7 hat die Kodierung 0x407302B3. Der Operationscode 0110011 bezeichnet den R-Typ und wählt ALUOp 10. Das funct3-Feld ist 000, sodass Addition und Subtraktion möglich bleiben. Bit 30 ist 1, aus funct7 0100000, also gibt die ALU-Steuerung 0110 für die Subtraktion aus.

Wird dieses Funktionsbit auf null geändert, ergibt sich die entsprechende add-Kodierung 0x007302B3 mit funct7 0000000 und ALU-Steuercode 0010. Die Zeile des Hauptsteuerwerks bleibt gleich, weil beide Befehle zwei Registereingaben nutzen, ein ALU-Ergebnis schreiben und nicht auf den Datenspeicher zugreifen.

Verwende den Addierer für die Subtraktion erneut

In der klassischen ALU stehen die Steuerleitungen für Ainvert, Bnegate und einen 2-Bit-Operationsauswahlschalter. Die Subtraktion nutzt den Addierer, nachdem der zweite Operand invertiert und ein Eingangsübertrag von 1 angelegt wurde:

a−b=a+b‾+1

Diese Zweierkomplement-Gleichung ermöglicht es Addition und Subtraktion, Hardware gemeinsam zu nutzen. Der Unterschied bei Bnegate erklärt die Codes 0010 und 0110; er erfordert keinen separaten arithmetischen Pfad für jeden Befehl.

Dekodiere Bits nur im passenden Format

Bei ALUOp 00 oder 01 wählen die Positionen der Funktionsfelder nicht die ALU-Operation aus. Das funct3-Feld 011 eines Ladebefehls beschreibt einen Doppelwortzugriff. Höherwertige Bits von Speicherbefehlen und bedingten Sprüngen enthalten Bits des Direktoperanden. Würden diese Positionen als R-Typ-Funktionsfelder behandelt, würde die Adressbildung mit der arithmetischen Dekodierung verwechselt.

Für eine schnelle R-Typ-Prüfung: ALUOp 10 mit funct3 110 wählt 0001, die OR-Operation. Wird unter demselben Operationscode eine weitere Operation ergänzt, muss unter Umständen nur die ALU-Steuerung geändert werden, sofern die ALU sie bereits unterstützt. Eine neue Befehlsklasse kann auch Änderungen am Hauptsteuerwerk erfordern, wie bei der Arithmetik mit Direktoperand.

Wichtige Erkenntnisse

  • ALUOp wählt eine Operationsklasse; beim R-Typ schließen die Funktionsbits die Dekodierung ab.
  • ALUOp 00 fordert Addition und 01 Subtraktion an, ohne die Funktionsfelder zu dekodieren.
  • In diesem Entwurf wählt 0010 die Addition und 0110 die Subtraktion.
  • Bit 30 unterscheidet add von sub, wenn funct3 gleich 000 ist.
  • Die Bedeutung der Funktionsfelder hängt vom Befehlsformat ab.
  • Die Subtraktion im Zweierkomplement nutzt die Addition mit invertiertem zweitem Operanden und Eingangsübertrag 1.
3

Unterteile den Datenpfad in Pipelinestufen

Ein langer Einzyklustakt muss für einen Ladebefehl ausreichen, selbst wenn der aktuelle Befehl weniger Arbeit benötigt. Pipelining teilt diese Arbeit in Stufen auf und überlappt die Befehlsausführung. Vergleiche die entstehende Taktperiode, den Durchsatz und die Latenz und verfolge dann die Daten und Steuersignale, die zwischen den Stufen gespeichert werden. Pipelinediagramme machen die Überlappung sichtbar und ermöglichen es, das Füllen, den laufenden Betrieb und den Abschluss einer kurzen Befehlsfolge direkt zu zählen.

3.1 Berechne Taktperiode, Latenz und Durchsatz

Ein Einzyklusprozessor muss seinen langsamsten Befehl vor der nächsten Flanke abschließen. Schnellere Befehle warten trotzdem denselben festen Takt ab. Pipelining ändert, wie viel Arbeit jede Taktperiode enthalten muss.

Bestimme die Grenze des Einzyklusentwurfs

Verwende diese Bauteilverzögerungen und vernachlässige Multiplexer und kleine Addierer: Befehl holen 250 ps, Register lesen 150 ps, ALU 200 ps, Datenspeicher 250 ps und Register schreiben 150 ps.

BefehlPfadverzögerung
R-Typ250 + 150 + 200 + 150 = 750 ps
ld250 + 150 + 200 + 250 + 150 = 1000 ps
sd250 + 150 + 200 + 250 = 850 ps
beq250 + 150 + 200 = 600 ps

Der Ladebefehl bildet den kritischen Pfad und legt die Periode auf 1000 ps oder 1 ns fest. Das entspricht einem Takt von 1 GHz. Ein Mix aus 25 % Ladebefehlen, 10 % Speicherbefehlen, 50 % R-Typ-Befehlen und 15 % bedingten Sprüngen hat eine gewichtete Pfadverzögerung von 800 ps. Dennoch erhält jeder Befehl 1000 ps, also das 1,25-Fache dieses Durchschnitts. Eine durchschnittliche Verzögerung kann keinen Takt festlegen, der auch für den längsten Befehl ausreichen muss.

Überlappe fünf Stufen

Die Pipeline teilt die Ausführung in IF (Befehl holen), ID (dekodieren und Register lesen), EX (ausführen oder eine Adresse berechnen), MEM (auf den Datenspeicher zugreifen) und WB (ein Register schreiben). Verschiedene Befehle belegen gleichzeitig verschiedene Stufen.

Der Durchsatz zählt abgeschlossene Befehle pro Zeiteinheit. Die Latenz misst die Zeit, die ein Befehl vom Eintritt bis zum Abschluss benötigt. Ein Fließband kann pro Zeitabschnitt ein Stück fertigstellen, selbst wenn jedes Stück mehrere Abschnitte für den Durchlauf benötigt. Dieselbe Unterscheidung gilt hier.

Die langsamste Stufe benötigt 250 ps. Bei 20 ps Pipelineregister-Overhead beträgt die Taktperiode 270 ps, etwa 3,70 GHz. Ein Befehl durchläuft fünf Perioden und benötigt 1350 ps. Das übersteigt seine Einzykluslatenz, aber eine gefüllte Pipeline kann alle 270 ps einen Befehl abschließen.

Berücksichtige Füll- und Abschlusszeit

Ohne Pipeline-Stillstände führt eine k-stufige Pipeline n Befehle in k + n − 1 Zyklen aus. Für fünf Stufen sind das n + 4. Vier Befehle benötigen acht Zyklen und damit 2160 ps, verglichen mit 4000 ps im Einzyklusprozessor. Der Speedup beträgt etwa 1,85.

Für 1.000.000 Befehle benötigt die Pipeline 1.000.004 Zyklen, ungefähr 270,0 μs. Der Einzyklusentwurf benötigt 1000 μs. Der Speedup nähert sich dem Verhältnis 1000/270, etwa 3,70, wenn die festen Kosten für das Füllen und Leeren klein werden.

Ein perfekter fünffacher Speedup würde fünf gleich langsame Stufen zu je 200 ps ohne Register-Overhead oder konfliktbedingte Verzögerungen voraussetzen. Bei ungleichen Stufen warten schnellere Stufen auf die langsamste. Mehr Stufen verursachen außerdem zusätzlichen Overhead und können die Kosten von Konflikten erhöhen.

Die feste Befehlslänge von 32 Bit in dieser Teilmenge vereinfacht das Holen. Gleichbleibende Registerfelder unterstützen ID, und die Beschränkung der Datenspeicherzugriffe auf Lade- und Speicherbefehle passt zur Adressberechnung in EX mit anschließendem MEM-Zugriff. Diese Eigenschaften der Befehlssatzarchitektur machen die Stufengrenzen praktikabel.

Wichtige Erkenntnisse

  • Der langsamste vollständige Befehl legt die Taktperiode des Einzyklusprozessors fest.
  • Die langsamste Stufe und der Register-Overhead legen die Taktperiode der Pipeline fest.
  • Pipelining erhöht den Durchsatz; die Latenz eines einzelnen Befehls kann steigen.
  • Eine konfliktfreie Folge von n Befehlen benötigt in einer fünfstufigen Pipeline n + 4 Zyklen.
  • Ungleiche Stufen, Register-Overhead, kurze Befehlsfolgen und Konflikte verringern den Speedup.

3.2 Führe jeden Befehl durch Pipelineregister

Mehrere Befehle teilen sich den Datenpfad gleichzeitig, sodass jede Stufe die Werte ihres eigenen Befehls benötigt. Pipelineregister bewahren diese Werte und ihre Steuersignale an jeder Taktflanke.

Ordne den Inhalt den späteren Aufgaben zu
RegisterWeitergegebene Informationen
IF/IDBefehl und sein PC-Wert
ID/EXQuellwerte, Direktoperand, PC, rs1, rs2, rd, Funktionsbits, Steuersignale für EX/MEM/WB
EX/MEMALU-Ergebnis, Zero, Sprungziel, Speicherwert, rd, Steuersignale für MEM/WB
MEM/WBSpeicherdaten, ALU-Ergebnis, rd, Steuersignale für WB

Jedes Register ist nach seinen benachbarten Stufen benannt. Es übernimmt die Ausgaben der ersten Stufe zur Verwendung in der zweiten. Nach WB gibt es kein zusätzliches Pipelineregister; WB schreibt den architektonischen Zustand. Der PC liefert den Zustand vor dem Holen.

Der obige Inhalt von EX/MEM unterstützt einen Entwurf, der die Sprunginformation in MEM verwendet. Ein Entwurf, der Sprünge in EX entscheidet, gibt diese Information früher an die Holstufe zurück. Die entscheidende Stufe bestimmt die Verzögerung durch den Steuerkonflikt.

Halte Zielregister und Daten zusammen

Ein Ladebefehl wird in ID dekodiert, schreibt rd aber erst drei Zyklen später in WB. Zu diesem Zeitpunkt enthält IF/ID einen jüngeren Befehl. Würde der Schreibport rd dieses jüngeren Befehls verwenden, gelangte der geladene Wert in das falsche Register. Die Zielregisternummer des Ladebefehls muss daher neben seinem Ergebnis durch ID/EX, EX/MEM und MEM/WB weitergegeben werden.

Ein Speicherbefehl führt entsprechend seinen rs2-Wert durch ID/EX und EX/MEM mit. Seine Adresse und seine Daten müssen denselben Speicherbefehl betreffen, wenn sie den Datenspeicher erreichen. Pipelineregister bewahren die Identität eines Befehls durch diese zusammengehörigen Werte, obwohl mehrere andere Befehle gleichzeitig aktiv sind.

Gib die Steuerung mit dem Befehl weiter

Die Steuersignale werden in ID erzeugt. EX nutzt ALUSrc und ALUOp; MEM nutzt Branch, MemRead und MemWrite; WB nutzt MemtoReg und RegWrite. Jede Stufe gibt die später benötigten Steuersignale zusammen mit den Daten weiter.

Wird der ALU-Steuercode in EX dekodiert, muss ID/EX neben ALUOp auch Bit 30 und funct3 mitführen. R-Typ-Operationen haben alle ALUOp 10, sodass dieser Wert allein add, sub, AND und OR nicht unterscheiden kann. Ein anderer gültiger Entwurf dekodiert die vollständige 4-Bit-Operation in ID und führt stattdessen diesen Code mit.

Halte den Stufenablauf einheitlich

Ein R-Typ-Befehl durchläuft MEM, ohne den Datenspeicher zu nutzen. Ein Speicherbefehl durchläuft WB, ohne ein Register zu schreiben. Wenn alle Befehle denselben fünfstufigen Ablauf einhalten, bleibt die Reihenfolge der Registerschreibzugriffe erhalten. Würde ein R-Typ-Befehl MEM überspringen, könnte er im selben Zyklus wie der unmittelbar vorherige Ladebefehl den einzigen Registerschreibport erreichen.

Der Registersatz bedient WB und ID in einem Zyklus, indem er in der ersten Hälfte schreibt und in der zweiten liest. ID kann dann einen Wert sehen, den ein älterer Befehl in diesem Zyklus geschrieben hat. Getrennte Befehls- und Datenspeicher ermöglichen den gleichzeitigen Betrieb von IF und MEM.

Die meisten Informationen bewegen sich in der Pipeline vorwärts. Das Zurückschreiben sendet ein Ergebnis an den Registersatz zurück, und die Sprungsteuerung sendet eine Entscheidung über den nächsten PC-Wert an die Holstufe zurück. Diese langen Rückwege erklären, warum spätere Befehle möglicherweise Unterstützung benötigen, bevor ein älterer Befehl abgeschlossen ist.

Wichtige Erkenntnisse

  • Pipelineregister bewahren die Daten und noch benötigten Steuersignale jedes Befehls.
  • rd wird neben dem zugehörigen Ergebnis bis nach WB weitergegeben.
  • EX benötigt die Funktionsbits oder einen bereits dekodierten ALU-Steuercode.
  • Alle Befehle behalten den fünfstufigen Ablauf bei, auch wenn eine Stufe keine Arbeit ausführt.
  • Schreiben in der ersten und Lesen in der zweiten Zyklushälfte ermöglichen es WB, ID im selben Zyklus mit einem Wert zu versorgen.
  • Getrennte Speicher ermöglichen das gleichzeitige Holen von Befehlen und den Zugriff auf Daten.

3.3 Lies Pipelinediagramme und zähle Zyklen

Ein Pipelinediagramm macht die Überlappung sichtbar. Die Zeilen zeigen Befehle in Programmreihenfolge, die Spalten zeigen Taktzyklen. Jede Zelle nennt die Stufe, die der betreffende Befehl während des jeweiligen Zyklus belegt.

Zeichne eine Treppe

Trage für fünf unabhängige Befehle IF für I1 in Zyklus 1 ein, danach ID, EX, MEM und WB in den Zyklen 2–5. Beginne I2 einen Zyklus später und wiederhole den Ablauf. Die Stufennamen bilden eine diagonale Treppe.

Befehl123456789
I1IFIDEXMEMWB
I2IFIDEXMEMWB
I3IFIDEXMEMWB
I4IFIDEXMEMWB
I5IFIDEXMEMWB

In Zyklus 5 ist I1 in WB, I2 in MEM, I3 in EX, I4 in ID und I5 in IF. Liest du eine Spalte von oben nach unten, erhältst du eine Momentaufnahme eines Zyklus. Eine Zeile zeigt den Verlauf eines einzelnen Befehls.

Nummeriere die Stufen von IF = 1 bis WB = 5. Ohne Pipeline-Stillstände erreicht Befehl i die Stufe s in Zyklus i + s − 1. I3 erreicht MEM daher in Zyklus 6. Die letzte WB-Zelle gibt den Abschlusszyklus an: Fünf Befehle enden in Zyklus 9.

Ergänze Werte in einer Momentaufnahme

I1 sei ld x5, 16(x6) mit x6 = 1000 und dem Wert 42 im Speicher an Adresse 1016. I2 sei eine unabhängige Addition, I3 eine unabhängige Subtraktion und I4 eine unabhängige OR-Operation. In Zyklus 4 liest der Ladebefehl den Speicher an Adresse 1016, I2 nutzt die ALU, I3 liest Register und I4 wird geholt. In Zyklus 5 schreibt der Ladebefehl 42 in x5. Eine Spalte enthält Arbeit mehrerer Befehle, nicht mehrere Stufen des Ladebefehls.

Zeige einen Stillstand, ohne ältere Arbeit anzuhalten

Verwende nun ld x10, 0(x20) gefolgt von add x11, x10, x12 und danach einem unabhängigen Befehl. Auch mit Datenweiterleitung benötigt der unmittelbar verbrauchende Befehl einen Stillstandszyklus:

  • Der Ladebefehl belegt IF 1, ID 2, EX 3, MEM 4, WB 5.
  • Der add-Befehl belegt IF 2, ID 3, erneut ID 4, EX 5, MEM 6, WB 7.
  • Der dritte Befehl belegt IF 3, erneut IF 4, ID 5, EX 6, MEM 7, WB 8.

Der add-Befehl wartet in ID, während eine Pipelineblase EX durchläuft. Der Ladebefehl läuft normal weiter; würde er angehalten, käme gerade der Wert später an, den add benötigt. Jeder jüngere Befehl wird zusammen mit add verzögert.

Zähle die Befehlsfolge einmal

Eine fünfstufige Pipeline benötigt ohne Stillstände n + 4 Zyklen. Jeder eingefügte Stillstandszyklus kommt hinzu. Wenn keine weiteren Verluste auftreten, ergibt das n + 4 + Stillstandszyklen. Das Beispiel mit drei Befehlen endet in Zyklus 8: drei Befehle, vier zusätzliche Stufenintervalle und ein Stillstandszyklus.

In den ersten vier Zyklen wird die Pipeline gefüllt, in den letzten vier geleert. Das sind zwei Sichtweisen auf denselben Ablauf mit n + 4 Zyklen, nicht zwei getrennte Zuschläge von je vier Zyklen. Bei einer langen Folge ist ihr fester Beitrag klein; bei einer kurzen Folge kann er den Speedup maßgeblich bestimmen.

Wichtige Erkenntnisse

  • Zeilen verfolgen jeweils einen Befehl; Spalten zeigen gleichzeitig ausgeführte Arbeit.
  • Ohne Pipeline-Stillstände belegt Befehl i die Stufe s in Zyklus i + s − 1.
  • Bei einem Stillstand wird ID wiederholt und das Holen jüngerer Befehle angehalten, während ältere Befehle weiterlaufen.
  • Bei einem fünfstufigen Ablauf ohne weitere Verluste beträgt die Gesamtzahl der Zyklen n + 4 + Stillstandszyklen.
4

Erkenne und behebe Datenkonflikte

Bei überlappender Befehlsausführung kann ein Wert benötigt werden, bevor der erzeugende Befehl ihn in den Registersatz geschrieben hat. Bestimme für jeden Quelloperanden den tatsächlichen Erzeuger und verfolge dann die Weiterleitungspfade, die neue Ergebnisse an spätere Befehle liefern. Ladebefehle zeigen die zeitliche Grenze der Datenweiterleitung: Ihre Daten kommen für einen unmittelbar verbrauchenden Befehl zu spät. Verfolge den nötigen Pipeline-Stillstand und sieh, wie das Verschieben unabhängiger Arbeit die Verzögerung beseitigen kann, ohne das Programmergebnis zu ändern.

4.1 Finde Abhängigkeiten, die die Ausführung verzögern können

Ein Konflikt verhindert, dass der nächste Befehl in seinem geplanten Zyklus ausgeführt wird. Um ihn zu untersuchen, bestimme die benötigte Ressource oder den benötigten Wert, den Zyklus, in dem sie oder er gebraucht wird, und den Zyklus, in dem sie oder er verfügbar wird.

Unterscheide drei Konfliktarten
ArtKonfliktBeispiel
StrukturkonfliktGleichzeitiger Bedarf an einer RessourceIF und MEM benötigen denselben Speicher mit einem Port
DatenkonfliktEin benötigter Wert liegt noch nicht vorEine Subtraktion benötigt das Ergebnis der vorherigen Addition
SteuerkonfliktDie richtige nächste Adresse steht noch nicht festDas Holen geht weiter, bevor ein Sprung entschieden ist

Getrennte Befehls- und Datenspeicher beseitigen den IF/MEM-Strukturkonflikt. Wird der Registersatz in der ersten Hälfte eines Zyklus beschrieben und in der zweiten gelesen, können auch WB und ID ihn gemeinsam nutzen. Durch diese Maßnahmen gibt es in diesem fünfstufigen Modell keinen Strukturkonflikt.

Bestimme den tatsächlichen Erzeuger

Eine echte Datenabhängigkeit (RAW) liegt vor, wenn ein späterer Befehl einen Wert liest, den ein früherer schreibt. Bei add x1, x2, x3 gefolgt von sub x4, x1, x5 erzeugt der add-Befehl x1 und der sub-Befehl verbraucht den Wert. Ohne weitere Maßnahmen liest sub x1 in ID während Zyklus 3, bevor add den Wert in WB während Zyklus 5 schreibt.

Eine Gegenabhängigkeit (WAR) verwendet ein Register erneut, nachdem ein älterer Befehl es gelesen hat. Bei einer Ausgabeabhängigkeit (WAW) haben zwei Befehle dasselbe Zielregister. Diese Namensabhängigkeiten verursachen im fünfstufigen Entwurf mit Ausführung in Programmreihenfolge keine Konflikte: Lesezugriffe erfolgen in ID und Schreibzugriffe in WB, jeweils in Programmreihenfolge. Sie sind wichtig, wenn entschieden wird, ob Software Befehle umordnen darf.

Verfolge eine Folge mit wiederholten Zielregistern

Betrachte:

ld  x5, 0(x10)
add x6, x5, x7
sub x5, x8, x9
or  x9, x6, x5

Die RAW-Abhängigkeiten sind Ladebefehl → add über x5, add → OR über x6 und Subtraktion → OR über x5. OR benötigt den neuen x5-Wert der Subtraktion, nicht den älteren geladenen Wert. Wer nur nach gleichen Registernamen sucht, kann diesen Wechsel des Erzeugers übersehen.

Die Subtraktion schreibt x5, nachdem add x5 gelesen hat: eine WAR-Abhängigkeit. Ladebefehl und Subtraktion haben außerdem eine WAW-Abhängigkeit bezüglich x5. OR schreibt x9, nachdem die Subtraktion es gelesen hat: eine weitere WAR-Abhängigkeit. Keine davon erzeugt in dieser Pipeline mit geordneter Ausführung einen WAR- oder WAW-Hardwarekonflikt.

Zähle Wartezyklen ohne Datenweiterleitung

Steht nur der Registersatz mit Schreiben vor Lesen zur Verfügung, benötigt ein unmittelbar verbrauchender Befehl zwei Stillstandszyklen. Er muss seinen ID-Lesezugriff von Zyklus 3 auf Zyklus 5 verschieben. Ein unabhängiger Befehl zwischen Erzeuger und Verbraucher verringert dies auf einen Stillstandszyklus. Mit zwei unabhängigen Befehlen erreicht der Verbraucher ID im WB-Zyklus des Erzeugers und benötigt keinen Stillstand.

Eine Abhängigkeit ist eine Eigenschaft des Programms; ob sie einen Stillstand verursacht, hängt vom zeitlichen Ablauf und den verfügbaren Pfaden ab. Eine zeitlich entfernte RAW-Abhängigkeit kann ohne Maßnahmen auskommen. Register x0 liefert nie ein ausstehendes Ergebnis, weil daraus immer null gelesen wird und Schreibzugriffe ignoriert werden.

Software kann nop-Befehle einfügen oder unabhängige Arbeit in Warteintervalle verschieben. Hardware kann Ergebnisse weiterleiten oder automatisch Stillstände einfügen. Beide Ansätze müssen sicherstellen, dass jeder verbrauchende Befehl den Wert erhält, den sein in Programmreihenfolge zugehöriger Erzeuger schreibt.

Wichtige Erkenntnisse

  • Struktur-, Daten- und Steuerkonflikte betreffen unterschiedliche Arten von Konflikten.
  • RAW bezeichnet einen Erzeuger, dessen Wert ein späterer Befehl liest.
  • In diesem fünfstufigen Entwurf mit Ausführung in Programmreihenfolge verursachen nur RAW-Abhängigkeiten Datenkonflikte.
  • Der nächstgelegene frühere Befehl, der ein Quellregister schreibt, liefert dessen benötigten Wert.
  • Ohne Datenweiterleitung wartet ein unmittelbar verbrauchender Befehl zwei Zyklen; ein Befehl dazwischen verringert die Wartezeit auf einen Zyklus.
  • WAR und WAW schränken weiterhin ein, wie Software Befehle zulässig umordnen kann.

4.2 Wähle durch Datenweiterleitung den neuesten verfügbaren Wert

Ein ALU-Ergebnis liegt bereits vor, bevor es in ein Register zurückgeschrieben wird. Die Datenweiterleitung, auch Bypassing genannt, leitet dieses Ergebnis direkt an den Eingang eines späteren Befehls und vermeidet so das Warten auf den Registersatz.

Wähle die Quelle für jeden Operanden

Zwei Multiplexer speisen die Ausführungspfade. ForwardA bedient rs1 und ForwardB bedient rs2. Jeder Operand wird unabhängig geprüft.

AuswahlcodeWertquelle
00In ID/EX mitgeführter Registerwert
10In EX/MEM mitgeführtes ALU-Ergebnis
01In MEM/WB mitgeführter Rückschreibwert

Der EX/MEM-Pfad erreicht den unmittelbar folgenden Befehl. Der MEM/WB-Pfad erreicht einen um zwei Positionen späteren Befehl und kann entweder ein ALU-Ergebnis oder geladene Daten übertragen. ForwardB speist außerdem den Pfad für die zu speichernden Daten, bevor ALUSrc zwischen diesem Wert und einem Direktoperanden wählt.

Prüfe Freigabe, Zielregister und Übereinstimmung

Für ForwardA = 10 muss der Befehl in EX/MEM RegWrite = 1 und ein von null verschiedenes rd haben, und rd muss gleich ID/EX.rs1 sein. Ersetze für die ForwardB-Prüfung rs1 durch rs2. Ein Speicherbefehl oder bedingter Sprung darf nicht als Erzeuger behandelt werden, nur weil seine Befehlsbits zufällig einer Zielregisternummer ähneln. Auch Schreibzugriffe auf x0 dürfen nicht zu weitergeleiteten Werten werden.

Für ForwardA = 01 führe die entsprechenden Prüfungen auf RegWrite, ein von null verschiedenes rd und übereinstimmende Registernummern für MEM/WB durch. Nutze dieses ältere Ergebnis nur, wenn EX/MEM den benötigten Operanden nicht bereits liefert. ForwardB folgt unabhängig derselben Prioritätsregel.

Verfolge ein Ergebnis zu späteren Verbrauchern

Beginne mit add x1, x2, x3, wobei x2 = 10 und x3 = 5 gilt. Der Befehl erzeugt am Ende von EX in Zyklus 3 den Wert 15.

  • Der nächste Befehl, sub x4, x1, x5, erreicht EX in Zyklus 4. Bei x5 = 3 liefert ForwardA = 10 den Wert 15 und die Subtraktion ergibt 12.
  • and x6, x7, x1 erreicht EX in Zyklus 5. ForwardB = 01 übernimmt x1 aus MEM/WB.
  • or x8, x1, x9 liest Register in ID während Zyklus 5, nach dem Schreibzugriff von add in der ersten Zyklushälfte. In EX benötigt der Befehl keine Datenweiterleitung.

Für diese Abhängigkeiten von ALU-Ergebnissen ist kein Pipeline-Stillstand nötig. Der verbrauchende Befehl erhält den Wert, wenn er die ALU nutzt, selbst wenn sein früherer ID-Lesezugriff einen veralteten Wert geliefert hat.

Löse zwei übereinstimmende Schreibzugriffe auf

Bei drei aufeinanderfolgenden Befehlen add x1, x1, x2, add x1, x1, x3 und add x1, x1, x4 stimmen sowohl EX/MEM als auch MEM/WB mit rs1 des dritten Befehls überein. EX/MEM enthält das Ergebnis des zweiten add-Befehls, den neuesten x1-Wert. MEM/WB enthält das Ergebnis des ersten add-Befehls und muss zurückstehen.

Dieselben Pfade ermöglichen es add x5, x6, x7, den Wert ohne Pipeline-Stillstand an sd x5, 0(x8) zu liefern. Der weitergeleitete x5-Wert erreicht den Schreibdatenpfad des Speichers, während die ALU des Speicherbefehls den Offset als Direktoperanden nutzt.

Datenweiterleitung kann keine Daten liefern, bevor sie vorliegen. EX/MEM enthält bei einem Ladebefehl dessen Adresse, nicht den geladenen Wert. Der unmittelbar verbrauchende Befehl muss warten, bis der Ladebefehl MEM abgeschlossen hat; würde die Adresse weitergeleitet, würde unbemerkt mit der falschen Größe gerechnet.

Wichtige Erkenntnisse

  • Datenweiterleitung liefert ein Ergebnis vor dem Zurückschreiben in den Registersatz direkt an einen späteren Befehl.
  • 00 wählt ID/EX, 10 wählt EX/MEM und 01 wählt MEM/WB.
  • Jede Übereinstimmung für die Datenweiterleitung setzt RegWrite, ein von null verschiedenes rd und eine übereinstimmende Quellregisternummer voraus.
  • Für denselben Operanden hat EX/MEM Vorrang vor MEM/WB.
  • ForwardB kann sowohl Speicherdaten als auch einen ALU-Registeroperanden liefern.
  • Ein unmittelbar auf einen Ladebefehl folgender Verbraucher benötigt weiterhin einen Stillstandszyklus, weil die Daten noch nicht vorliegen.

4.3 Füge eine Pipelineblase ein oder fülle die Lücke mit nützlicher Arbeit

Ein Ladebefehl erzeugt Daten am Ende von MEM. Der unmittelbar folgende Befehl würde diese Daten im selben Zyklus zu Beginn von EX benötigen. Ein Stillstandszyklus verschiebt die EX-Stufe des verbrauchenden Befehls in den nächsten Zyklus, wenn MEM/WB den Wert liefern kann.

Erkenne den fehlenden Wert in ID

Die Konflikterkennungseinheit untersucht den Befehl in EX und den Befehl, der gerade dekodiert wird. Der grundlegende Test prüft ID/EX.MemRead = 1 und eine Übereinstimmung zwischen ID/EX.rd und einem der beiden Quellnummernfelder in IF/ID. Ein verfeinerter Test schließt rd = x0 aus und prüft, welche Quellfelder der dekodierte Befehl tatsächlich liest.

Diese letzte Prüfung vermeidet einen unnötigen Stillstand bei einem I-Typ-Befehl, dessen Direktoperandenbits die übliche rs2-Position belegen. Der Vergleich der bloßen Feldpositionen ist sicher, kann aber einen Befehl verzögern, der das Register gar nicht liest.

Halte jüngere Arbeit an und führe den Ladebefehl weiter

Der Pipeline-Stillstand führt drei aufeinander abgestimmte Aktionen aus:

  1. Setze die nach ID/EX eingehenden Steuersignale auf null und füge so eine Pipelineblase ein.
  2. Setze PCWrite = 0, damit die Adresse zum Holen unverändert bleibt.
  3. Setze IF/IDWrite = 0, damit der in ID wartende Befehl erhalten bleibt.

Der Ladebefehl und ältere Befehle laufen weiter. Die Pipelineblase durchläuft spätere Stufen, ohne Register oder Speicher zu beschreiben. Würde ID/EX angehalten, während der Ladebefehl noch darin steht, würde der Ladebefehl wiederholt, statt eine leere Operation einzufügen.

Bei ld x10, 0(x20) gefolgt von add x11, x10, x12 ist der Ladebefehl in Zyklus 3 in EX und der add-Befehl in ID. In Zyklus 4 ist der Ladebefehl in MEM, die Pipelineblase in EX und der add-Befehl weiterhin in ID. In Zyklus 5 ist der Ladebefehl in WB und add erreicht EX mit ForwardA = 01.

Plane unabhängige Befehle ein

Betrachte:

ld  x10, 0(x20)
ld  x11, 8(x20)
add x12, x10, x11
sd  x12, 24(x20)
ld  x13, 16(x20)
add x14, x10, x13
sd  x14, 32(x20)

Die Verwendungen von x11 und x13 folgen unmittelbar auf ihre Ladebefehle. Auch mit Datenweiterleitung verursachen sie zwei Stillstandszyklen, was 7 + 4 + 2 = 13 Zyklen ergibt. Verschiebe ld x13, 16(x20) an die dritte Stelle vor den ersten add-Befehl. Dadurch wird der Ladebefehl für x11 von seinem Verbraucher getrennt und der Ladebefehl für x13 ausreichend weit vor seinen Verbraucher gesetzt. Die Folge benötigt nun 7 + 4 = 11 Zyklen.

Die Verschiebung ist zulässig, weil der Ladebefehl x20 liest, das die übersprungenen Befehle nicht ändern. Sein Zielregister x13 beeinflusst diese Befehle nicht. Seine Adresse x20 + 16 unterscheidet sich von x20 + 24 des übersprungenen Speicherbefehls. Ein Ladebefehl darf nicht über einen Speicherbefehl hinweg verschoben werden, der möglicherweise die Bytes schreibt, die er liest. Die Umordnung muss RAW-, WAR-, WAW- und Speicherabhängigkeiten erhalten.

Kombiniere Stillstände und Datenweiterleitung

Bei ld x5, 0(x10), add x6, x5, x7, sub x5, x8, x9 und or x9, x6, x5 verursacht nur das unmittelbare Load-Use-Paar einen Stillstand. Wenn OR EX erreicht, liefert ForwardA = 01 den x6-Wert von add und ForwardB = 10 den x5-Wert von sub. Insgesamt sind es 4 + 4 + 1 = 9 Zyklen.

Wichtige Erkenntnisse

  • Ein Load-Use-Paar benötigt mit Datenweiterleitung einen Stillstandszyklus.
  • Ein Stillstand setzt die eingehenden ID/EX-Steuersignale auf null und hält PC und IF/ID fest.
  • Der Ladebefehl läuft durch MEM weiter, während der verbrauchende Befehl in ID wartet.
  • Durch das Einplanen unabhängiger Arbeit können Ladebefehle von ihren Verbrauchern getrennt werden.
  • Eine zulässige Umordnung erhält Register- und Speicherabhängigkeiten.
  • Wähle nach einem Stillstand jeden weitergeleiteten Operanden von seinem eigenen tatsächlichen Erzeuger.
  • Für diese fünfstufigen Folgen gilt: Zyklen = Befehle + 4 + Stillstandszyklen.
5

Behandle Steuerkonflikte und sage Sprünge voraus

Bei einem bedingten Sprung hängt die nächste Befehlsadresse von Arbeit ab, die noch in der Pipeline stattfindet. Verfolge, was geschieht, wenn die Holstufe wartet, die nächste Adresse vorhersagt oder eine Fehlvorhersage korrigiert. Verfolge verlaufsbasierte Prädiktoren und unterscheide ihre Richtungsvorhersagen von gespeicherten Sprungzielen. Kombiniere schließlich Load-Use-Verzögerungen und Sprungverzögerungen mit der Taktperiode, um Ausführungszeiten zu vergleichen, einschließlich der Zielkonflikte durch tiefere Pipelines.

5.1 Reagiere auf Sprünge und Ausnahmen

Die Holstufe benötigt in jedem Zyklus eine neue Adresse. Ein bedingter Sprung liefert die richtige Auswahl erst nach seinem Vergleich und der Zielberechnung. Diese Lücke erzeugt einen Steuerkonflikt.

Setze Entscheidungsstufe und Verzögerung in Beziehung

In einer fünfstufigen Pipeline, bei der nach der entscheidenden Stufe umgelenkt wird, geht bei einer Fehlvorhersage ein Holplatz verloren, wenn das Ergebnis am Ende von ID bekannt ist. Eine Entscheidung am Ende von EX kostet zwei, am Ende von MEM drei Plätze. Jüngere Befehle sind während dieser Plätze bereits in die Pipeline eingetreten.

Eine Strategie hält das Holen an, bis jeder Sprung entschieden ist. Sie ist einfach, aber genommene und nicht genommene Sprünge verursachen beide die volle Wartezeit. Die Vorhersage „Sprung nicht genommen“ fährt stattdessen bei PC + 4 fort. Eine richtige Vorhersage erfordert keine Korrektur. Ein genommener Sprung lenkt das Holen um und verwirft die jüngeren Befehle des sequenziellen Pfads.

Verfolge einen genommenen Sprung

Hole beq x1, x2, 16 an Adresse 100 in Zyklus 1 und entscheide den Sprung am Ende von EX in Zyklus 3. Die Vorhersage „nicht genommen“ holt die Adressen 104 und 108 in den Zyklen 2 und 3. Wird der Sprung genommen, liegen beide Befehle auf dem falschen Pfad. Nach einer Verzögerung von zwei Zyklen beginnt das Holen in Zyklus 4 bei 116.

Ein Pipeline-Flush verhindert, dass diese jüngeren Einträge den architektonischen Zustand ändern oder Ausnahmen auslösen. Die Implementierung kann Einträge für ungültig erklären oder ihre Steuersignale und Ausnahmeeffekte unterdrücken. Ein Speicherbefehl auf dem falschen Pfad darf niemals einen wirksamen Schreibzugriff auf den Speicher ausführen.

Eine Pipelineblase ist nicht dasselbe wie ein RISC-V-Befehl, dessen Bits alle null sind. Die Kodierung aus lauter Nullen ist ungültig. Wird eine echte Befehlskodierung eingefügt, ist der kanonische nop addi x0, x0, 0, kodiert als 0x00000013. Ein verworfener Pipelineeintrag steht dagegen für keinen ausgeführten Befehl.

Entscheide früher, aber beschaffe Operanden früher

Werden der Vergleicher und der Sprungzieladdierer nach ID verlegt, sinkt die Umlenkungsverzögerung auf einen Zyklus. Der Vergleich benötigt seine Quellwerte nun in ID, sodass die übliche Datenweiterleitung nach EX allein nicht ausreicht. Mit geeigneter Datenweiterleitung nach ID wartet ein Sprung unmittelbar nach seinem erzeugenden ALU-Befehl einen Zyklus. Unmittelbar nach einem erzeugenden Ladebefehl wartet er zwei Zyklen. Die frühere Entscheidung tauscht weniger verlorene Holplätze gegen höhere Anforderungen an die Bereitstellung der Operanden.

Die statische Sprungvorhersage legt eine Regel im Voraus fest. Übliche Regeln sind immer nicht genommen, immer genommen und rückwärts genommen/vorwärts nicht genommen. Ein Rückwärtssprung am Ende einer Schleife wiederholt oft die Schleife, sodass seine Richtung ein nützlicher Hinweis ist.

RISC-V hat keinen Branch Delay Slot. Wird ein Sprung genommen, wird sein sequenzieller Nachfolger nicht allein deshalb ausgeführt, weil er geholt wurde. Einige ältere MIPS-Entwürfe führten diesen Nachfolger als definierten Befehl im Delay Slot aus; das ist eine andere Regel der Befehlssatzarchitektur.

Bewahre eine präzise Ausnahmegrenze

Ein ungültiger Befehl oder ecall überträgt die Steuerung an eine Behandlungsroutine. Ältere Befehle werden abgeschlossen; der fehlerauslösende Befehl und jüngere Befehle übernehmen ihre normalen Auswirkungen nicht in den architektonischen Zustand. Der Prozessor speichert den PC-Wert des auslösenden Befehls und die Ursache, etwa in den Registern sepc/scause im Supervisormodus oder mepc/mcause im Maschinenmodus, und holt dann Befehle von der Behandlungsroutine. Diese präzise Ausnahme zeigt den Zustand als Grenze zwischen abgeschlossenen älteren Befehlen und nicht abgeschlossener späterer Arbeit.

Wichtige Erkenntnisse

  • Je später ein Sprung entschieden wird, desto mehr jüngere Befehle müssen verworfen werden.
  • Die Vorhersage „nicht genommen“ verursacht nur bei einer Fehlvorhersage eine Korrekturverzögerung.
  • Ein Pipeline-Flush unterdrückt Zustandsänderungen und Ausnahmen auf dem falschen Pfad.
  • Befehlsbits aus lauter Nullen sind ungültig; der kanonische nop ist 0x00000013.
  • Eine frühe Entscheidung in ID benötigt auch frühere Operanden und geeignete Datenweiterleitung.
  • RISC-V hat keinen architektonischen Branch Delay Slot.
  • Präzise Ausnahmen bewahren abgeschlossene ältere Arbeit und verwerfen die Auswirkungen des auslösenden und jüngerer Befehle.

5.2 Verfolge verlaufsbasierte Sprungvorhersagen

Die dynamische Sprungvorhersage lernt aus Ergebnissen, die während der Programmausführung beobachtet werden. Eine Sprungverlaufstabelle (BHT) speichert kleine Zustandseinträge, die anhand von Bits einer Sprungadresse ausgewählt werden. Sage zuerst voraus, vergleiche später mit dem tatsächlichen Ergebnis und aktualisiere dann den Eintrag.

Sieh, warum ein Bit bei einer Schleife zweimal falschliegt

Ein 1-Bit-Prädiktor speichert das vorherige Ergebnis. Wurde der letzte Sprung genommen, sagt er für das nächste Mal „genommen“ voraus; andernfalls sagt er „nicht genommen“ voraus. Bei einer wiederholt aufgerufenen Schleife, deren Sprung neunmal genommen und dann einmal nicht genommen wird, bleibt das Bit beim Verlassen auf „nicht genommen“ stehen.

Beim nächsten Aufruf wird der erste genommene Sprung falsch vorhergesagt. Die dazwischenliegenden genommenen Sprünge stellen das Bit auf „genommen“, sodass auch das abschließende Verlassen mit „nicht genommen“ falsch vorhergesagt wird. Im eingeschwungenen Zustand sind das zwei Fehler bei zehn Ergebnissen oder 80 % Genauigkeit.

Ergänze ein zweites Bit für Beständigkeit

Ein 2-Bit-Sättigungszähler hat die Zustände 0 bis 3. Die Zustände 0 und 1 sagen „nicht genommen“ voraus; 2 und 3 sagen „genommen“ voraus. Ein genommenes Ergebnis erhöht den Zähler um eins, ein nicht genommenes verringert ihn um eins. Bei 0 und 3 bleiben die Werte stehen.

ZustandNameVorhersage
0Stark nicht genommenNicht genommen
1Schwach nicht genommenNicht genommen
2Schwach genommenGenommen
3Stark genommenGenommen

Aus Zustand 3 führt ein einmaliges Verlassen mit „nicht genommen“ in Zustand 2, der weiterhin „genommen“ vorhersagt. Der nächste Schleifeneintritt wird daher richtig vorhergesagt. Dieselbe Schleife mit zehn Ergebnissen hat im eingeschwungenen Zustand einen Fehler pro Aufruf oder 90 % Genauigkeit. Ausgehend von einem starken Zustand sind zwei aufeinanderfolgende entgegengesetzte Ergebnisse nötig, um die Vorhersage umzukehren.

Verfolge erst die Vorhersage, dann die Aktualisierung

Beginne in Zustand 1 und beobachte genommen, genommen, nicht genommen, genommen:

  1. Zustand 1 sagt „nicht genommen“ voraus: falsch. Erhöhe auf 2.
  2. Zustand 2 sagt „genommen“ voraus: richtig. Erhöhe auf 3.
  3. Zustand 3 sagt „genommen“ voraus: falsch. Verringere auf 2.
  4. Zustand 2 sagt „genommen“ voraus: richtig. Erhöhe auf 3.

Es gibt zwei Fehler und der Endzustand ist 3. Würde vor der Vorhersage aktualisiert, hätte der Prädiktor fälschlich Zugriff auf das Ergebnis, das er vorhersagen soll.

Unterscheide Richtung, Ziel und gegenseitige Störung

Zwei Sprungadressen können denselben BHT-Eintrag indizieren. Durch dieses Aliasing können sich ihre Ergebnisse gegenseitig stören. Eine Fehlvorhersage kostet Zyklen, aber bei der Korrektur wird das tatsächliche Ergebnis geprüft und die Korrektheit gewahrt.

Ein Sprungzielpuffer (BTB) liefert eine Adresse, nicht nur ein Richtungsbit. Wird er während IF mit dem PC abgefragt, kann er vor der Dekodierung das vorhergesagte Ziel eines genommenen Sprungs für den nächsten Holzyklus liefern. Die Richtungsvorhersage entscheidet, ob dieses Ziel verwendet wird.

Ein einfacher Verlauf hat Grenzen. Bei einem streng zwischen genommen und nicht genommen wechselnden Muster liegt ein 1-Bit-Prädiktor durchgehend falsch, nachdem er sich auf das Muster eingestellt hat. Ein 2-Bit-Zähler liegt höchstens in der Hälfte der Fälle richtig; beginnt er vor einem genommenen Ergebnis in Zustand 1, liegt er jedes Mal falsch. Korrelierende Prädiktoren berücksichtigen zusätzlich den jüngsten Sprungverlauf, Turnierprädiktoren wählen zwischen Prädiktoren, und ein Rückadressstapel sagt Ziele von Prozedurrücksprüngen voraus. Tiefere Pipelines machen die Korrektur teurer, weil sich vor der Entscheidung mehr jüngere Arbeit ansammelt.

Wichtige Erkenntnisse

  • Ein 1-Bit-Prädiktor wiederholt das letzte Ergebnis.
  • Ein 2-Bit-Zähler sagt in den Zuständen 2 und 3 „genommen“ voraus und bleibt bei 0 und 3 stehen.
  • Die Vorhersage nutzt den alten Zustand; die Aktualisierung folgt dem tatsächlichen Ergebnis.
  • Zwei Bits vermeiden den Fehler beim Schleifeneintritt, der durch ein einzelnes Verlassen entsteht.
  • Durch BHT-Aliasing können verschiedene Sprünge denselben Verlaufseintrag stören.
  • Ein BTB liefert ein vorhergesagtes Ziel; die Richtungsvorhersage entscheidet, ob es genutzt wird.

5.3 Berechne aus Konfliktraten die Ausführungszeit

Die Geschwindigkeit einer Pipeline hängt sowohl von der Taktperiode als auch von den Zyklen ab, die durch Warten oder Korrekturen anfallen. Der effektive CPI-Wert misst diese zusätzlichen Zyklen im Durchschnitt über die Befehlsfolge.

Gewichte jede Verzögerung nach den betroffenen Befehlen

Beginne für eine lange Folge mit Einfachausgabe beim idealen CPI-Wert 1. Addiere jede einzelne, nicht überlappende Ursache verlorener Zyklen als Anteil betroffener Befehle mal verlorene Zyklen pro Ereignis. Bei einer bedingten Rate brauchst du auch den Anteil der übergeordneten Gruppe.

Angenommen, 25 % der Befehle sind Ladebefehle, und auf 40 % dieser Ladebefehle folgt ein unmittelbarer Verbraucher. Jedes solche Paar verursacht einen Stillstandszyklus, sodass der Load-Use-Beitrag 0,25 × 0,40 × 1 = 0,10 Zyklen pro Befehl beträgt. Angenommen, 15 % sind bedingte Sprünge, 10 % davon werden falsch vorhergesagt und die Korrektur kostet zwei Zyklen. Der Sprungbeitrag beträgt 0,15 × 0,10 × 2 = 0,03.

Die Addition der unabhängigen Beiträge ergibt CPI-Wert = 1 + 0,10 + 0,03 = 1,13. Würde jedem Ladebefehl ein Stillstandszyklus angelastet, ergäbe das 0,25 statt 0,10. Würde die Sprungfehlerrate von 10 % auf jeden Befehl angewandt, würde ebenfalls zu viel gezählt.

Berücksichtige Taktperiode und Befehlsanzahl

Die Ausführungszeit entspricht Befehlsanzahl × CPI-Wert × Taktperiode. Ein Takt von 4 GHz hat eine Periode von 0,25 ns. Für 10⁹ Befehle bei einem CPI-Wert von 1,13 benötigt die Ausführung 10⁹ × 1,13 × 0,25 ns = 0,2825 s. Die durchschnittliche Zeit pro Befehl beträgt 0,2825 ns.

Zähle bei einer kurzen Folge die Zyklen für Füllen, Leeren und Konflikte ausdrücklich. Der ideale Basis-CPI-Wert von 1 beschreibt den stetigen Durchsatz; bei einer fünfstufigen Pipeline, die nur wenige Befehle ausführt, kommt auch der Beitrag von vier Zyklen für das Füllen und den Abschluss hinzu.

Vergleiche Sprungstrategien unter gleichen Bedingungen

Behalte die Load-Use-Kosten von 0,10, den Sprunganteil von 0,15 und die Verzögerung von zwei Zyklen bei:

SprungstrategieSprungkostenEffektiver CPI-Wert
Bei jedem Sprung warten0,15 × 2 = 0,301,40
Nicht genommen vorhersagen, 60 % genommen0,15 × 0,60 × 2 = 0,181,28
Dynamisch, 90 % Genauigkeit0,15 × 0,10 × 2 = 0,031,13

Bei gleicher Taktperiode und Befehlsanzahl ist die dynamische Vorhersage etwa 1,24-mal so schnell wie das Warten, denn 1,40/1,13 ≈ 1,24.

Vergleiche bei unterschiedlichen Prozessoren CPI-Wert × Periode. Ein Einzyklusentwurf mit 1000 ps benötigt 1000 ps pro Befehl. Eine Pipeline mit 270 ps und einem CPI-Wert von 1,13 benötigt 305,1 ps pro Befehl, ein Speedup von etwa 3,28. Ein Vergleich allein anhand des CPI-Werts würde den Einzyklus-CPI-Wert von 1 bevorzugen und zum falschen Schluss führen.

Verstehe den nächsten Zielkonflikt beim Entwurf

Mehr Pipelinestufen können die kombinatorische Arbeit pro Zyklus verkürzen. Sie verursachen aber auch Register-Overhead und können die Verzögerungen durch Load-Use-Konflikte und Fehlvorhersagen erhöhen. Die Taktfrequenz allein kann nicht entscheiden, ob der tiefere Entwurf gewinnt.

Mehrfachausgabe startet mehrere Befehle pro Zyklus und ermöglicht einen CPI-Wert unter 1 und mehr als 1 Befehl pro Taktzyklus (IPC). Statische Ausgabegruppen wählt der Compiler; bei dynamischer Ausgabe, der superskalaren Ausführung, entscheidet die Hardware und nutzt häufig Spekulation und Ausführung außerhalb der Programmreihenfolge. Datenabhängigkeiten und Sprungvorhersage begrenzen weiterhin die nutzbare Überlappung.

Wichtige Erkenntnisse

  • Mittle die Kosten jedes Konflikts über alle Befehle und berücksichtige bei bedingten Raten den Anteil der übergeordneten Gruppe.
  • Addiere bei langen Befehlsfolgen mit Einfachausgabe die einzelnen Beiträge verlorener Zyklen zum idealen CPI-Wert 1.
  • Die Ausführungszeit ist Befehlsanzahl × CPI-Wert × Taktperiode.
  • Vergleiche unterschiedliche Prozessoren anhand von CPI-Wert × Periode, nicht allein anhand des CPI-Werts.
  • Tiefere Pipelines tauschen kürzere Stufen gegen mehr Overhead und höhere Konfliktkosten.
  • Mehrfachausgabe kann einen IPC-Wert über 1 und einen CPI-Wert unter 1 erreichen.

Prozessor-Datenpfad und Pipelining: Beispiele

5 Interaktive Lektionen

1

Verfolge einen Befehl vom Holen bis zum gespeicherten Ergebnis

14 Schritte
Baue die gemeinsamen Einzykluspfade auf und verfolge einen arithmetischen Befehl, einen Ladebefehl, einen Speicherbefehl und einen bedingten Sprung mit konkreten Werten.
  1. 1
    EinführungWandle Befehlsbits in gespeicherte Werte um

    Ein Befehl bezeichnet eine Aufgabe, etwa das Addieren von Registerwerten oder das Laden von Daten. Der Prozessor benötigt Hardware, die diese Aufgabe ausführt, und Steuersignale, die die richtigen Wege auswählen.

    Verfolge den Einzyklus-Datenpfad von seinen Speicherelementen bis zu seinen Ausgaben. Verfolge dann eine kurze Befehlsfolge und bestimme genau, was sich an jeder abschließenden Taktflanke ändert. Jeder Befehl in dieser Teilmenge belegt 4 Bytes.

  2. 2
    ErklärungBeginne mit der gespeicherten Befehlsadresse

    Der PC enthält die aktuelle Befehlsadresse. Der Befehlsspeicher gibt den Befehl an dieser Adresse zurück, und ein separater Addierer berechnet gleichzeitig PC + 4.

    Der PC ist ein Speicherelement: Er behält seinen Wert während des Zyklus. Der Addierer arbeitet kombinatorisch: Seine Ausgabe folgt den Eingaben. An der abschließenden Taktflanke übernimmt der PC die nächste Adresse, die sein Eingangsmultiplexer auswählt.

  3. 3
    ErklärungLies die Operanden und bilde den Direktoperanden

    Der Registersatz liest rs1 und rs2 über zwei Ports. Sein Schreibport ändert rd nur, wenn RegWrite das Schreiben an der Taktflanke freigibt; aus x0 wird immer null gelesen.

    ImmGen setzt einen Direktoperanden zusammen und erweitert ihn mit Vorzeichen auf 64 Bit. Das Kopieren des Vorzeichenbits hält einen negativen Offset negativ. Für den 12-Bit-Wert 1111 1111 1000 ist das Ergebnis −8, nicht der nullerweiterte Wert 4088.

  4. 4
    KernaussageUnterscheide ein berechnetes von einem gespeicherten Ergebnis

    Die ALU addiert, subtrahiert oder führt AND beziehungsweise OR aus, abhängig von ihrem Steuereingang. Ihr Zero-Flag meldet, ob das Ergebnis null ist. Multiplexer wählen zwischen möglichen Eingaben, und Schreibfreigaben bestimmen, welche ausgewählten Werte als Zustand gespeichert werden.

    Eine Einheit kann eine ungenutzte Ausgabe berechnen, ohne das Programm zu verändern. Bei einer Schreibfreigabe für den Speicher ist das anders: Wird sie aktiviert, kann ein Wert gespeichert werden, auch wenn dieser Schreibzugriff nie beabsichtigt war.

  5. 5
    HerausforderungWelcher Baustein merkt sich den Wert?

    Ein Sprungzieladdierer berechnet 740, während der PC noch 720 enthält. Welche Einheit behält vor der aktiven Flanke die aktuelle Befehlsadresse, und ändert das berechnete Ziel diese Adresse selbst?

    ---reveal---

    Der PC behält 720. Der Addierer berechnet nur ein mögliches Ziel. Der PC ändert sich, wenn der ausgewählte nächste Wert an der Flanke übernommen wird; ein möglicher Wert an einem nicht ausgewählten Eingang überschreibt ihn nicht.

  6. 6
    ErklärungLeite arithmetische und Speicheroperationen durch den Datenpfad

    Eine R-Typ-Operation liest zwei Registerwerte, sendet sie durch die ALU und gibt das Ergebnis an rd zurück. Ein Ladebefehl benötigt dagegen eine Adresse aus Basis plus Offset und anschließend den Speicherwert an dieser Adresse.

    Ein Speicherbefehl berechnet eine Adresse auf dieselbe Weise, aber rs2 liefert die zu schreibenden Daten. Der Datenpfad zum Speicher muss verfügbar bleiben, während ALUSrc einen Direktoperanden für den zweiten ALU-Eingang auswählt.

  7. 7
    ErklärungWähle die gemeinsamen Verbindungen

    Drei Auswahlschalter führen die Pfade zusammen:

    • ALUSrc wählt rs2 oder den Direktoperanden für die ALU.
    • MemtoReg wählt das ALU-Ergebnis oder Speicherdaten für rd.
    • PCSrc wählt PC + 4 oder das Sprungziel.

    Ein Ladebefehl setzt ALUSrc auf 1 und MemtoReg auf 1. Ein Speicherbefehl nutzt ebenfalls den Adresspfad mit Direktoperand, deaktiviert aber das Zurückschreiben in den Registersatz und gibt das Schreiben in den Speicher frei.

  8. 8
    TippBerechne ein Sprungziel einmal

    Bei beq prüft eine Subtraktion auf Gleichheit, während ein separater Addierer den PC-Wert des Sprungs + vorzeichenbehafteten Byteoffset bildet. Diese Berechnungen können parallel ablaufen.

    Die Kodierung im B-Format lässt das niederwertige Nullbit des Offsets aus. ImmGen kann den vollständigen Byteoffset rekonstruieren, oder eine externe Verschiebung kann dieses Bit ergänzen. Liegt der vollständige Byteoffset bereits vor, würde eine erneute Verschiebung den Versatz verdoppeln.

  9. 9
    HerausforderungUnterscheide Speicheradresse und zu speichernde Daten

    Bei sd x11, 32(x18) enthält x18 den Wert 2400 und x11 den Wert 55. Wie lauten das ALU-Ergebnis und die Schreibdaten für den Speicher?

    ---reveal---

    Die ALU berechnet aus 2400 + 32 die Adresse 2432. Die Schreibdaten für den Speicher sind 55 und stammen aus x11. Würde 55 anstelle des Offsets an die ALU gesendet, entstünde eine andere Adresse ohne Bezug zur Aufgabe; die Auswahl des Direktoperanden muss den Pfad für die Speicherdaten erhalten.

  10. 10
    BeispielVerfolge eine Addition an der Taktflanke

    Bei PC 400 liest add x5, x6, x7 die Werte x6 = 25 und x7 = −9. ALUSrc wählt den zweiten Registerwert, die ALU addiert, und MemtoReg wählt das Ergebnis 16.

    An der Flanke speichert RegWrite 16 in x5, und der PC wird zu 404. Der Datenspeicher wird weder gelesen noch beschrieben.

  11. 11
    BeispielVerfolge einen Ladebefehl und danach einen Speicherbefehl

    Bei PC 404 nutzt ld x5, 16(x6) den Wert x6 = 1000 und liest Adresse 1016, deren Doppelwort 42 enthält. Die ALU gibt 1016 aus; der Speicher gibt 42 aus, was MemtoReg für x5 auswählt. Der PC wird auf 408 erhöht.

    Der nächste Befehl sd x5, 24(x6) berechnet die Adresse 1024 und schreibt den aktualisierten x5-Wert 42. Er erhöht den PC auf 412, ohne ein Register zu schreiben.

  12. 12
    BeispielBestimme die nächste Befehlsadresse

    Bei PC 412 liest beq x8, x9, 12 zweimal den Wert 7. Die Subtraktion ergibt null und der Zieladdierer 424. Branch AND Zero wählt 424 als nächsten PC-Wert.

    Wäre x9 gleich 8, ergäbe die Subtraktion −1 und der PC würde auf 416 erhöht. In keinem der beiden Fälle wird ein Allzweckregister oder der Datenspeicher beschrieben. Der Vergleich steuert, welche der möglichen Adressen gespeichert wird.

  13. 13
    HerausforderungUntersuche den falschen Zielwert

    Ein korrekt ausgeführtes ld x10, 8(x20) mit x20 = 3200 liest das Doppelwort 91 an Adresse 3208. Ein fehlerhafter Rückschreibmultiplexer führt stattdessen zu x10 = 3208. Was hat der Multiplexer ausgewählt und was sollte er auswählen?

    ---reveal---

    Er hat das ALU-Ergebnis ausgewählt, die Adresse 3208. Er sollte die Datenspeicherausgabe 91 auswählen. Die Adressberechnung kann korrekt sein, während der Endzustand falsch ist, weil beim Zurückschreiben die falsche Quelle gewählt wurde.

  14. 14
    ZusammenfassungOrdne jedem Schreibzugriff auf ein Speicherelement seinen Weg zu

    Unterscheide für einen vollständigen Einzyklusablauf das arithmetische Ergebnis, die effektive Adresse, die Speicherdaten und den nächsten PC-Wert. Lade- und arithmetische Befehle schreiben rd über unterschiedliche Multiplexereingänge; Speicherbefehle nutzen einen separaten Datenpfad; bedingte Sprünge wählen nur die nächste Befehlsadresse.

    Für alle gilt dieselbe Taktgrenze: Kombinatorische Arbeit erzeugt während des Zyklus mögliche Werte, und freigegebene Schreibzugriffe auf Speicherelemente übernehmen am Ende die ausgewählten Werte.

2

Leite die Steuerung aus den Aufgaben eines Befehls ab

11 Schritte
Erstelle eine Steuerzeile für einen Ladebefehl, begründe Don't-Care-Werte und dekodiere R-Typ-Arithmetik mit ALUOp und Funktionsbits.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungLass den gemeinsamen Datenpfad den Befehl ausführen
  2. 2
    BeispielLeite die Zeile eines Ladebefehls aus seinem Datenweg ab
  3. 3
    ErklärungSchütze den Zustand durch eindeutige Schreibfreigaben
  4. 4
    KernaussageLass die Daten die Sprungentscheidung abschließen
  5. 5
    HerausforderungWähle die folgenlose unbestimmte Einstellung
  6. 6
    ErklärungWähle mit ALUOp eine Operationsklasse
  7. 7
    BeispielVerfolge die Funktionsbits der Subtraktion
  8. 8
    VerbindungVerwende den Addierer für die Subtraktion erneut
  9. 9
    HerausforderungOrdne die Bits eines Ladebefehls richtig zu
  10. 10
    HerausforderungErweitere die Steuerung ohne zusätzlichen Adresspfad
  11. 11
    ZusammenfassungVerbinde Freigaben mit der Dekodierung
3

Beobachte die Überlappung unabhängiger Befehle

15 Schritte
Berechne einen Pipelinetakt, verfolge Werte durch Stufenregister und lies Abschlusszeiten aus dem fünfstufigen Ablauf ab.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungUnterscheide einen Befehl von der Befehlsfolge
  2. 2
    BeispielFinde den langsamsten vollständigen Befehl
  3. 3
    BeispielLege den Pipelinetakt anhand der langsamsten Stufe fest
  4. 4
    AnalogieVergleiche Durchsatz und Latenz
  5. 5
    HerausforderungBerechne eine kurze Folge
  6. 6
    ErklärungFühre den Befehl mit, nicht nur sein Ergebnis
  7. 7
    BeispielHalte das Zielregister beim Ladebefehl
  8. 8
    ErklärungFühre die Steuersignale bis zu ihrer Stufe mit
  9. 9
    HerausforderungWarum den ungenutzten MEM-Platz beibehalten?
  10. 10
    BeispielZeichne eine Treppe aus Stufen
  11. 11
    TippBestimme eine Stufe, ohne jede Zelle zu zeichnen
  12. 12
    BeispielFüge eine Wartezeit ein, ohne ältere Arbeit zu wiederholen
  13. 13
    HerausforderungLies den verzögerten Abschluss ab
  14. 14
    HerausforderungVerbinde Speicherung mit einer Zyklusaufnahme
  15. 15
    ZusammenfassungLies die Rechenleistung aus dem Ablauf ab
4

Verfolge den neuesten Wert durch eine angehaltene Pipeline

17 Schritte
Bestimme Erzeuger, wähle Weiterleitungsquellen, füge eine Load-Use-Pipelineblase ein und prüfe eine Umordnung.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFinde heraus, wo der benötigte Wert vorliegt
  2. 2
    ErklärungUnterscheide Konflikte nach ihrer Ursache
  3. 3
    BeispielBestimme den Erzeuger für jeden Lesezugriff
  4. 4
    HerausforderungErzeugt die Wiederverwendung eines Registers einen Hardwarekonflikt?
  5. 5
    ErklärungLiefere ein ALU-Ergebnis vor dem Zurückschreiben
  6. 6
    TippPrüfe jede Übereinstimmung für die Datenweiterleitung
  7. 7
    BeispielLöse zwei übereinstimmende Schreibzugriffe auf
  8. 8
    HerausforderungLeite zwei Operanden unabhängig weiter
  9. 9
    VerbindungErhalte den separaten Pfad für Speicherdaten
  10. 10
    ErklärungErkenne die zeitliche Grenze der Datenweiterleitung
  11. 11
    ErklärungHalte den Verbraucher an und füge eine Pipelineblase ein
  12. 12
    BeispielVerfolge die Wartezeit über drei Zyklen
  13. 13
    TippLass die Konflikterkennung die tatsächlichen Quellen prüfen
  14. 14
    BeispielVerschiebe nützliche Arbeit in die Lücke
  15. 15
    HerausforderungPrüfe die Verschiebung, bevor du den Gewinn zählst
  16. 16
    HerausforderungKombiniere die Pipelineblase mit späterer Datenweiterleitung
  17. 17
    ZusammenfassungWähle die Unterstützung nach dem Zeitpunkt der Erzeugung
5

Stelle die Befehlsfolge wieder her und miss die Kosten

19 Schritte
Verfolge einen genommenen Sprung, vergleiche Vorhersagezustände und kombiniere Konfliktraten mit der Taktperiode, um die Ausführungszeit abzuschätzen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte nützliche Arbeit auf dem richtigen Pfad
  2. 2
    ErklärungZähle die Holplätze jüngerer Befehle
  3. 3
    BeispielVerfolge einen genommenen Sprung bei der Vorhersage „nicht genommen“
  4. 4
    TippVerwirf Arbeit, ohne einen ungültigen Befehl auszuführen
  5. 5
    ErklärungWäge frühere Sprungentscheidungen gegen frühere Operanden ab
  6. 6
    HerausforderungSchütze den Zustand nach einer Fehlvorhersage
  7. 7
    VerbindungBewahre die Ausnahmegrenze
  8. 8
    ErklärungSage die Richtung anhand des Verlaufs voraus
  9. 9
    ErklärungLass zwei Bits die Vorhersage beibehalten
  10. 10
    BeispielVerfolge die Vorhersage vor der Aktualisierung
  11. 11
    HerausforderungPrüfe ein Paar entgegengesetzter Ergebnisse
  12. 12
    ErklärungUnterscheide Richtung und Ziel
  13. 13
    KernaussageErkenne gegenseitige Störungen und Grenzen bei Mustern
  14. 14
    BeispielRechne bedingte Raten in Kosten pro Befehl um
  15. 15
    BeispielBerücksichtige die Dauer eines Zyklus
  16. 16
    BeispielVergleiche Vorhersagestrategien
  17. 17
    HerausforderungErmittle den fehlenden Sprunganteil
  18. 18
    HerausforderungBeurteile eine tiefere Pipeline
  19. 19
    ZusammenfassungMiss die nutzbare Überlappung nach den Korrekturkosten

Prozessor-Datenpfad und Pipelining: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Lies den fünfstufigen Ablauf10 Übungsfragen

Frage 1 von 10

Welche Leistungsgröße zählt abgeschlossene Befehle pro Zeiteinheit?
  1. Befehlslatenz
  2. Durchsatz
  3. Taktzykluslatenz
  4. Pipelinetiefe
Antwort zeigenAntwort ausblenden
Antwort: B
Der Durchsatz misst, wie häufig abgeschlossene Befehle den Prozessor verlassen. Die Latenz verfolgt dagegen einen Befehl vom Eintritt bis zum Abschluss. Eine Pipeline kann den Durchsatz durch Überlappung verbessern, selbst wenn die Gesamtlaufzeit eines einzelnen Befehls steigt.

Frage 2 von 10

Warum muss das rd-Feld eines Ladebefehls bis MEM/WB mitgeführt werden?
  1. WB muss den Direktoperanden des nächsten Sprungs dekodieren.
  2. MEM muss das Basisregister dieses Ladebefehls erneut lesen.
  3. IF muss den Quelloperanden dieses Ladebefehls auswählen.
  4. WB muss das Zielregister dieses Ladebefehls bestimmen.
Antwort zeigenAntwort ausblenden
Antwort: D
Der geladene Wert muss in sein eigenes rd geschrieben werden, wenn der Ladebefehl WB erreicht. Zu diesem Zeitpunkt ist der Befehl in der Dekodierung jünger und kann ein anderes Zielregister haben. Das Mitführen von rd mit dem Ergebnis verhindert, dass für den älteren Schreibzugriff die Registernummer des aktuellen Dekoders verwendet wird.

Frage 3 von 10

In einer konfliktfreien fünfstufigen Pipeline beginnt Befehl I6 in Zyklus 6 mit IF. In welchem Zyklus erreicht er MEM?
  1. 9
  2. 8
  3. 10
  4. 11
Antwort zeigenAntwort ausblenden
Antwort: A
MEM ist die vierte Stufe, daher durchläuft I6 IF 6, ID 7, EX 8 und MEM 9. Zyklus 10 ist seine WB-Stufe, nicht seine Speicherzugriffsstufe. Dass spätere Befehle beginnen, bevor ältere abgeschlossen sind, erzeugt die überlappende Treppe.

Frage 4 von 10

Die Logikverzögerungen der Stufen betragen 180, 120, 210, 160 und 130 ps. Der Pipelineregister-Overhead beträgt 15 ps. Welche Taktperiode ist erforderlich?
  1. 800 ps
  2. 210 ps
  3. 225 ps
  4. 175 ps
Antwort zeigenAntwort ausblenden
Antwort: C
Die langsamste Stufe hat eine Logikverzögerung von 210 ps, und der Register-Overhead fügt 15 ps hinzu. Das ergibt 225 ps. Der Durchschnitt der Stufenverzögerungen würde der langsamsten Stufe nicht genug Zeit geben. Ihre Summe beschreibt einen vollständigen Pfad, nicht das Intervall zwischen Pipelineflanken.

Frage 5 von 10

Der Befehl in EX ist eine R-Typ-Operation mit ALUOp 10. ID/EX führt weder ihre Funktionsbits noch einen vordekodierten Operationscode mit. Welche Information fehlt?
  1. Welche konkrete R-Typ-ALU-Operation auszuführen ist.
  2. Dass die Befehlsklasse des Befehls R-Typ ist.
  3. Wie viele Pipelinestufen der Entwurf enthält.
  4. Welche Adresse der nächste sequenzielle Befehl hat.
Antwort zeigenAntwort ausblenden
Antwort: A
ALUOp 10 bestimmt die R-Typ-Klasse, aber diese Klasse enthält mehrere Operationen. EX benötigt weiterhin funct3 und Bit 30 oder einen zuvor dekodierten Operationscode, um zwischen ihnen zu wählen. Die Klasse ist bereits bekannt; ihre Wiederholung würde die fehlende Unterscheidung nicht beheben.

Frage 6 von 10

Eine fünfstufige Pipeline führt acht Befehle mit drei eingefügten Stillstandszyklen und ohne Sprungverluste aus. Am Ende welches Zyklus schließt der letzte Befehl WB ab?
  1. 11
  2. 15
  3. 12
  4. 19
Antwort zeigenAntwort ausblenden
Antwort: B
Acht Befehle benötigen vor Stillständen 8 + 4 = 12 Zyklen. Die drei eingefügten Verzögerungen verschieben das letzte WB in Zyklus 15. Vier Zyklen für das Füllen und weitere vier für das Leeren zu addieren, würde denselben überlappenden Stufenablauf doppelt zählen.

Frage 7 von 10

Eine fünfstufige Pipeline hat keine Datenweiterleitung und schreibt den Registersatz in jedem Zyklus vor dem Lesen. Führe add x13, x2, x3; or x20, x4, x5; sub x14, x13, x6 aus. Der mittlere Befehl ist unabhängig. Wie viele Stillstandszyklen und wie viele Zyklen insgesamt werden benötigt?
  1. 2 Stillstände; 9 Zyklen
  2. 0 Stillstände; 7 Zyklen
  3. 1 Stillstand; 9 Zyklen
  4. 1 Stillstand; 8 Zyklen
Antwort zeigenAntwort ausblenden
Antwort: D
Der Erzeuger schreibt x13 in Zyklus 5. Mit einem unabhängigen Befehl dazwischen würde die Subtraktion x13 in Zyklus 4 in ID lesen und benötigt daher einen Stillstandszyklus, um in Zyklus 5 zu lesen. Drei Befehle benötigen dann 3 + 4 + 1 = 8 Zyklen; zwei Stillstandszyklen gelten für einen unmittelbaren Verbraucher.

Frage 8 von 10

Ein Einzyklusprozessor benötigt 900 ps pro Befehl. Eine fünfstufige Version hat Logikverzögerungen von 180, 120, 210, 160 und 130 ps sowie 15 ps Register-Overhead. Beide führen sechs unabhängige Befehle aus. Wie groß ist der Speedup der Pipeline?
  1. 4,00-fach
  2. 2,57-fach
  3. 2,40-fach
  4. 5,00-fach
Antwort zeigenAntwort ausblenden
Antwort: C
Die Pipelineperiode beträgt 210 + 15 = 225 ps. Sechs Befehle benötigen zehn Zyklen, also beträgt die Pipelinezeit 2250 ps; die Einzykluszeit beträgt 5400 ps. Das ergibt einen 2,40-fachen Speedup. Das Verhältnis 900/225 = 4 gilt erst, wenn die festen Füllkosten vernachlässigbar werden.

Frage 9 von 10

Ein Ladebefehl tritt einen Zyklus vor einem R-Typ-Befehl in IF ein. Welcher Konflikt entstünde, wenn nur der R-Typ-Befehl MEM überspränge und direkt von EX nach WB ginge?
  1. Beide benötigten im selben Zyklus den Datenspeicher.
  2. Der Ladebefehl erreichte EX nach dem R-Typ-Befehl.
  3. Der R-Typ-Befehl läse Register vor der Dekodierung.
  4. Beide Befehle nutzten WB im selben Zyklus.
Antwort zeigenAntwort ausblenden
Antwort: D
Der Ladebefehl belegt WB in Zyklus 5. Der folgende R-Typ-Befehl erreicht EX in Zyklus 4, sodass er beim Überspringen von MEM ebenfalls WB in Zyklus 5 belegte. Der Konflikt liegt am einzigen Registerschreibport; der arithmetische Befehl benötigt den Datenspeicher nicht.

Frage 10 von 10

Führe mit vollständiger Datenweiterleitung nach EX ld x21, 0(x25); add x22, x21, x3; or x24, x6, x7; sub x23, x22, x4 aus. OR ist unabhängig, und Sprung- und Strukturkonflikte treten nicht auf. In welchem Zyklus tritt die letzte Subtraktion in EX ein?
  1. 6
  2. 7
  3. 8
  4. 9
Antwort zeigenAntwort ausblenden
Antwort: B
Das Load-Use-Paar hält den add-Befehl bis einschließlich Zyklus 4 in ID, sodass er in Zyklus 5 in EX eintritt. Das unabhängige OR tritt dann in Zyklus 6 in EX ein und die Subtraktion in Zyklus 7 in EX. Sie kann x22 aus MEM/WB erhalten; würde diese spätere RAW-Abhängigkeit als weiterer Load-Use-Stillstand behandelt, würde sie unnötig verzögert.
Set 2: Verfolge Werte und Steuersignale10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welche Schaltung bewahrt die Befehlsadresse zwischen Taktzyklen?
  1. Der Direktoperandengenerator
  2. Der Sprungzieladdierer
  3. Der Befehlszähler
  4. Der ALU-Multiplexer
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Woher stammt bei sd x14, 40(x9) der Wert, der in den Speicher geschrieben wird?
  1. Der Wert in x14
  2. Der Wert in x9
  3. Der Direktoperand 40
  4. Die Adressausgabe der ALU
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Bei PC 640 wird ld x12, -16(x8) mit x8 = 2080 und dem Doppelwortwert −6 an Adresse 2064 ausgeführt. Welche Werte haben x12 und der PC nach dem Abschluss?
  1. x12 = 2064; PC = 644
  2. x12 = −6; PC = 624
  3. x12 = 2080; PC = 644
  4. x12 = −6; PC = 644
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein beq x16, x17, -24 an Adresse 880 vergleicht zwei Register, die beide 11 enthalten. Welche Adresse wird als Nächstes geholt?
  1. 860
  2. 856
  3. 884
  4. 904
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Warum kann MemtoReg bei beq ein Don't-Care-Wert sein?
  1. MemRead ist 0, daher wird jeder Steuerwert ignoriert.
  2. RegWrite ist 0, daher wird der von MemtoReg ausgewählte Wert ignoriert.
  3. Branch ist 1, daher wird der Registersatz überschrieben.
  4. Zero ist 1, daher sind beide Rückschreibeingänge identisch.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Befehl hat den R-Typ-Operationscode, funct3 000 und Bit 30 = 1. Welches ALUOp und welchen ALU-Steuercode erzeugt dieser Entwurf?
  1. ALUOp 01; ALU-Steuercode 0110
  2. ALUOp 10; ALU-Steuercode 0010
  3. ALUOp 00; ALU-Steuercode 0010
  4. ALUOp 10; ALU-Steuercode 0110
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein 12-Bit-Direktoperand enthält 1111 1111 0000. Welchen vorzeichenbehafteten Wert muss ImmGen dem 64-Bit-Datenpfad liefern?
  1. −16
  2. 4080
  3. −15
  4. 240
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Bei einem Einzyklus-ld x15, 32(x18) gilt x18 = 3000 und der Speicher an Adresse 3032 enthält 77. Ein Steuerfehler ändert nur MemtoReg von 1 auf 0. Der nächste Befehl ist sd x15, 48(x18). Welchen Wert schreibt dieser Speicherbefehl und wohin?
  1. 77 an Adresse 3048
  2. 3032 an Adresse 3032
  3. 3032 an Adresse 3048
  4. 77 an Adresse 3080
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein bedingter Sprung bei PC 1200 vergleicht gleiche Registerwerte. Sein rekonstruierter vorzeichenbehafteter Byteoffset ist −32, aber ein fehlerhafter Sprungpfad verschiebt diesen vollständigen Offset vor der Addition ein weiteres Mal nach links. Welcher nächste PC-Wert ergibt sich und wie hätte er lauten müssen?
  1. 1168 statt 1136
  2. 1136 statt 1168
  3. 1140 statt 1172
  4. 1264 statt 1232
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Entwickler ergänzt unter dem bestehenden R-Typ-Operationscode eine unterstützte bitweise R-Typ-Operation. Ihre Datenwege und Schreibzugriffe auf Speicherelemente entsprechen denen anderer R-Typ-Operationen, und die ALU implementiert sie bereits. Welche Änderung der Dekodierung ist nötig?
  1. Die ALU-Funktionsdekodierung erweitern.
  2. Eine neue Operationscode-Steuerzeile ergänzen.
  3. Die Steuerzeile des Ladebefehls wiederverwenden.
  4. MemtoReg auf Auswahl des Speichers setzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Wähle Operanden und plane Befehle um Ladebefehle herum10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welche Abhängigkeit verbindet sub x11, x2, x3 mit dem späteren Befehl and x12, x11, x4?
  1. WAR über x11
  2. WAW über x11
  3. RAW über x12
  4. RAW über x11
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Sowohl EX/MEM als auch MEM/WB enthalten vorliegende Ergebnisse zum Schreiben in dasselbe von null verschiedene Quellregister. Welches Ergebnis muss die Weiterleitungseinheit auswählen?
  1. MEM/WB
  2. EX/MEM
  3. Den alten ID/EX-Wert
  4. Den Wert des Direktoperandengenerators
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Ladebefehl in EX erzeugt x19 und der Befehl in ID liest x19. Welche Aktionen setzen den nötigen Load-Use-Stillstand um?
  1. PC und IF/ID halten; eingehende ID/EX-Steuersignale auf null setzen.
  2. ID/EX und EX/MEM halten; PC und IF/ID weiterlaufen lassen.
  3. IF/ID leeren und jedes ältere Pipelineregister halten.
  4. PC weiterlaufen lassen; Ladesteuersignale nach ID/EX kopieren.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Befehl würde x0 schreiben und wird unmittelbar von add x18, x0, x7 gefolgt. Das frühere ALU-Ergebnis ist nicht null. Welchen Wert sollte der add-Befehl für seinen ersten Operanden verwenden?
  1. ALU-Ergebnis
  2. Die Zahl 18
  3. Null aus x0
  4. Alte x18-Daten
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Führe mit vollständiger Datenweiterleitung add x9, x1, x2; add x9, x9, x3; sub x11, x9, x4 aus. Dabei gelten x1 = 6, x2 = 7, x3 = 9 und x4 = 5. Welchen Wert erzeugt die Subtraktion und welches Pipelineregister liefert ihren x9-Wert?
  1. 8; x9 aus MEM/WB
  2. 17; x9 aus MEM/WB
  3. 17; x9 aus EX/MEM
  4. 26; x9 aus EX/MEM
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Auf add x16, x5, x6 folgt unmittelbar sd x16, 56(x20). Die Pipeline leitet Speicherdaten vor der ALUSrc-Auswahl weiter. Wie erhält der Speicherbefehl seine Daten?
  1. ForwardB liefert das add-Ergebnis; ALUSrc wählt weiterhin 56.
  2. ALUSrc muss x16 wählen; die Adresse enthält daher keinen Offset.
  3. Der Speicherbefehl muss warten, bis x16 zurückgeschrieben ist.
  4. ForwardA liefert x16 statt x20 als Basisadresse.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Betrachte ld x6, 0(x20); add x7, x6, x8; ld x9, 16(x20); sub x10, x9, x11. Kein anderer Befehl ändert x20, x8 oder x11, und beide Lesezugriffe sind zulässig. Welche Reihenfolge beseitigt beide Load-Use-Stillstände und erhält die Ergebnisse?
  1. add x7; ld x6; ld x9; sub x10
  2. ld x6; ld x9; add x7; sub x10
  3. ld x6; add x7; sub x10; ld x9
  4. ld x9; sub x10; ld x6; add x7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die Folge lautet ld x5, 0(x20); add x6, x5, x7; sd x6, 8(x20); ld x8, 8(x20). Warum ist es unzulässig, den letzten Ladebefehl an die zweite Stelle zu verschieben, selbst wenn er die Load-Use-Lücke füllt?
  1. Dadurch entstünde ein WAR-Hardwarekonflikt bei x8.
  2. Dadurch schrieben beide Ladebefehle dasselbe Register.
  3. Dadurch änderte sich der Byteoffset des ersten Ladebefehls.
  4. Dadurch würde der Speicher vor seiner Aktualisierung gelesen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Registerabhängigkeit schränkt bei add x5, x6, x7; sub x6, x8, x9 das Vertauschen der Befehle ein?
  1. WAR über x6
  2. RAW über x6
  3. WAW über x5
  4. RAW über x8
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Führe mit vollständiger Datenweiterleitung ld x12, 0(x26); add x13, x12, x2; ld x14, 8(x26); sub x15, x14, x13; sd x15, 24(x26) aus. Speicherdaten werden vor ALUSrc weitergeleitet, und es gibt keine weiteren Konflikte. Wie viele Zyklen werden bis einschließlich des letzten WB-Platzes benötigt?
  1. 9
  2. 10
  3. 11
  4. 12
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Stelle das Holen wieder her und verfolge den Sprungverlauf10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Warum eignet sich ein RISC-V-Befehl aus lauter Nullen nicht als Ersatz für einen nop?
  1. Es ist eine ungültige Befehlskodierung.
  2. Es ist die Kodierung eines genommenen Sprungs.
  3. Es ist die Kodierung eines Speicherbefehls an Adresse null.
  4. Es ist ein gültiger Befehl, der x0 ungleich null schreibt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein sättigender 2-Bit-Sprungzähler ist in Zustand 0. Welcher Zustand folgt auf ein weiteres Ergebnis „nicht genommen“?
  1. 1
  2. 2
  3. 0
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein genommener Sprung bei PC 960 hat den Byteoffset −40. Er wird in Zyklus 1 geholt und am Ende von EX entschieden; vorhergesagt wird „nicht genommen“. Welche Adressen werden vor dem Holen am Ziel verworfen?
  1. 920 und 924
  2. 964 und 968
  3. 960 und 964
  4. 968 und 972
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein 2-Bit-Sättigungszähler beginnt in Zustand 2 und sieht die Ergebnisse nicht genommen, nicht genommen, genommen, genommen, nicht genommen. Wie viele Vorhersagen sind falsch und wie lautet der Endzustand?
  1. 3 falsch; Endzustand 1
  2. 4 falsch; Endzustand 2
  3. 2 falsch; Endzustand 0
  4. 4 falsch; Endzustand 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Die Holstufe sagt einen Sprung als genommen voraus, aber bis zur Dekodierung ist keine Zieladresse verfügbar. Welche zusätzliche Struktur kann während IF ein zuvor gesehenes Ziel liefern?
  1. Ein Richtungsverlaufsbit
  2. Eine Konflikterkennungseinheit
  3. Ein Sprungzielpuffer
  4. Ein Rückschreibmultiplexer
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Bei geeigneter Datenweiterleitung nach ID folgt auf ld x18, 0(x22) unmittelbar ein bedingter Sprung, der x18 vergleicht. Der Sprung wird in ID entschieden. Wie viele Zyklen muss der Vergleich gegenüber einem Ablauf ohne Operandenwartezeit warten und warum?
  1. 1 Zyklus; die übliche Weiterleitung nach EX erreicht den Vergleich rechtzeitig.
  2. 2 Zyklen; die geladenen Daten müssen den früheren Vergleich in ID erreichen.
  3. 0 Zyklen; das Registerlesen in ID umgeht den Speicherzugriff.
  4. 3 Zyklen; ein Ladebefehl benötigt nach WB einen separaten Zyklus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein wiederholt aufgerufener Schleifensprung wird pro Aufruf fünfmal genommen und beim Verlassen einmal nicht genommen. Wie vergleichen sich ohne Aliasing und nach dem Einlernen im eingeschwungenen Zustand die Genauigkeiten des 1-Bit- und des 2-Bit-Prädiktors?
  1. Ein Bit: 4/6; zwei Bits: 5/6
  2. Ein Bit: 5/6; zwei Bits: 5/6
  3. Ein Bit: 4/6; zwei Bits: 4/6
  4. Ein Bit: 5/6; zwei Bits: 6/6
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Auf einen ungültigen Befehl folgt ein jüngerer Speicherbefehl, während zwei ältere arithmetische Befehle noch abgeschlossen werden. Welchen Zustand muss eine präzise Ausnahme der Behandlungsroutine zeigen?
  1. Keines der älteren Ergebnisse vorhanden; jüngerer Speicherzugriff fehlt.
  2. Beide älteren Ergebnisse vorhanden; jüngerer Speicherzugriff vorhanden.
  3. Nur der jüngere Speicherzugriff vorhanden; ältere Ergebnisse fehlen.
  4. Beide älteren Ergebnisse vorhanden; jüngerer Speicherzugriff fehlt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein 2-Bit-Zähler beginnt in Zustand 1 vor einem streng zwischen genommen und nicht genommen wechselnden Muster. Welche Vorhersagegenauigkeit erreicht er bei den ersten sechs Ergebnissen?
  1. 50%
  2. 0%
  3. 67%
  4. 100%
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Zwei Sprünge teilen sich einen 2-Bit-Zähler, der anfangs in Zustand 3 ist. Sprung A wird genommen, B nicht genommen, A genommen und B nicht genommen. Wie viele Fehlvorhersagen treten auf und welcher Sprung verursacht sie?
  1. 2 Fehlvorhersagen, beide bei B
  2. 1 Fehlvorhersage, nur bei B
  3. 2 Fehlvorhersagen, je eine bei beiden
  4. 3 Fehlvorhersagen, zwei bei B
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Kombiniere Pipelinezeiten und Konfliktkosten10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welche Größe vergleicht bei gleicher Befehlsanzahl die Ausführungszeit pro Befehl zwischen Prozessoren mit unterschiedlichen Takten?
  1. CPI-Wert ÷ Taktperiode
  2. CPI-Wert × Taktperiode
  3. Taktfrequenz × CPI-Wert
  4. Befehlsanzahl ÷ CPI-Wert
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

In einer langen Befehlsfolge sind 30 % Ladebefehle und 20 % davon haben einen unmittelbaren Verbraucher, der einen Stillstandszyklus benötigt. Wie hoch ist der Load-Use-Beitrag zum CPI-Wert?
  1. 0,06
  2. 0,20
  3. 0,30
  4. 0,50
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine lange Befehlsfolge enthält 30 % Ladebefehle, auf 20 % davon folgen unmittelbare Verbraucher, und 20 % bedingte Sprünge, von denen 15 % falsch vorhergesagt werden. Jedes Load-Use-Ereignis kostet einen Zyklus und jede Fehlvorhersage drei. Die Kosten überlappen sich nicht. Wie lange benötigen 400 Millionen Befehle bei 2 GHz?
  1. 0,212 s
  2. 0,290 s
  3. 0,460 s
  4. 0,230 s
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Zwei Prozessoren führen dasselbe lange Programm aus. A hat eine Periode von 300 ps, Load-Use-Kosten von 0,08 Zyklen pro Befehl, einen Sprunganteil von 0,20, 10 % Sprungfehler und eine Korrekturverzögerung von zwei Zyklen. B hat eine Periode von 240 ps, dieselben Load-Use-Kosten und denselben Sprunganteil, 20 % Sprungfehler und eine Korrekturverzögerung von vier Zyklen. Die Kosten überlappen sich nicht. Welcher ist schneller und ungefähr um welchen Faktor?
  1. A, etwa 1,13-mal so schnell
  2. B, etwa 1,25-mal so schnell
  3. B, etwa 1,13-mal so schnell
  4. A, etwa 1,11-mal so schnell
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Einzyklusentwurf benötigt 800 ps pro Befehl. Eine fünfstufige Version benötigt 200 ps pro Zyklus und führt eine kurze Folge mit zwei Stillständen und ohne Sprungverluste aus. Was ist die kleinste positive Befehlsanzahl, bei der die Pipeline echt schneller ist?
  1. 3 Befehle
  2. 2 Befehle
  3. 4 Befehle
  4. 6 Befehle
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine lange Befehlsfolge enthält 25 % bedingte Sprünge und davon unabhängige Stillstandskosten von 0,05 Zyklen pro Befehl. Ein neuer Prädiktor erhöht die Sprunggenauigkeit von 80 % auf 92 %, bei gleicher Korrekturverzögerung von drei Zyklen und gleicher Taktperiode. Wie groß ist der Speedup der Ausführung?
  1. 1,120-fach
  2. 1,136-fach
  3. 1,081-fach
  4. 1,250-fach
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine zulässige Änderung der Befehlsplanung beseitigt zwei Load-Use-Stillstände aus einer fünfstufigen Folge von sechs Befehlen ohne weitere Verluste. Wie ändert sich die Gesamtzeit bei einer Periode von 250 ps?
  1. 2000 ps werden zu 1500 ps
  2. 2500 ps werden zu 2000 ps
  3. 3500 ps werden zu 3000 ps
  4. 3000 ps werden zu 2500 ps
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Zwei Entwürfe führen eine lange Folge mit vielen bedingten Sprüngen aus: 30 % sind Sprünge, weitere Konflikte gibt es nicht. Die Vorhersage „nicht genommen“ ist zu 60 % richtig. X entscheidet am Ende von EX bei einer Periode von 200 ps; Y entscheidet am Ende von ID bei einer Periode von 220 ps und ohne Operandenstillstände. Welcher Entwurf hat die kürzere Zeit pro Befehl?
  1. X mit 248 ps
  2. Y mit 246,4 ps
  3. X mit 224 ps
  4. Y mit 272,8 ps
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Prozessor mit Mehrfachausgabe erreicht dauerhaft IPC 2. Welcher durchschnittliche CPI-Wert entspricht dieser Rate?
  1. 1
  2. 2
  3. 0,5
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein fünfstufiger Prozessor hat grundlegende Load-Use-Kosten von 0,09 Zyklen pro Befehl und 18 % bedingte Sprünge. Sein langfristig gemessener CPI-Wert beträgt 1,18. Alle übrigen verlorenen Zyklen stammen aus Sprungfehlvorhersagen mit einer Korrekturverzögerung von drei Zyklen. Welche Genauigkeit der Sprungvorhersage ergibt sich daraus?
  1. Etwa 95,0 %
  2. Etwa 66,7 %
  3. Etwa 50,0 %
  4. Etwa 83,3 %
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

72 Schlüsselbegriffe, jeweils mit Definition

A

Aliasing
Aliasing entsteht, wenn verschiedene Sprungadressen denselben Eintrag der Vorhersagetabelle auswählen und ihre Aktualisierungen sich gegenseitig stören.
Ein meist genommener Sprung kann den gemeinsamen Eintrag stören, den ein meist nicht genommener Sprung nutzt.
ALU-Steuercode
Der ALU-Steuercode ist der 4-Bit-Code, der in dieser Implementierung die konkrete arithmetische oder bitweise Operation der ALU auswählt.
Der Code 0110 wählt die Subtraktion, während der verwandte Code 0010 die Addition wählt.
ALUOp
ALUOp ist ein 2-Bit-Signal für die Befehlsklasse, das der ALU-Steuerung vorgibt, zu addieren, zu subtrahieren oder die R-Typ-Funktionsfelder zu dekodieren.
ALUOp 00 wählt die Addition zur Adressbildung, obwohl funct3 eines Ladebefehls seine Speicherzugriffsgröße beschreibt.
ALUSrc
ALUSrc ist das Steuersignal, das den zweiten ALU-Operanden auswählt: In diesem Entwurf wählt 0 einen Registerwert und 1 einen Direktoperanden.
Ein Speicherbefehl setzt ALUSrc auf 1, während sein rs2-Wert getrennt zum Speicher läuft.
Ausführungszeit
Die Ausführungszeit ist die verstrichene Programmzeit, die aus Befehlsanzahl, durchschnittlichem CPI-Wert und Taktperiode des Prozessors berechnet wird.
Dieselbe Befehlsanzahl kann bei höherem CPI-Wert schneller abgeschlossen werden, wenn die Taktperiode ausreichend kürzer ist.
Ausgabeabhängigkeit
Eine Ausgabeabhängigkeit entsteht, wenn zwei Befehle dasselbe Register schreiben und deshalb die Reihenfolge ihrer Schreibzugriffe im Programm bedeutsam ist.
Das Vertauschen zweier Schreibzugriffe auf x12 kann den Wert ändern, den nachfolgende Befehle sehen.

B

Befehlsplanung
Befehlsplanung ordnet Befehle um und erhält dabei die Programmergebnisse. Sie setzt unabhängige Arbeit in Intervalle, in denen sonst gewartet würde.
Wird ein unabhängiger Ladebefehl zwischen einen anderen Ladebefehl und dessen Verbraucher verschoben, kann eine Load-Use-Verzögerung entfallen.
Befehlszähler
Der Befehlszähler ist ein Zustandsregister, das die Adresse enthält, mit der der aktuelle Befehl aus dem Befehlsspeicher geholt wird.
Nach einem gewöhnlichen 4-Byte-Befehl an Adresse 720 wird der Befehlszähler auf 724 erhöht.

D

Datenkonflikt
Ein Datenkonflikt entsteht, wenn ein Befehl einen Punkt erreicht, an dem er einen Wert benötigt, bevor ein früherer Befehl ihn verfügbar gemacht hat.
Ohne Datenweiterleitung kann ein Verbraucher in ID einen veralteten Wert lesen, bevor sein Erzeuger WB erreicht.
Datenpfad
Der Datenpfad ist die Hardware, die beim Holen von Befehlen, bei Registerzugriffen, Berechnungen und Speicherzugriffen Werte hält und verändert.
Ein arithmetischer Befehl sendet zwei Registerwerte durch den Datenpfad und gibt ein ALU-Ergebnis zurück.
Datenweiterleitung
Datenweiterleitung führt einen erzeugten Wert aus einem Pipelineregister direkt an den Eingang eines späteren Befehls, bevor er in den architektonischen Zustand zurückgeschrieben wird.
Eine unmittelbar folgende Subtraktion kann das neue Ergebnis eines add-Befehls ohne Stillstand aus EX/MEM erhalten.
Direktoperandengenerator
Ein Direktoperandengenerator setzt die Bits des Direktoperanden für ein Befehlsformat zusammen und erweitert den vorzeichenbehafteten Wert auf Registerbreite.
Bei einem Speicherbefehl kombiniert ImmGen Bits aus zwei Teilen des Befehls, um seinen Offset wiederherzustellen.
Don't-Care-Wert
Ein Don't-Care-Wert ist ein Wert in einer Steuertabelle, der 0 oder 1 sein kann, weil die gewählte Einstellung das Verhalten des Befehls nicht beeinflussen kann.
MemtoReg kann bei beq ein Don't-Care-Wert sein, weil kein Register geschrieben wird.
Doppelwort
Ein Doppelwort ist eine 64 Bit große Dateneinheit, die 8 Bytes belegt und durch die RV64-Befehle ld und sd übertragen wird.
Doppelwörter an aufeinanderfolgenden ausgerichteten Adressen könnten bei 2048, 2056 und 2064 beginnen.
Durchsatz
Der Durchsatz ist die Anzahl der pro Zeiteinheit abgeschlossenen Befehle. Er steigt, wenn nützliche Befehlsarbeit überlappt.
Eine gefüllte konfliktfreie Pipeline kann nach ihrem anfänglichen Füllen in jedem Zyklus einen Befehl abschließen.
Dynamische Sprungvorhersage
Die dynamische Sprungvorhersage nutzt während der Ausführung beobachtete Sprungergebnisse, um den Zustand für zukünftige Richtungsvorhersagen zu aktualisieren.
Die wiederholt genommenen Sprünge einer Schleife trainieren den Prädiktor vor dem ungewöhnlichen Verlassen mit „nicht genommen“.

E

Echte Datenabhängigkeit
Eine echte Datenabhängigkeit verbindet einen späteren Registerlesezugriff mit einem früheren Schreibzugriff, der den für das Lesen benötigten Wert erzeugt.
Folgt auf einen add-Befehl eine Subtraktion, die sein Ergebnis liest, hängt die Subtraktion von add ab.
Effektive Adresse
Eine effektive Adresse ist die für einen Lade- oder Speicherbefehl berechnete Speicheradresse. Sie entsteht durch Addition des Basisregisterwerts und des vorzeichenbehafteten Byteoffsets.
Bei ld x4, 24(x8) mit x8 = 2000 ist die effektive Adresse 2024.
Effektiver CPI-Wert
Der effektive CPI-Wert ist die durchschnittliche Anzahl der Zyklen pro Befehl einschließlich der zusätzlichen Zyklen, die durch Konflikte und Sprungkorrekturen verloren gehen.
Eine lange Befehlsfolge mit Einfachausgabe und 0,12 verlorenen Zyklen pro Befehl hat einen effektiven CPI-Wert von 1,12.
EX/MEM
EX/MEM ist das Pipelineregister, das das Ausführungsergebnis, Speicherdaten, die Zielregisternummer sowie noch benötigte Speicher- und Rückschreibsteuersignale weitergibt.
Ein arithmetisches Ergebnis in EX/MEM kann an die EX-Eingänge des nächsten Befehls weitergeleitet werden.

F

Festverdrahtetes Steuerwerk
Ein festverdrahtetes Steuerwerk ist eine Implementierung mit kombinatorischer Logik, die Befehlsbits in Datenpfadauswahlen und Schreibfreigaben übersetzt.
Der Operationscode eines Ladebefehls erzeugt eine Steuerzeile, die einen Direktoperanden auswählt und das Speicherlesen sowie das Registerschreiben freigibt.
ForwardA
ForwardA steuert den rs1-Weiterleitungsmultiplexer: In diesem Entwurf wählt 00 ID/EX, 10 EX/MEM und 01 MEM/WB.
Ein kürzlich aktualisierter Basisregisterwert eines Ladebefehls kann für dessen Adressberechnung weitergeleitet werden.
ForwardB
ForwardB steuert den rs2-Weiterleitungsmultiplexer, der vor der ALUSrc-Auswahl einen Registeroperanden und den Speicherdatenpfad versorgt.
Ein Speicherbefehl kann seine Daten weitergeleitet bekommen, während ALUSrc einen Direktoperanden für die Adressberechnung auswählt.
Füllen der Pipeline
Das Füllen der Pipeline ist das anfängliche Intervall, in dem aufeinanderfolgende Befehle eintreten und noch nicht alle Stufen nützliche Arbeit enthalten.
Der erste Befehl erreicht WB in Zyklus 5, nachdem die anfänglichen Stufen gefüllt wurden.
Funktionsfeld
Ein Funktionsfeld liefert Befehlsbits, die Operationen mit demselben Operationscode unterscheiden, etwa funct3 und funct7 bei R-Typ-Befehlen.
Bei add und sub mit funct3 000 wählt Befehlsbit 30, welche arithmetische Operation ausgeführt wird.

G

Gegenabhängigkeit
Eine Gegenabhängigkeit entsteht, wenn ein späterer Befehl ein Register schreibt, das ein früherer Befehl zuerst lesen muss.
Wird der spätere schreibende Befehl vor den lesenden verschoben, kann sich das Programm ändern, obwohl die Pipeline in Programmreihenfolge arbeitet.

I

ID/EX
ID/EX ist das Register, das dekodierte Operanden, Registernummern, Direktoperand, Funktionsinformation und Steuersignale in die Ausführungsstufe weitergibt.
EX kombiniert das mitgeführte ALUOp mit den mitgeführten Funktionsbits, um eine R-Typ-Operation auszuwählen.
IF/ID
IF/ID ist das Pipelineregister zwischen dem Holen und der Dekodierung. Es bewahrt den geholten Befehl und seinen zugehörigen PC-Wert.
Bei einem Load-Use-Stillstand ermöglicht das Festhalten von IF/ID, den wartenden Verbraucher erneut zu dekodieren.
IPC
IPC bezeichnet Befehle pro Taktzyklus und misst die durchschnittliche Anzahl abgeschlossener Befehle pro Taktzyklus. Der IPC-Wert ist der Kehrwert des durchschnittlichen CPI-Werts.
Mehrfachausgabe kann genügend unabhängige Arbeit abschließen, um einen IPC-Wert größer als eins zu erreichen.

K

Kombinatorisches Schaltungselement
Ein kombinatorisches Schaltungselement ist eine Schaltung, deren Ausgabe von ihren aktuellen Eingaben abhängt, ohne einen Wert zwischen Taktzyklen zu speichern.
Ein Addierer berechnet seine Ausgabe bei einer Eingabeänderung neu, bevor ein Register die Summe übernimmt.
Konflikterkennungseinheit
Eine Konflikterkennungseinheit erkennt Fälle, die einen Stillstand benötigen, darunter einen Ladebefehl in EX, dessen Zielregister vom Befehl in ID gelesen wird.
Eine genaue Prüfung der verwendeten Quellen verhindert, dass Direktoperandenbits eines I-Typ-Befehls als zweites Quellregister behandelt werden.
Korrelierender Prädiktor
Ein korrelierender Prädiktor nutzt neben dem lokalen Verlauf eines Sprungs auch jüngste Ergebnisse anderer Sprünge, um eine Richtung vorherzusagen.
Eine Entscheidung kann leichter vorherzusagen sein, wenn das Ergebnis eines früheren Sprungs zeigt, welcher Pfad genommen wurde.
Kritischer Pfad
Ein kritischer Pfad ist der längste benötigte kombinatorische Pfad zwischen Zustandsgrenzen. Er begrenzt, wie kurz die Taktperiode sein kann.
In einem Einzyklusentwurf bestimmt der Ladepfad den Takt, selbst wenn ein kürzerer add-Befehl ausgeführt wird.

L

Latenz
Die Latenz ist die Gesamtlaufzeit eines einzelnen Befehls vom Eintritt bis zum Abschluss, einschließlich aller Stufen, die er durchläuft.
Fünf Stufenintervalle zu je 270 ps ergeben für einen Befehl eine Pipelinelatenz von 1350 ps.
Leeren der Pipeline
Das Leeren der Pipeline ist das abschließende Intervall, in dem zuvor geholte Befehle enden, nachdem der letzte Befehl der Folge eingetreten ist.
Der letzte Befehl benötigt nach seinem Holzyklus noch ID, EX, MEM und WB.
Load-Use-Konflikt
Ein Load-Use-Konflikt entsteht, wenn ein Befehl unmittelbar nach einem Ladebefehl dessen Ergebnis benötigt, bevor der Ladebefehl den Datenspeicher fertig gelesen hat.
Mit Datenweiterleitung nach EX wartet der Verbraucher einen Zyklus und übernimmt dann die Daten aus MEM/WB.

M

Mehrfachausgabe
Mehrfachausgabe startet mehr als einen Befehl pro Taktzyklus. Der Compiler oder die Hardware wählt dabei Arbeit aus, die überlappt werden kann.
Statische Mehrfachausgabe beruht auf Compilergruppen; bei dynamischer Ausgabe wählt die Hardware die Befehle.
MEM/WB
MEM/WB ist das Pipelineregister, das Speicherdaten, das ALU-Ergebnis, die Zielregisternummer und die zum Zurückschreiben in den Registersatz benötigten Steuersignale enthält.
Ein wartender Verbraucher eines Ladeergebnisses kann seinen Operanden aus dem in MEM/WB gehaltenen Wert beziehen.
MemRead
MemRead ist das Steuersignal, das einen Lesezugriff auf den Datenspeicher anfordert, sodass ein Ladebefehl Daten von seiner effektiven Adresse abrufen kann.
Das Holen aus dem Befehlsspeicher ist vom durch MemRead gesteuerten Zugriff auf den Datenspeicher getrennt.
MemtoReg
MemtoReg wählt den Wert zum Zurückschreiben in den Registersatz: In diesem Entwurf wählt 0 das ALU-Ergebnis und 1 die Datenspeicherausgabe.
Ein Ladebefehl mit fälschlich auf 0 gesetztem MemtoReg würde seine Adresse statt der geladenen Daten schreiben.
MemWrite
MemWrite ist das Steuersignal, das einen Schreibzugriff auf den Datenspeicher freigibt, sodass der Speicherwert an der Taktflanke an der effektiven Adresse abgelegt wird.
Ein arithmetischer Befehl muss MemWrite auf 0 halten, um unbeabsichtigte Speicheränderungen zu verhindern.
Multiplexer
Ein Multiplexer ist eine Schaltung, die abhängig von einem Auswahlsignal einen von mehreren Dateneingängen an einen Ausgang weiterleitet.
Der Rückschreibmultiplexer wählt für einen Ladebefehl Speicherdaten und für einen arithmetischen Befehl das ALU-Ergebnis.

P

PCSrc
PCSrc wählt den nächsten PC-Wert; beim Einzyklusentwurf für Gleichheitssprünge ist es das logische AND von Branch und dem Zero-Flag der ALU.
Ein add-Befehl mit dem Ergebnis null nimmt trotzdem den sequenziellen Pfad, weil sein Branch-Signal 0 ist.
Pipeline-Flush
Ein Pipeline-Flush erklärt Arbeit in der Pipeline für ungültig, sodass Befehle auf dem falschen Pfad oder andere verworfene Befehle den architektonischen Zustand nicht ändern und keine Ausnahmen auslösen können.
Ein verworfener Speicherbefehl kann nicht mehr in den Speicher schreiben, nachdem ein genommener Sprung das Holen umgelenkt hat.
Pipeline-Stillstand
Ein Pipeline-Stillstand verzögert ausgewählte Arbeit in der Pipeline um einen Zyklus, damit ein Befehl auf einen Operanden oder eine andere benötigte Bedingung warten kann.
Bei einem Load-Use-Stillstand wartet jüngere Arbeit, während der Ladebefehl weiterläuft und den Wert erzeugt.
Pipeline-Zeitdiagramm
Ein Pipeline-Zeitdiagramm zeigt Befehle als Zeilen und Zyklen als Spalten und markiert die Stufe jedes Befehls im Zeitverlauf.
Beim Lesen der Spalte für Zyklus 5 kann in jeder der fünf Pipelinestufen ein Befehl stehen.
Pipelineblase
Eine Pipelineblase ist ein inaktiver Pipelineplatz, der weiterläuft, ohne die zustandsändernde Arbeit eines Befehls auszuführen.
Ein Load-Use-Stillstand setzt eine Pipelineblase in EX, während der Ladebefehl MEM durchläuft.
Pipelineregister
Ein Pipelineregister übernimmt die Daten und Steuersignale, die ein Befehl nach einer Stufe benötigt, und hält sie während des folgenden Zyklus verfügbar.
ID/EX bewahrt die Operanden eines dekodierten Befehls, während IF/ID einen jüngeren Befehl erhält.
Pipelineregister-Overhead
Der Pipelineregister-Overhead sind die zeitlichen Kosten für das Speichern und Bereitstellen von Stufenwerten, die zur Logikverzögerung der langsamsten Stufe hinzukommen.
Eine begrenzende Stufe mit 250 ps und 20 ps Register-Overhead benötigt eine Periode von 270 ps.
Pipelining
Pipelining überlappt Befehle, indem es ihre Ausführung in Stufen aufteilt, sodass verschiedene Befehle gleichzeitig verschiedene Stufen belegen können.
Während ein Befehl auf den Datenspeicher zugreift, kann ein jüngerer Befehl in der ALU rechnen.
Präzise Ausnahme
Eine präzise Ausnahme lässt alle älteren Befehle abgeschlossen und schließt die normalen Auswirkungen des auslösenden Befehls sowie alle Auswirkungen jüngerer Befehle aus.
Die Behandlungsroutine erhält den gespeicherten PC-Wert des auslösenden Befehls und die Ursache zusammen mit der Zustandsgrenze in Programmreihenfolge.

R

Registersatz
Ein Registersatz ist die Gesamtheit der architektonischen Register mit Lese- und Schreibports, die anhand ihrer Nummern auf die Register zugreifen.
Die beiden Leseports können einem arithmetischen Befehl die Werte von x6 und x7 liefern.
RegWrite
RegWrite ist das Freigabesignal, das erlaubt, das ausgewählte Ergebnis eines Befehls an der Taktflanke im Registersatz zu speichern.
Ein Speicherbefehl hält RegWrite auf 0, obwohl er Registerwerte für seine Adresse und Daten liest.
Rückadressstapel
Ein Rückadressstapel verfolgt Prozedurrücksprungadressen, sodass die Holstufe das Ziel eines Rücksprungs vor dessen regulärer Entscheidung vorhersagen kann.
Bei verschachtelten Aufrufen passen die Rücksprungziele zur umgekehrten Reihenfolge der Aufrufe.

S

Sättigungszähler
Ein Sättigungszähler ändert sich in Richtung seines oberen oder unteren Endwerts, ohne zum anderen Ende überzugehen. So bleibt die Sicherheit einer Vorhersage bestehen.
Ein Ergebnis „genommen“ lässt einen 2-Bit-Zähler bei 3, wenn er bereits auf „stark genommen“ steht.
Speicherabhängigkeit
Eine Speicherabhängigkeit verbindet Zugriffe, deren Reihenfolge wichtig ist, weil sie auf überlappende Bytes zugreifen können und mindestens einer der Zugriffe diese schreibt.
Ein Ladebefehl darf nicht vor einen Speicherbefehl verschoben werden, der möglicherweise die Bytes liefert, die er lesen soll.
Speicherelement
Ein Speicherelement ist ein Hardwarebaustein, der einen Wert über Zyklen hinweg bewahrt und ihn durch einen gesteuerten Schreibzugriff aktualisiert.
Der PC behält die aktuelle Befehlsadresse, während die nächste Adresse berechnet wird.
Sprungverlaufstabelle
Eine Sprungverlaufstabelle speichert kleine Vorhersagezustände, die anhand von Bits der Sprungadresse ausgewählt werden, sodass jüngstes Verhalten das Holen steuern kann.
Zwei Sprungadressen können denselben Eintrag auswählen, sodass der gespeicherte Zustand nicht nur zu einem Sprung gehören muss.
Sprungverzögerung
Eine Sprungverzögerung sind die durch das Warten auf einen Sprung oder durch dessen Korrektur verlorenen Zyklen. Sie hängt davon ab, wann das korrekte Holen fortgesetzt werden kann.
In einer fünfstufigen Pipeline gehen bei einer Entscheidung am Ende von EX durch eine Fehlvorhersage zwei Holplätze verloren.
Sprungziel
Ein Sprungziel ist die Befehlsadresse, die bei einem genommenen Sprung erreicht wird. Sie wird aus dem PC-Wert des Sprungbefehls und dem vorzeichenbehafteten Byteoffset berechnet.
Ein genommener Sprung an Adresse 600 mit Offset −20 lenkt das Holen von Befehlen auf Adresse 580.
Sprungzielpuffer
Ein Sprungzielpuffer speichert Zieladressen und liefert während des Holens ein vorhergesagtes Ziel, bevor der Sprung dekodiert wird.
Bei der Richtungsvorhersage „genommen“ kann ein BTB-Treffer ermöglichen, im nächsten Zyklus am vorhergesagten Ziel zu holen.
Statische Sprungvorhersage
Die statische Sprungvorhersage sagt die Sprungrichtung anhand einer festen Regel voraus, die während der Programmausführung nicht aus Ergebnissen lernt.
Die Regel „rückwärts genommen, vorwärts nicht genommen“ nutzt die Richtung des Sprungversatzes als Hinweis.
Steuerkonflikt
Ein Steuerkonflikt entsteht, wenn die Holstufe die nächste Befehlsadresse benötigt, bevor ein Sprung oder ein anderer Kontrollflusswechsel sie bestimmt hat.
Die Vorhersage „nicht genommen“ setzt das sequenzielle Holen fort, während ein Sprungvergleich noch in einer späteren Stufe stattfindet.
Strukturkonflikt
Ein Strukturkonflikt entsteht, wenn Befehle während desselben Taktzyklus dieselbe begrenzte Hardwareressource benötigen.
Ein Speicher mit einem Port kann nicht gleichzeitig den MEM-Zugriff eines Ladebefehls und das Holen eines anderen Befehls bedienen.
Superskalarer Prozessor
Ein superskalarer Prozessor wählt mithilfe von Hardware mehrere Befehle pro Zyklus aus und gibt sie aus, soweit verfügbare Ressourcen und Abhängigkeiten dies erlauben.
Sprungfehlvorhersagen und Ketten abhängiger Werte begrenzen, wie viel parallele Befehlsarbeit nützlich bleibt.

T

Taktflanke
Eine Taktflanke ist der aktive Taktübergang, an dem ein flankengesteuertes Speicherelement einen freigegebenen nächsten Wert übernimmt.
An der abschließenden Flanke eines add-Befehls erhält rd die Summe und der PC seine nächste Adresse.
Turnierprädiktor
Ein Turnierprädiktor wählt zwischen Vorhersageverfahren und entscheidet anhand ihres beobachteten Erfolgs, welchem er bei einem Sprung vertraut.
Ein Prädiktor kann zu einem Sprungmuster passen, während ein anderer bei einem anderen Muster besser abschneidet.

V

Vorzeichenerweiterung
Die Vorzeichenerweiterung erweitert einen vorzeichenbehafteten Binärwert, indem sie sein Vorzeichenbit in die hinzugefügten höherwertigen Stellen kopiert und so seinen Wert erhält.
Ein negativer 12-Bit-Ladeoffset bleibt negativ, nachdem ImmGen ihn auf die RV64-Registerbreite erweitert hat.

W

Weiterleitungseinheit
Eine Weiterleitungseinheit vergleicht Quell- und Zielregisternummern und prüft die Schreibfreigabe, um die richtige Quelle eines vorliegenden Operanden auszuwählen.
Sie schließt rd = x0 aus, weil ein berechnetes Ergebnis den Nullwert dieses Registers nicht ändern kann.

Z

Zero-Flag
Das Zero-Flag ist ein ALU-Ausgang, der 1 ist, wenn das berechnete Ergebnis null ist. So kann eine Subtraktion die Gleichheit von Registern prüfen.
Gleiche Operanden lassen die Subtraktion eines Sprungbefehls Zero = 1 erzeugen, sodass Branch das Ziel auswählen kann.
Zurückschreiben
Zurückschreiben ist die Übertragung des ausgewählten Ergebnisses eines Befehls in sein Zielregister, wenn der Registerschreibzugriff freigegeben ist.
Ein Ladebefehl schreibt den Speicherwert zurück, ein add-Befehl dagegen sein ALU-Ergebnis.
Zweistufige Dekodierung
Die zweistufige Dekodierung trennt die Hauptsteuerung für die Befehlsklasse vom kleineren Dekoder, der die konkrete ALU-Operation auswählt.
Das Hauptsteuerwerk gibt für add und sub ALUOp 10 aus; die Dekodierung der Funktionsbits unterscheidet sie anschließend.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten