-
Hintergrund
der Erfindung
-
1. Gebiet
der Erfindung
-
Diese
Erfindung betrifft das Gebiet der superskalaren Mikroprozessoren
und betrifft insbesondere eine Lade/Schreibeinheit bzw. eine Lade/Speichereinheit
und einen Datenzwischenspeicher bzw. einen Datencache-Speicher in
einem superskalaren Mikroprozessor.
-
2. Beschreibung des Stands
der Technik
-
Superskalare
Mikroprozessoren erreichen ein hohes Leistungsvermögen durch
das gleichzeitige Ausführen
mehrerer Befehle innerhalb eines Taktzyklus und durch Verwenden
des kürzest
möglichen
Taktzyklus, der mit dem Aufbau vereinbar ist. Im hierin verwendeten
Sinne bezeichnet der Begriff „Taktzyklus
oder Taktperiode" ein
Zeitintervall, während
welchem die Verarbeitungsstufen bzw. Pipelinestufen eines Mikroprozessors ihre
vorgesehenen Funktionen ausführen.
Am Ende eines Taktzyklus werden die entsprechenden Werte zur nächsten Pipelinestufe
weitergeleitet.
-
Da
superskalare Mikroprozessoren mehrere Befehle pro Taktzyklus ausführen und
der Taktzyklus kurz ist, ist ein Speichersystem mit hoher Bandbreite
erforderlich, um Befehle und Daten für den superskalaren Mikroprozessor
bereitzustellen (d. h. ein Speichersystem, das eine große Anzahl
an Bytes in einer kurzen Zeitdauer bereitstellen kann). Ohne ein
Speichersystem mit großer
Bandbreite würde
der Mikroprozessor eine große
Anzahl an Taktzyklen damit verbringen, auf bereitzustellende Befehle
und Daten zu warten und er würde dann
die empfangenen Befehle und/oder die von den empfangenen Daten abhängigen Befehle
in einer relativ kleinen Anzahl an Taktzyklen abarbeiten. Das Gesamtleistungsverhalten
würde sich
auf Grund der großen
Anzahl an ungenutzte Taktzyklen verschlechtern. Jedoch sind superskalare
Mikroprozessoren typischerweise als Computersysteme mit einem großen Hauptspeicher
ausgebildet, der aus dynamischen Speicherzellen mit wahlfreiem Zugriff
(DRAM) aufgebaut ist. DRAM-Zellen
zeichnen sich durch Zugriffszeiten aus, die deutlich länger sind
als der Taktzyklus moderner superskalarer Mikroprozessoren. Ferner
bieten DRAM-Zellen typischerweisen einen relativ schmalen Ausgabebus,
um die gespeicherten Daten an den superskalaren Mikroprozessor auszugeben.
Daher stellen DRAM-Zellen ein Speichersystem bereit, das eine relativ
geringe Anzahl an Bytes in einer relativ langen Zeitdauer bereitstellen
kann und das damit kein Speichersystem mit großer Bandbreite bildet.
-
Da
superskalare Mikroprozessoren typischerweise nicht als ein Computersystem
ausgebildet sind, die ein Speichersystem mit ausreichender Bandbreite
zum kontinuierlichen Bereitstellen von Befehlen und Daten aufweisen,
sind superskalare Mikroprozessoren häufig mit Cache-Speichern bzw.
schnellen Zwischenspeichern versehen. Cache-Speicher sind mehrere
Blöcke
aus Speicherplätzen,
die auf dem gleichen Siliziumsubstrat wie der Mikroprozessor vorgesehen
sind oder in der Nähe
davon angeschlossen sind. Die Blöcke
aus Speicherplätzen
werden verwendet, um zuvor abgeholte Befehlsbytes oder Datenbytes
zu halten. Die Bytes können
von dem Cache-Speicher zum Ziel (Register oder eine Befehlsverarbeitungspipeline)
in rascher Weise übertragen
werden. Üblicherweise
werden ein oder zwei Taktzyklen benötigt, im Gegensatz zu einer
großen Anzahl
an Taktzyklen, um Bytes aus einem DRAM-Hauptspeichersystem zu übertragen.
-
Cache-Speicher
können
in einer „assoziativen" Struktur organisiert
sein. In einer assoziativen Struktur wird auf die Blöcke der
Speicherplätze
in Form eines zweidimensionalen Arrays mit Reihen und Spalten zugegriffen.
Wenn ein Cache-Speicher
nach Bytes durchsucht wird, die an einer Adresse angeordnet sind,
werden eine Anzahl von Bits aus der Adresse als ein „Index" für den Cache-Speicher
verwendet. Der Index wählt
eine spezielle Reihe oder Zeile innerhalb des zweidimensionalen
Arrays aus, und daher ist die Anzahl der Adressenbits, die für den Index
erforderlich ist, durch die Anzahl der Reihen, die in dem Cache-Speicher
vorgesehen sind, festgelegt. Die Adressen, die den Bytes zugeordnet
sind, die in den mehreren Blöcken
einer Reihe gespeichert sind, werden geprüft, um zu bestimmen, ob eine
der Adressen, die in der Reihe gespeichert ist, mit der angeforderten
Adresse übereinstimmt.
Wenn eine Übereinstimmung
erkannt wird, wird gesagt, dass der Zugriff ein „Treffer" ist, und der Cache-Speicher stellt
die zugehörigen
Bytes bereit. Wenn keine Übereinstimmung
ermittelt wird, wird der Zugriff als ein „Nichttreffer" bezeichnet. Wenn
ein Nichttreffer erkannt wird, werden die Bytes aus dem Speichersystem
in den Cache-Speicher übertragen.
Die Adressen, die den Bytes zugeordnet sind, die in dem Cache-Speicher
gespeichert sind, werden ebenso gespeichert. Diese gespeicherten Adressen
werden als „Markierungen" oder „Markierungsadressen" bezeichnet.
-
Die
Speicherblöcke,
die in einer Reihe angeordnet sind, bilden die Spalten der Reihe.
Jeder Speicherblock wird als ein „Weg" bezeichnet; mehrere Wege bilden eine
Reihe. Der Weg wird ausgewählt,
indem ein Wegewert zu dem Cache-Speicher bereitgestellt wird. Der
Wegewert wird bestimmt, indem die Markierungen für eine Reihe überprüft werden
und eine Übereinstimmung
zwischen einer der Markierungen und der angeforderten Adresse gefunden
wird. Ein Cache-Speicher, der mit einem einzelnen Weg pro Reihe
ausgebildet ist, wird als ein „direkt
zugeordneter bzw. abgebildeter Cache-Speicher" bezeichnet. In einem direkt zugeordneten Cache-Speicher
muss die Markierung untersucht werden, um zu bestimmen, ob ein Zugriff
ein Treffer ist; es ist jedoch die Untersuchung der Markierung nicht
erforderlich, um auszuwählen,
welche Bytes zu den Ausgängen
des Cache-Speichers übertragen
werden.
-
Sowohl
direkt zugeordnet als auch assoziative Cache-Speicher werden in
superskalaren Mikroprozessoren mit hoher Taktfrequenz (d. h. kurzen
Taktzyklen) eingesetzt. Für
beide Arten an Cache-Speichern kann ein einzelner Lesevorgang oder
ein einzelner Schreibvorgang in einem Taktzyklus ausgeführt werden,
wenn der Cache-Speicher mit einem einzelnen Anschluss bzw. Port
versehen ist. Selbst wenn der Cache-Speicher mit mehreren Anschlüssen bzw.
Ports versehen ist, kann im Allgemeinen der gleiche Speicherblock
nicht innerhalb des gleichen Taktzyklus ausgelesen und beschrieben
werden. Cache-Speicher sind große
Strukturen, die typischerweise den Hauptanteil (oder den gesamten)
Anteil eines Taktzyklus erfordern, um eine Leseoperation oder eine
Schreiboperation auszuführen,
auf Grund der großen
auftretenden Kapazitäten
und anderer gut bekannter Eigenschaften im Hinblick auf die Cache-Speicher-Arrays.
Des weiteren beinhaltet das Lesen und das Beschreiben der gleichen
Speicherstelle in einem Taktzyklus ein deutliches Vergrößern des
Arrays und damit auch ein Langsammachen des Arrays, wodurch die
Taktzyklusdauer und die Siliziumfläche eines superskalaren Mikroprozessors
beeinflusst werden.
-
Auf
Grund des Erfordernisses, dass eine Speicherstelle eines Cache-Speichers
nicht im gleichen Taktzyklus ausgelesen und beschrieben werden kann,
erfordern Schreibbefehle zwei Cache-Zugriffe für die Abarbeitung. Der erste
Cache-Zugriff liest den Cache-Speicher
aus, um zu prüfen,
ob die mit dem Schreibbefehl verknüpfte Adresse ein Treffer ist.
Wenn die Adresse ein Treffer ist, dann wird ein zweiter Zyklus verwendet, um
die Schreibdaten in den Cache-Speicher zu schreiben. Wenn die Adresse
ein Nichttreffer ist, werden die mit der Adresse verknüpften Bytes
in den Cache-Speicher übertragen.
Nachdem die Bytes übertagen
sind, greift der Schreibbefehl erneut auf den Cache- Speicher zu, um die
Schreibdaten in dem Cache-Speicher abzulegen. Eine Lösung des
Problems, das Schreibbefehle mindestens zwei Cache-Zugriffe erfordern,
ist daher wünschenswert.
-
Die
europäische
Patentanmeldung EP-A-0 0061 570 (IBM) offenbart eine Datenspeichereinheit
mit einem Datencache-Speicher mit Cache-Zeilen, die so verriegelt
werden können,
dass sie in dem Cache-Speicher erhalten bleiben, bis die Verriegelung
freigegeben wird.
-
Die
europäische
Patentanmeldung EP-A-0 436 092 (IBM) offenbart die Verwaltung von
Schreibanforderungen außerhalb
der Programmreihenfolge in einer Datenspeichereinheit.
-
Überblick über die
Erfindung
-
Die
zuvor dargestellten Probleme werden zum großen Teil durch eine Datenspeichereinheit
gelöst,
in der eine Lade/Schreib-Einheit und ein Datencache-Speicher gemäß der vorliegenden
Erfindung verwendet sind. Die Lade/Schreibeinheit ist mit einem
Lade/Schreib-Puffer mit einem geprüften Bit und einem Wegefeld für jede Pufferspeicherstelle
versehen. Für
Lade/Schreiboperationsbefehle wird das geprüfte Bit der Speicherstelle,
die den Schreibanteil des Befehls enthält, gesetzt, wenn der Ladebereich
bzw. Ladeanteil des Befehls auf den Datencache-Speicher zugreift
und diesen trifft. Ferner wird auch das Wegefeld der Speicherstelle
auf den Weg des Datencache-Speichers festgelegt, den der Ladebereich
trifft. Der Datencache-Speicher ist mit einem Verriegelungsmechanismus
für jede
Cache-Zeile, die in dem Datencache-Speicher gespeichert ist, versehen.
Wenn der Ladeanteil eines Lade/Schreibbefehls ausgeführt wird,
wird die zugehörige
Zeile verriegelt, so dass die Zeile in dem Datencache-Speicher verbleibt,
bis ein Schreibbefehl ausgeführt
wird. Auf diese Weise wird sichergestellt, dass der Schreibbereich
bzw. Schreibanteil des Lade/Schreiboperationsbefehls den Datencache-Speicher
in dem Weg trifft, der durch das Wegefeld, das mit dem Schreibanteil
verknüpft
ist, angegeben ist.
-
Die
Lade/Schreibeinheit und der Datencache-Speicher ermöglichen
die vorteilhafte Verringerung des Schreibanteils von Lade/Schreiboperationsbefehlen
von zwei Taktzyklen des Daten-Zugriffes auf einen einzelnen Taktzyklus
des Datencache-Zugriffes.
Das Leistungsverhalten eines superskalaren Mikroprozessors, in dem
eine derartige Datenspeichereinheit eingesetzt ist, kann verbessert
werden, indem mehr Datencache-Zugriffe in einer gegebenen Anzahl
an Taktzyklen ermöglicht
wird, in denen die Lade/Schreiboperationsbefehle ausgeführt werden.
-
Allgemein
gesagt, betrifft die vorliegende Erfindung eine Datenspeichereinheit
mit einer Lade/Schreibeinheit und einem Datencache-Speicher. Die
Lade/Schreibeinheit ist ausgebildet Lade- und Schreibbefehle auszuführen und
enthält
mehrere erste Speicherstellen, die ausgebildet sind, anhängige Schreibbefehle
und dazugehörige
Schreibdaten zu speichern. Jede der mehreren Speicherstellen ist
ausgebildet, ein geprüftes
Bit zu speichern. Der Datencache-Speicher ist mit der Lade/Schreib-Einheit
gekoppelt und enthält
mehrere zweite Speicherstellen, die ausgebildet sind, die Cache-Zeilen zu speichern.
Der Datencache-Speicher ist ausgebildet, eine in den mehreren zweiten
Speicherstellen gespeicherte Cache-Zeile zu verriegeln, so dass
die Cache-Zeile
in den mehreren Speicherstellen zumindest bis zu einem Taktzyklus
gespeichert bleibt, in welchem die Verriegelung freigegeben wird.
-
Die
vorliegende Erfindung betrifft ferner ein Verfahren zum Speichern
von Schreibdaten in einem Datencache-Speicher, ohne dass zuerst
der Datencache-Speicher nach einem Treffer in einer Adresse, die
mit den Schreibdaten verknüpft
ist, überprüft werden
muss. Das Verfahren umfasst das Speichern der Schreibdaten in dem
Datencache-Speicher während
eines ersten Taktzyklus, in welchem ein geprüftes Bit, das den Schreibdaten
zugeordnet ist, gesetzt wird.
-
Kurze Beschreibung
der Zeichnungen
-
Weitere
Aufgaben und Vorteile der Erfindung werden beim Studium der folgenden
detaillierten Beschreibung unter Bezugnahme auf die begleitenden
Zeichnungen deutlich, in denen:
-
1 eine
Blockansicht eines superskalaren Mikroprozessors ist mit einer Lade/Schreibeinheit
und einem Datencache-Speicher gemäß der vorliegenden Erfindung;
-
2 eine
Ansicht ist, die gewisse interne Komponenten der Lade/Schreib-Einheit
mit einem Lade/Schreibpuffer gemäß der vorliegenden
Erfindung zeigt;
-
3 eine
Ansicht der Bitfelder eines Speicherplatzes des Lade/Schreibpuffers
ist, der in 2 gezeigt ist;
-
4a eine
Ansicht eines Markierungseintrags für den Datencache-Speicher gemäß der vorliegenden Erfindung
ist; und
-
4b eine
Ansicht eines Datencache-Markierungsarrays mit Markierungseinträgen, die
in 4a gezeigt ist, wobei ein Rücksetzmechanismus für das Verriegelungsbit
des Markierungseintrags enthalten ist.
-
Obwohl
die Erfindung diversen Modifizierungen und alternativen Formen unterliegen
kann, sind dennoch spezielle Ausführungsformen hierin beispielhaft
in den Zeichnungen gezeigt und im Weiteren detailliert beschrieben.
Es sollte beachtet werden, dass die Zeichnungen und die detaillierte
Beschreibung davon nicht beabsichtigen, die Erfindung auf die spezielle
offenbarte Form einzuschränken,
sondern die Erfindung soll vielmehr alle Modifizierungen, Äquivalente
und Alternativen abdecken, die innerhalb des Grundgedankens und Schutzbereichs
der vorliegenden Erfindung, wie sie durch die angefügten Patentansprüche definiert
ist, liegen.
-
Detaillierte
Beschreibung der Erfindung
-
Es
sei zunächst
auf 1 verwiesen; es wird eine Blockansicht eines superskalaren
Mikroprozessors 200 mit einer Lade/Schreibeinheit 222 und
einem Datencache-Speicher 224 gemäß der vorliegenden Erfindung
gezeigt. Wie in der Ausführungsform
aus 1 dargestellt ist, umfasst der superskalare Mikroprozessor 200 eine
Vorabhol/Vordecodiereinheit 202 und eine Verzweigungsvorhersageeinheit 220,
die mit einem Befehlscache-Speicher 204 verbunden sind.
Die Befehlsausrichteinheit 206 ist zwischen dem Befehlscache-Speicher 204 und
mehreren Decodiereinheit 208a bis 208f (die gemeinsam
als Decodiereinheiten 208 bezeichnet werden) angeschlossen.
Jede Decodiereinheit 208a bis 208f ist mit einer
entsprechenden Reservierstation 210a bis 210f verbunden
(die gemeinsam als Reservierstationen 210 bezeichnet werden),
und jede Reservierstation 210a bis 210f ist mit
einer entsprechenden Funktionseinheit 212a bis 212f verbunden
(die gemeinsam als Funktionseinheiten 212 bezeichnet werden).
Die Decodiereinheiten 218, die Reservierstationen 210 und
die Funktionseinheiten 212 sind ferner mit einem Umordnungspuffer 216,
einer Registerdatei 218 und einer Lade/Schreibeinheit 222 verbunden.
Ein Datencache-Speicher 224 ist schließlich mit der Lade/Schreibeinheit 222 verbunden,
und eine MROM-Einheit 209 ist so gezeigt, dass diese mit
der Befehlsausrichteinheit 206 verbunden ist.
-
Allgemein
gesagt, ist der Befehlscache-Speicher 204 ein Hochgeschwindigkeitscache-Speicher, der vorgesehen
ist, um temporär
Schreibbefehle zu speichern, bevor diese an die Decodiereinheiten 208 ausgegeben
werden. In einer Ausführungsform
ist der Befehlscache-Speicher 204 ausgebildet, bis zu 32
Kilobytes an Befehlscodierung zwischenzuspeichern, die jeweils in
Zeilen aus 16 Bytes eingeteilt sind, wobei jedes Byte aus 8 Bits
besteht. Während
des Betriebs wird die Befehlscodierung dem Befehlscache-Speicher 204 zugeführt, indem
Codierung aus dem Hauptspeicher (nicht gezeigt) über die Vorabhol/Vordecodier-Einheit 202 vorläufig abgeholt
wird. Zu beachten ist, dass der Befehlscache-Speicher 204 in
einer teilassoziativen, in einer vollständig assoziativen oder einer
direkt zugeordneten Konfiguration eingerichtet sein kann.
-
Die
Vorabhol/Vordecodiereinheit 202 ist vorgesehen, um Befehlscodierung
aus dem Hauptspeicher zur Speicherung innerhalb des Befehlscache-Speichers 204 vorläufig abzurufen.
In einer Ausführungsform
ist die Vorabhol/Vordecodiereinheit 202 ausgebildet, eine
64-Bit breite Codierung blockweise aus dem Hauptspeicher in den
Befehlscache-Speicher 204 zu übertragen. Selbstverständlich können eine
Vielzahl spezifischer Codierungsvorabholverfahren und Algorithmen
in der Vorabhol/Vordecodiereinheit 202 eingerichtet sein.
-
Wenn
die Vorabhol/Vordecodiereinheit 202 Befehle aus dem Hauptspeicher
abholt, erzeugt sie drei Vordecodierbits, die jedem Byte einer Befehlscodierung
zugeordnet sind: ein Startbit, ein Endbit und ein „Funktionsbit". Die Vordecodierungsbits
bilden Markierungen, die die Grenzen jedes Befehls angeben. Die
Vordecodiermarkierungen können
auch zusätzliche
Informationen übertragen,
etwa, ob ein gegebener Befehl direkt von den Decodiereinheiten 208 decodiert
werden kann, oder ob der Befehl ausgeführt werden muss, indem eine
Mikrocodierungsprozedur aufgerufen wird, die von der MROM-Einheit 202 gesteuert
wird, wie dies nachfolgend detaillierter beschrieben ist.
-
Tabelle
1 gibt eine Codierung der Vordecodierungsmarkierungen an. Wie in
der Tabelle gezeigt ist, wird, wenn ein gegebenes Byte das erste
Byte eines ersten Befehls ist, das Startbit für dieses Byte gesetzt. Wenn
das Byte das letzte Byte eines Befehls ist, wird das Endbit für dieses
Byte gesetzt. Wenn ein spezieller Befehl nicht direkt von den Decodiereinheiten
208 decodiert
werden kann, wird das Funktionsbit, das mit dem ersten Byte des
Befehls verknüpft
ist, gesetzt. Wenn andererseits der Befehl direkt von den Decodiereinheiten
208 decodiert
werden kann, wird das mit dem ersten Byte des Befehls verknüpfte Funktionsbit
zurückgesetzt. Das
Funktionsbit für
das zweite Byte eines speziellen Befehls wird zurückgesetzt,
wenn die Operationscodierung das erste Byte ist, und dieses wird
gesetzt, wenn die Operationscodierung bzw. der Op-Code das zweite Byte
ist. Zu beachten ist, dass in Situationen, in denen die Operationscodierung
das zweite Byte ist, das erste Byte ein Präfixbyte ist. Die Funktionsbitwerte
für die
Befehlsbytenummern 3 bis 8 geben an, ob das Byte ein MODRM- oder
SIB-Byte ist, oder ob das Byte Verschiebungsdaten oder unmittelbare
Daten enthält. Tabelle
1: Codierung von Start-, End- und Funktionsbits
-
Wie
zuvor angegeben ist, können
in einer Ausführungsform
gewisse Befehle innerhalb des x-86-Befehlssatzes direkt von der
Decodiereinheit 208 decodiert werden. Diese Befehle werden
als Befehle mit „schnellem
Pfad" bezeichnet.
Die restlichen Befehle des x-86-Befehlssatzes werden als „MROM-Befehle" bezeichnet. MROM-Befehle
werden durch Aufrufen der MROM-Einheit 209 ausgeführt. Genauer
gesagt, wenn ein MROM-Befehl
auftritt, analysiert die MROM-Einheit 209 den Befehl und
zerlegt diesen in eine Reihe von mehreren definierten Befehlen mit
schnellem Pfad, um eine gewünschte
Operation zu bewirken. Eine Auflistung beispielhafter x-86-Befehle,
die als Befehle mit schnellem Pfad eingestuft sind, sowie eine Beschreibung der
Art und Weise der Handhabung sowohl von Befehlen mit schnellem Pfad
als auch von MROM-Befehlen wird nachfolgend angegeben.
-
Die
Befehlsausrichteinheit 206 ist vorgesehen, um Befehle mit
variabler Bytelänge
von dem Befehlscache-Speicher 204 zu festgelegten Ausgabepositionen
zu lenken, die durch die Decodiereinheiten 208a bis 208f gebildet
sind. Die Befehlsausrichteinheit 206 wählt unabhängig und parallel Befehle aus
drei Gruppen von Befehlsbytes aus, die von dem Befehlscache-Speicher 204 bereitgestellt
werden, und ordnet diese Bytes in drei Gruppen von vorläufigen Ausgabepositionen
an. Jede Gruppe an Ausgabepositionen ist einer der drei Gruppen
aus Befehlsbytes zugeordnet. Die vorläufigen Ausgabepositionen werden
dann zusammengeführt, um
die endgültigen
Ausgabepositionen zu bilden, wovon jede mit einer der Decodiereinheiten 208 gekoppelt ist.
-
Bevor
mit einer detaillierten Beschreibung der Lade/Schreib-Einheit 222 und
dem Datencache-Speicher 224 fortgefahren werden soll, werden
allgemeine Aspekte hinsichtlich weiterer Untersysteme, die in dem beispielhaften
superskalaren Mikroprozessor 200 aus 1 eingesetzt
werden, beschrieben. Für
die Ausführungsform
aus 1 enthält
jede der Decodiereinheiten 208 eine Decodierschaltung zum
Decodieren der vorbestimmten Befehle mit schnellem Pfad, die zuvor
benannt sind. Des weiteren leitetet jede Decodiereinheit 208a bis 208f Verschiebungsdaten
und unmittelbare Daten an eine entsprechende Reservierstationseinheit 210a bis 210f.
Ausgangssignale von den Decodiereinheiten 208 enthalten
bitcodierte Ausführungsbefehle
für die
Funktionseinheiten 212 sowie Operandenadressinformationen,
unmittelbare Daten und/oder Verschiebungsdaten.
-
Der
superskalare Mikroprozessor aus 1 unterstützt eine
Ausführung
außerhalb
der Reihenfolge und verwendet daher den Umordnungspuffer 216,
um den ursprünglichen
Programmablauf für
Registerauslese- und Schreiboperationen zu überwachen, um damit eine Registerumbenennung
zu implementieren, um eine spekulative Befehlsausführung und
eine Wiederherstellung bei Verzweigungsfehlvorhersage zu ermöglichen
und um eine präzise
Ausnahmebehandlung zu ermöglichen.
Wie der Fachmann erkennt, ist eine temporäre Speicherstelle innerhalb
des Umordnungspuffers 216 beim Decodieren eines Befehls
reserviert, der das Aktualisieren eines Registers beinhaltet, um
damit spekulative Registerzustände
zu speichern. Der Umordnungspuffer 216 kann in einer Konfiguration „zuerst
hinein-zuerst heraus" eingerichtet
sein, wobei spekulative Ergebnisse zur „Hinterseite" des Puffers wandern,
wenn sie als gültig
erkannt und in die Registerdatei geschrieben werden, wodurch Platz
geschaffen wird für
Einträge
an der „Vorderseite" des Puffers. Andere
spezielle Konfigurationen des Umordnungspuffers 216 sind
ebenso möglich,
wie dies nachfolgend beschrieben ist. Wenn eine Verzweigungsvorhersage
nicht korrekt ist, können
die Ergebnisse der spekulativ ausgeführten Befehle zusammen mit
dem falsch vorhergesagten Pfad in dem Puffer als ungültig erklärt werden,
bevor diese in die Registerdatei 218 beschrieben werden.
-
Die
bitcodierten Ausführungsbefehle
und die unmittelbaren Daten, die an den Ausgängen der Decodiereinheiten 208a bis 208f bereitgestellt
werden, werden direkt an die entsprechenden Reservierstationseinheiten 210a bis 210f weitergeleitet.
In einer Ausführungsform
ist jede Reservierstationseinheit 210a bis 210f in
der Lage, Befehlsinformationen zu halten (d. h. bitcodierte Ausführungsbits
sowie Operandenwerte, Operandenmarkierungen und/oder unmittelbare
Daten) bis zu drei anhängige
Befehle, die auf die Ausgabe zu der entsprechenden Funktionseinheit
warten. Zu beachten ist, dass für
die Ausführungsform
in 1 jede Decodiereinheit 208a bis 208f einer
entsprechenden Reservierstationseinheit 210a bis 210f zugeordnet
ist, und dass jede Reservierstationseinheit 210a bis 210f in ähnlicher
Weise einer speziellen Funktionseinheit 212a bis 212f zugeordnet
ist. Folglich werden 6 spezielle „Ausgabepositionen" durch die Decodiereinheiten 208a,
die Reservierstationseinheiten 210a und die Funktionseinheiten 212 gebildet.
Befehle, die durch die Decodiereinheit 208a der Ausgabeposition
0 zugeordnet und dort ausgegeben werden, werden an die Reservierstation 210a und
nachfolgend zu der Funktionseinheit 212a zur Ausführung weitergeleitet.
In ähnlicher
Weise werden Befehle, die von der Decodiereinheit 208b ausgerichtet
und ausgegeben werden, zu der Reservierstationseinheit 210b und
weiter zur Funktionseinheit 212 geleitet, usw.
-
Beim
Decodieren eines speziellen Befehls werden, wenn ein erforderlicher
Operand eine Registerstelle ist, Registeradresseninformationen an
den Umordnungspuffer 216 und gleichzeitig an die Registerdatei 218 weitergeleitet.
Der Fachmann weiß,
dass die x86-Registerdatei
reale Register mit 32 Bit enthält
(d. h. diese werden typischerweise als EAX, EBX, ECX, EDX, EBP,
ESI, EDI und ESP bezeichnet). Der Umordnungspuffer 216 enthält temporäre Speicherstellen
für Ergebnisse,
die den Inhalt dieser Register ändern,
wodurch eine Ausführung
außerhalb
der Reihenfolge ermöglicht
wird. Eine temporäre
Speicherstelle des Umordnungspuffers 216 wird für jeden
Befehl reserviert, der beim Decodieren erkannt wird, den Inhalt
einer der realen Register zu modifizieren. Daher kann während diverser
Punkte während
des Ausführens
des speziellen Programms der Umordnungspuffer 216 eine
oder mehrere Speicherstellen aufweisen, die den spekulativ ausgeführten Inhalt eines
gegebenen Register enthalten. Wenn nachfolgend auf die Decodierung
eines gegebenen Befehls bestimmt wird, dass der Umordnungspuffer 216 eine
vorhergehende Stelle oder Stellen aufweist, die einem Register zugeordnet
sind, das als ein Operand in dem gegebenen Befehl verwendet wird,
leitet der Umordnungspuffer 216 an die entsprechende Reservierstation
weiter: 1) den Wert in der jüngsten
zugeordneten Speicherstelle oder 2) eine Markierung für die jüngste zugeordnete
Speicherstelle, wenn der Wert von der Funktionseinheit noch nicht
erzeugt ist, die schließlich
den vorhergehenden Befehl ausführt.
Wenn der Umordnungspuffer eine Speicherstelle aufweist, die für ein gegebenes
Register reserviert ist, wird der Operandenwert (oder die Markierung)
von dem Umordnungspuffer 216 anstelle von der Registerdatei 218 bereitgestellt.
Wenn keine Speicherstelle für
ein erforderliches Register in dem Umordnungspuffer 216 reserviert
ist, wird der Wert direkt aus der Registerdatei 218 genommen.
Wenn der Operand einer Speicherstelle entspricht, wird der Operandenwert
der Reservierstationseinheit über
die Lade/Schreibeinheit 222 zugeführt.
-
Einzelheiten
im Hinblick auf geeignete Einrichtungen für Umordnungspuffer können in
der Veröffentlichung „Superskalare
Mikroprozessorgestaltung" von
Mike Johnson, Prentice-Hall, Englewood Cliffs, New Jersey, 1991
und in der anhängigen
Patentanmeldung mit dem gleichen Anmelder mit dem Titel „Superskalare Mikroprozessoren
mit hoher Leistungsfähigkeit", Anmelde-Nr. 08/146,382,
eingereicht am 29. Oktober 1993 von Witt, et. all gefunden werden.
Diese Dokumente sind hierin durch Bezugnahme in ihrer Gesamtheit
mit eingeschlossen.
-
Die
Reservierstationseinheiten 210a bis 210f sind
vorgesehen, um temporär
Schreibbefehlsinformation zu speichern, die spekulativ von den entsprechenden
Funktionseinheiten 212a bis 212f auszuführen sind. Wie
zuvor angegeben ist, kann jede Reservierstationseinheit 210a bis 210f Schreibbefehlsinformation
für bis zu
3 anhängige
Befehle speichern. Jede der sechs Reservierstationen 210a bis 210f enthält Speicherstellen, um
bitcodierte Ausführungsbefehle
zu speichern, die von der entsprechenden Funktionseinheit spekulativ
auszuführen
sind, und um die Werte von Operanden zu speichern. Wenn ein spezieller
Operand nicht verfügbar ist,
wird eine Markierung für
diesen Operanden von dem Umordnungspuffer 216 bereitgestellt
und wird in der entsprechenden Reservierstation gespeichert, bis
das Ergebnis erzeugt ist (d. h. durch Abschluss des Ausführens eines
vorhergehenden Befehls). Zu beachten ist, dass, wenn ein Befehl
von einer der Funktionseinheiten 212a bis 212f ausgeführt wird,
das Ergebnis dieses Befehls direkt zu einer der Reservierstationseinheiten 210a bis 210f weitergeleitet
wird, die auf dieses Ergebnis wartet, gleichzeitig dazu wird das
Ergebnis zur Aktualisierung des Umordnungspuffers 216 weitergeleitet
(diese Technik wird üblicherweise
als „Ergebnisweiterleitung" bezeichnet). Befehle
werden an Funktionseinheiten zum Ausführen ausgegeben, nachdem Werte
von einem oder mehreren erforderlichen Operanden verfügbar sind.
D. h., wenn ein Operand, der mit einem anhängigen Befehl innerhalb einer
der Reservierstationseinheiten 210a bis 210f verknüpft ist,
mit einer Speicherstelle eines vorhergehenden Ergebniswertes innerhalb
des Umordnungspuffers 216 markiert ist, der einem Befehl
entspricht, der den erforderlichen Operanden modifiziert, wird der
Befehl nicht an die entsprechende Funktionseinheit 212 ausgegeben,
bis das Operandenergebnis für
den vorhergehenden Befehl erhalten wird. Folglich kann die Reihenfolge,
in der die Befehle ausgeführt
werden, unter Umständen
nicht der Reihenfolge der ursprünglichen
Programmbefehlssequenz entsprechen. Der Umordnungspuffer 216 stellt
sicher, dass die Kohärenz
in Situationen beibehalten wird, in denen Abhängigkeiten der Form „Lesen
nach Schreiben" auftreten.
-
In
einer Ausführungsform
ist jede der Funktionseinheiten 212 so gestaltet, dass
Ganzzahlarithmetikoperationen der Addition und Subtraktion, sowie
Verschiebungen, Rotationen, logische Operationen und Verzweigungsoperationen
ausgeführt
werden. Zu beachten ist, dass eine Fliesskommaeinheit (nicht gezeigt)
eingesetzt werden kann, um Fliesskommaoperationen auszuführen.
-
Jede
der Funktionseinheiten 212 stellt auch Informationen hinsichtlich
des Ausführens
bedingter Verzweigungsbefehle für
die Verzweigungsvorhersageeinheit 220 bereit. Wenn eine
Verzweigungsvorhersage nicht korrekt war, verwirft die Verzweigungsvorhersageeinheit 220 Befehle,
die auf die falsch vorhergesagte Verzweigung folgen und die bereits
in der Befehlsverarbeitungspipeline enthalten sind, und veranlasst
die Vorabhol/Vordecodiereinheit 202, die erforderlichen
Befehle aus dem Befehlscache-Speicher 204 oder dem Hauptspeicher
abzuholen. Zu beachten ist, dass in derartigen Situationen Ergebnisse
von Befehlen in der ursprünglichen
Programmabfolge, die nach dem falsch vorhergesagten Verzweigungsbefehl
auftreten, verworfen werden, wozu auch jene Befehle gehören, die
spekulativ ausgeführt
und temporär
in der Lade/Schreibeinheit 222 und in dem Umordnungspuffer 216 gespeichert
sind. Beispielhafte Konfigurationen für geeignete Verzweigungsvorhersagemechanismen
sind gut bekannt.
-
Ergebnisse,
die von den Funktionseinheiten 212 erzeugt werden, werden
an den Umordnungspuffer 216 gesendet, wenn ein Registerwert
aktualisiert wird, und werden an die Lade/Schreibeinheit 222 gesendet, wenn
der Inhalt einer Speicherstelle geändert wird. Wenn das Ergebnis
in einem Register zu speichern ist, speichert der Umordnungspuffer 216 das
Ergebnis in der Speicherstelle, die für den Wert des Registers reserviert
wurde, wenn der Befehl decodiert wurde. Wie zuvor angegeben ist,
werden Ergebnisse auch allgemein adressiert an die Reservierstationseinheiten 210a bis 210f ausgegeben,
wenn anhängige
Befehle auf die Ergebnisse vorhergehender Befehle warten, um damit
die erforderliche Operandenwerte zu erhalten.
-
Allgemein
gesagt, stellt die Lade/Schreibeinheit 222 eine Schnittstelle
zwischen den Funktionseinheiten 212a bis 212f und
dem Datencache-Speicher 224 bereit. In einer Ausführungsform
ist die Lade/Schreibeinheit 222 mit einem Lade/Schreibpuffer
mit 16 Speicherplätzen
für Daten-
und Adressinformationen für
anhängige
Ladeoperationen oder Schreiboperationen versehen. Die Decodiereinheiten 208 führen eine
Verteilung des Zugriffes auf die Lade/Schreibeinheit 222 aus.
Wenn der Puffer voll ist, muss eine Decodiereinheit warten bis die
Lade/Schreibeinheit 222 Platz für die anhängige Lade- oder Schreibanforderungsinformation
enthält. Die
Funktionseinheiten 212 liefern den Lade/Schreibbefehl und
die dazugehörigen
Adressen- und Dateninformationen an die Lade/Schreibeinheit 222.
Die Lade/Schreibeinheit 222 führt die Lade/Schreibbefehle
aus, indem auf den Datencache-Speicher 224 zugegriffen
wird, und veranlasst, dass der Datencache-Speicher 224 eine
Zeile aus dem Hauptspeicher abholt, wenn ein nicht spekulativer
Lade/Schreib-Befehl den Cache-Speicher nicht trifft. Die Lade/Schreibeinheit 222 gibt
die angeforderten Daten für
die Ladebefehle an den Umordnungspuffer 216 sowie an Reservierstationen 210 zurück, die
auf die Daten wartet. Schreibdaten werden in den Datencache-Speicher 224 durch
die Lade/Schreibeinheit 222 gespeichert. Die Lade/Schreibeinheit 222 führt eine
Abhängigkeitsprüfung für Ladebefehle
im Hinblick auf anhängige
Schreibbefehle aus, um sicherzustellen, dass die Datenkohärenz bewahrt
bleibt.
-
Der
Datencache-Speicher 224 ist ein Hochgeschwindigkeitscache-Speicher,
der zum temporären Speichern
von Daten vorgesehen ist, die zwischen der Lade/Schreib-Einheit 222 und
dem Hauptspeichersubsystem ausgetauscht werden. In einer Ausführungsform
besitzt der Datencache-Speicher 224 eine Kapazität zum Speichern
bis zu 32 Kilobytes aus Daten in einer teilassoziativen Struktur
mit 8 Wegen mit 32 Bytezeilen. Es ist zu beachten, dass der Datencache-Speicher 224 in
einer Vielzahl spezieller Speicherkonfigurationen, zu denen eine
teilassoziative Konfiguration gehört, eingerichtet werden kann.
-
2 zeigt
eine Ansicht mehrerer wichtiger Komponenten der Lade/Schreibeinheit 222,
die in einer Ausführungsform
der vorliegenden Erfindung eingesetzt sind. Die Lade/Schreibeinheit 222 besitzt
einen Eingabebus 250, der mit den Funktionseinheiten 212 zur
Bereitstellung von Lade/Schreibbefehlen, Adressen- und Dateninformationen
verbunden ist. Der Eingabebus 250 übermittelt Information an einen
Lade/Scheib-Puffer 251. Der Lade/Schreibpuffer 251 speichert
Information, die anhängige
Lade- und Schreibbefehle betrifft. Ein Anforderungsbus 253 überträgt eine
Lade/Schreibanforderung an den Datencache-Speicher 224,
wie dies von einer Multiplexerschaltung 254 unter der Steuerung
einer Ausgabesteuerschaltung 255 ausgewählt wird. Von dem Datencache-Speicher
läuft ein
Treffer-Wege-Bus 256 zurück, der mit dem Lade/Schreibpuffer 251 verbunden
ist. Über
den Treffer/Wege-Bus 256 erhält die Lade/Schreib-Einheit 222 Treffer/Nichttreffer-Information und
den Wegewert des Datencache-Speichers 224, der für den Treffer
für die
Anforderungen, die auf dem Anforderungsbus 253 übertragen
werden, erkannt wird. Eine Rücksetzsignalleitung 257 ist
mit dem Umordnungspuffer 216 verbunden, um Schaltungen
zu steuern, die mit dem Lade/Schreibpuffer 251 verknüpft sind.
-
Allgemein
gesagt wählt
die Lade/Schreib-Einheit 222 eine Lade- oder Schreibspeicheranforderung aus,
die über
den Anforderungsbus 253 zu dem Datencache-Speicher 224 zu übertragen
ist. Ein „geprüftes Bit" in der zugeordneten
Pufferspeicherstelle wird gesetzt, wenn die aktuelle Anforderung
den Datencache-Speicher 224 trifft.
Das geprüfte
Bit bleibt solange gesetzt, bis der Befehl gültig ist und das Rücksetzsignal auf
der Rücksetzsignalleitung 257 wird
nicht gesetzt. Ferner wird auch der Wegewert aus dem Datencache-Speicher 224,
der den Weg angibt, der von der aktuellen Anforderungsadresse getroffen
wird, in der zugeordneten Pufferspeicherstelle in einem Wegefeld
gespeichert. Das Aktualisieren der Lade/Schreibpufferspeicherstelle
der aktuellen Anforderung durch die Cache-Information, die mit der aktuellen Anforderung
verknüpft
ist, dient einem dreifachen Zweck: 1) Ladebefehle, die nicht den
Datencache-Speicher treffen, werden durch die Nichttrefferinformation
aktualisiert, 2) Schreibbefehle werden entsprechend dem Treffer
und dem Weg für
den Zugriff im zweiten Zyklus aktualisiert, während welchem der Schreibvorgang
passiert, 3) Schreibbefehle, die Teil eines „Lade/Schreib-Operations"-Befehls sind, werden entsprechend dem
Wegewert und dem Trefferwert für
den zugeordneten Ladebefehl aktualisiert, wodurch ermöglicht wird,
dass die Schreiboperation mit lediglich einem einzelnen Zugriff
auf den Datencache-Speicher 224 ausgeführt wird.
-
Lade/Schreib-Operationsbefehle
sind x86-Befehle, die eine Speicherstelle sowohl als Quelle als
auch als Ziel verwenden. Anders ausgedrückt, einer der Operanden eines
Lade/Schreib-Operationsbefehls ist eine Speicherstelle und das Ergebnis
des Lade/Schreib-Operationsbefehls wird in der Speicherstelle gespeichert. Lade/Schreib-Operationsbefehle
werden, wenn sie auf dem superskalaren Mikroprozessor 200 ausgeführt werden,
sowohl als ein Ladebefehl als auch ein Schreibbefehl an die Lade/Schreibeinheit 222 ausgegeben, wobei
die gleiche Umordnungspuffermarkierung den beiden Befehlen zugeordnet
ist. Der Ladebefehl und der Schreibbefehl werden beide in der gleichen
Speicherstelle innerhalb des Lade/Schreibpuffers 251 gespeichert. Es
wird die Treffer- und Wegeinformation für den Cache-Speicher für den Schreibanteil
des Lade/Schreib-Operationsbefehls aufgezeichnet, wenn der Ladeanteil
ausgeführt
wird, und der erste Taktzyklus des normalen Schreibzugriffs mit
zwei Zyklen kann vermieden werden. Es ist wichtig sicherzustellen,
dass in Taktzyklen zwischen dem Ausführen des Ladeanteils und dem
Ausführen
des Schreibanteils eines Lade/Schreiboperationsbefehls die zugeordnete
Datencache-Zeile in dem Datencache-Speicher bleibt. Diese Funktion wird
durch die Verwendung eines Verriegelungsbits eingerichtet, wie dies
nachfolgend detaillierter beschrieben ist.
-
Wie
in der Ausführungsform
aus 2 gezeigt ist, ist der Lade/Schreib-Puffer 251 ein
lineares Array aus Speicherplätzen,
die eine Umordnungspuffermarkierung (das als Markierungsfeld in 2 angegeben
ist), ein geprüftes
Bit (das C-Feld) und ein Wegefeld (das W-Feld), das mit den Lade/Schreib-Befehlen
verknüpft ist,
enthalten. In einer Ausführungsform
ist der Lade/Schreib-Puffer 251 mit 16 Speicherstellen
versehen. Wie nachfolgend detaillierter beschrieben ist, werden
auch andere Informationen in jedem Lade/Schreib-Puffereintrag gespeichert.
Jeder Speicherstelle ist ein Block aus Logikschaltungen zugeordnet,
um das geprüfte
Bit bei jedem Taktzyklus zu aktualisieren.
-
Eine
Ausführungsform
der Logikschaltungen, die einem einzelnen Eintrag zugeordnet sind,
sind in 2 als Und-Gatter 258, 259 und 261 sowie
als ein Oder-Gatter 260 gezeigt. Ähnliche Schaltungen können für jede Speicherstelle
innerhalb des Lade/Schreib-Puffers 251 vorgesehen werden.
Das Und-Gatter 261 decodiert den Puffereintrag der Anforderung
auf dem Anforderungsbus 253. Wenn der Puffereintrag mit
dem Puffereintrag übereinstimmt,
der dieser Gruppe aus Logikschaltungen zugeordnet ist, dann ist
dieser für
die Aktualisierung vorgesehen. Der Ausgang des Und-Gatters 261 ist
auf hohem Pegel, wenn der Eintrag für die Aktualisierung vorgesehen
ist. Das Und-Gatter 258 empfängt das Ausgangssignal des
Und-Gatters 261 sowie das Trefferbit aus dem Cache-Speicher.
Das Und-Gatter 258 bildet einen der Eingänge für das Oder-Gatter 260,
das das geprüfte
Bit innerhalb der Speicherstelle setzt oder zurücksetzt. Wenn daher dieser
Puffereintrag aktuell auf den Datencache-Speicher 224 zugreift
und der Zugriff ein Treffer ist, ist das Ausgangssignal des Und-Gatters 258 (und
daher des Oder-Gatters 260) eine logische 1 und das geprüfte Bit
wird gesetzt. Das Und-Gatter 259 empfängt den
aktuellen Status des geprüften
Bits und ist mit der Zurücksetzsignalleitung 257 aus
dem Umordnungspuffer 216 verbunden. Das Zurücksetzsignal,
das auf der Zurücksetzsignalleitung 257 übertragen
wird, wird von dem Umordnungspuffer 216 gesetzt, wenn eine
Ausnahme, eine Verzweigungsfehlvorhersage oder ein anderes Ereignis
auftritt, das bewirkt, dass der Ablauf von Befehlen sich von dem
Pfad unterscheidet, der vorhergesagt wurde. Wenn diese Arten an
Ereignissen auftreten, kann es notwendig sein, einige der Befehle
in dem Lade/Schreib-Puffer über
einen Mechanismus zwischen der Lade/Schreib-Einheit 222 und
dem Umordnungspuffer 216 (nicht gezeigt) zu löschen. Daher
werden die geprüften
Bits in dem Lade/Schreibpuffer 251 zurückgesetzt, da die Verriegelungsbits
in dem Datencache-Speicher 224 zurückgesetzt werden (wie dies
nachfolgend erläutert
ist). Das Und-Gatter 259 liefert diese Funktion. Das geprüfte Bit
bleibt gesetzt, sofern das Zurücksetzsignal
nicht gesetzt ist, und wenn dieses gesetzt wird, wird das geprüfte Bit
zurückgesetzt.
-
Der
Multiplexer 254 und die Ausgangssteuereinheit 255 werden
verwendet, um Anforderungen nach einem Zugriff auf dem Datencache-Speicher 224 in
einem gegebenen Taktzyklus auszuwählen. In einer Ausführungsform
werden bis zu zwei Anforderungen bei jedem Taktzyklus ausgewählt. In
dieser Ausführungsform verwirklicht die
Ausgangssteuereinheit 255 ein Prioritätsschema zum Auswählen von
Operationen aus dem Lade/Schreib-Puffer 251, wobei Schreibbefehle,
die nicht mehr spekulativ sind und Ladebefehle, die nicht mehr spekulativ
sind und den Datencache-Speicher nicht getroffen haben, eine hohe
Priorität
erhalten, und wobei Ladebefehle, die spekulativ sind, eine geringe
Priorität
erhalten. Zu beachten ist, dass die Multiplexerschaltung 254 als
mehrere Multiplexerschaltungen verwirklicht sein kann, die die Anforderungen
erzeugen, die über
den Anforderungsbus 253 übermittelt werden. Der Anforderungsbus 253 überträgt zumindest
die Adresse, die der Anforderung zugeordnet ist, übermittelt,
ob die Anforderung eine Ladeanforderung oder eine Schreibanforderung
ist, und übermittelt
den Wegewert, das geprüfte
Bit und die Schreibdaten für
Schreibanforderungen. Der Datencache-Speicher 264 ist ausgebildet,
Daten in der Cache-Zeile zu speichern, die durch die Anforderungsadresse
indiziert ist und von dem zugehörigen
Wegewert ausgewählt
ist, wenn das geprüfte Bit
gesetzt ist. Wenn das geprüfte
Bit nicht gesetzt ist, liest der Datencache-Speicher 224 Zeilen
aus dem Cache-Speicher aus, um nach einem Cache-Treffer für die Anforderungsadresse
zu suchen. In einer Ausführungsform
wird das Lade/Schreib-Operationsbit für Ladeanforderungen übertragen
(wie dies nachfolgend erläutert
ist).
-
Es
ist zu beachten, dass der Lade/Schreibpuffer 251 sich in
der Zahl der Einträge
von Ausführungsform
zu Ausführungsform
unterscheiden kann. Ferner kann der Lade/Schreib-Puffer 251 als
ein separater Ladepuffer und ein separater Schreibpuffer vorgesehen
werden, wobei der Ladepuffer alle Ladebefehle und der Schreibpuffer
alle Schreibbefehle speichert. Ferner ist zu beachten, dass mehr
als eine einzelne Anforderung pro Taktzyklus auf dem Anforderungsbus 253 übertragen
werden kann.
-
In
einer weiteren Ausführungsform
werden die Adressen, die auf den Datencache-Speicher 224 zugreifen, mit
den Adressen verglichen, die in dem Lade/Schreibpuffer 251 gespeichert
sind. Diese Ausführungsform
ist allgemeiner als die vorhergehende Ausführungsform, indem die Schreibbefehle,
die den Zugriff mit zwei Zyklen vermeiden, nicht der Schreibanteil
eines Lade/Schreiboperationsbefehls sein müssen. Jedoch ist die Verriegelung
des Cache-Speichers komplizierter. Das Verriegelungsbit, das mit
einer angesprochen Cache-Zeile verknüpft ist, muss gesetzt werden,
wenn ein geprüftes
Bit auf Grund des Cache-Zugriffes gesetzt ist, anstatt dass eine
Verriegelung auf der Grundlage der Tatsache eintritt, dass die Ladeoperation
ein Teil eines Lade/Schreiboperationsbefehls ist. Diese Ausführungsform
verriegelt allgemein die Cache-Zeile in einem Taktzyklus nach dem
Taktzyklus, in welchem der Zugriff auftritt.
-
3 zeigt
eine Ansicht der Bitfelder in einer Lade/Schreibpufferspeicherzelle
für eine
Ausführungsform
des Lade/Schreib-Puffers 251. Ein Feld 300 enthält die Umordnungspuffermarkierung
für die
Speicherstelle sowie ein Gültigkeitsbit,
das angibt, wenn es gesetzt ist, dass die Speicherstelle aktuell
einen gültigen Ladebefehl
oder Schreibbefehl enthält.
Ein Feld 301 speichert die mit dem Ladebefehl oder dem
Schreibbefehl verknüpfte
Adresse, wie sie von den Funktionseinheiten 212 bereitgestellt
wird. Ein Gültigkeitsbit
ist ferner in dem Feld 301 enthalten, das, wenn es gesetzt
ist, angibt, dass die Adresse gültig
ist. Die Ausgangssteuereinheit 255 wählt solange einen Lade/Schreib-Befehl
für den
Zugriff auf den Datencache-Speicher 224 nicht, bis das
Adressengültigkeitsbit
gesetzt ist. Ein Feld 302 speichert die mit Schreibbefehlen
verknüpften
Daten sowie ein Gültigkeitsbit,
das, wenn es gesetzt ist, angibt, dass das Datenfeld gültig ist.
Ein Bit 303 ist das geprüfte Bit, das zuvor erläutert ist,
und ein Feld 304 ist das zuvor erläuterte Wegefeld. Ein Bit 305 ist
ein Bit, das für Ladebefehle
verwendet wird und angibt, wenn es gesetzt ist, dass der Ladebefehl
der Ladeanteil eines Lade/Schreiboperationsbefehls ist. Dieses Bit
wird verwendet, um zu bestimmen, ob das Verriegelungsbit für eine zugeordnete
Cache-Zeile zu setzen ist oder nicht, wie dies nachfolgend detaillierter
beschrieben ist. Es ist zu beachten, dass andere Bits den Speicherstellen
in diversen Ausführungsformen
der Lade/Schreibeinheit 222 hinzugefügt werden können. Beispielsweise kann ein
Nichttrefferbit und ein Abhängigkeitsbit
hinzugefügt
werden, um anzugeben, dass ein Befehl den Datencache-Speicher nicht
trifft und dass ein Befehl abhängig
ist von einem Schreibbefehl, der in einer anderen Speicherstelle
innerhalb des Lade/Schreib-Puffers liegt.
-
4a ist
eine Ansicht der Bitfelder in dem Datencache-Markierungseintrag
gemäß einer
Ausführungsform.
Der Markierungseintrag ist mit einem Statusfeld 401 versehen,
das den Status der zugeordneten Cache-Zeile angibt. In einer Ausführungsform
ist das Statusfeld 401 ein zwei Bit breites Feld, um einen
MESI-Status für
jede Cache-Zeile zu kodieren. Wie der Fachmann weiß, gibt
ein MESI-Status einen modifizierten oder „schmutzigen" Zustand an, in welchem
die Cache-Zeile in Bezug auf den Inhalt modifiziert ist, der in
der zugeordneten Adresse in dem Hauptspeicher gespeichert ist, und
daher kann die Cache-Zeile in den Hauptspeicher zurückgeschrieben
werden, wenn diese aus dem Datencache-Speicher 224 abgerufen
wird; d.h., ein exklusiver Zustand, in welchem die Datencache-Zeile
in dem Datencache-Speicher 224 gespeichert ist und es existieren
keine anderen Kopien der Cache-Zeile in anderen superskalaren Mikroprozessoren,
die in einem System mit dem superskalaren Mikroprozessor 200 eingerichtet
sind; ein gemeinsam benutzter Zustand, in welchem die Cache-Zeile
in dem Datencache-Speicher 224 gespeichert ist, und keine
weiteren Kopien der Cache-Zeile in anderen supeskalaren Mikroprozessoren
gespeichert sind, die in einem System mit dem superskalaren Mikroprozessor 200 vorgesehen
sind; und ein ungültiger
Zustand, der angibt, dass die zugeordnete Cache-Zeile nicht gültig ist
und dass die darin gespeicherten Bytes nicht verwendet werden sollen.
-
Das
Feld 402 des Markierungseintrags enthält die Markierung des Eintrags.
Wie zuvor erläutert
ist, ist eine Markierung der Anteil der Adresse, der in einzigartiger
Weise angibt, welche Bytes aus dem Hauptspeicher in der Cache-Zeile
zu speichern sind. In einer Ausführungsform
ist das Feld 402 20 Bits breit und enthält die 20 höchstrangigen Bits der Adresse,
die den in der Cache-Zeile gespeicherten Bytes entspricht. Das Bit 403 ist
das zuvor genannte Verriegelungsbit. Wenn das Bit 403 gesetzt
ist, dann wird die zugeordnete Cache-Zeile nicht aus dem Datencache-Speicher 224 entfernt,
wenn eine neue Cache-Zeile aus dem Hauptspeicher abgeholt wird.
Stattdessen muss eine andere Cache-Zeile innerhalb der Reihe entfernt
werden. Das Verriegelungsbit 403 wird gesetzt, wenn ein
Ladebefehl bei entsprechendem gesetzten Lade/Schreiboperationsbit auf
die zugeordnete Cache-Zeile zugreift und als Treffer erkannt wird.
Da jeder Markierungseintrag mit einem Verriegelungsbit versehen
ist, kann das Datencache-Markierungsarray 404 Verriegelungsinformationen
für mehrere
Cache-Zeilen gleichzeitig bewahren. Das Verriegelungsbit 403 wird
zurückgesetzt,
wenn ein Schreibbefehl für
die zugeordnete Cache-Zeile ausgeführt wird, oder wenn das Zurücksetzsignal,
das auf der Zurücksetzsignalleitung 257 übertragen
wird, von dem Umordnungspuffer 216 gesetzt wird (wie dies
nachfolgend detaillierter beschreiben ist).
-
Ein
Szenario, in dem spezielle Aufmerksamkeit erforderlich ist, betrifft
den Fall, wenn der Ladeanteil eines Lade/Schreiboperationsbefehls
auf eine Cache-Zeile zugreift, wenn das Verriegelungsbit bereits
gesetzt ist. Das Verriegelungsbit im gesetzten Zustand gibt an,
dass ein vorhergehender Lade/Schreiboperationsbefehl auf die Cache-Zeile
mit seinem Ladeanteil zugegriffen hat, aber der Schreibanteil noch
nicht ausgeführt ist.
Wenn der Schreibanteil des vorhergehenden Lade/Schreiboperationsbefehls
in die Cache-Zeile schreibt, wird dadurch das Verriegelungsbit zurückgesetzt,
wie dies zuvor angegeben ist. Daher wird das Verriegelungsbit nicht
zurückgesetzt,
bevor der Schreibanteil des aktuellen Lade/Schreiboperationsbefehls
auf den Datencache-Speicher 224 zugreift, und die zugeordnete
Zeile wird von dem Cache-Speicher entfernt. Die Abhängigkeitsprüfung innerhalb
der Lade/Schreibeinheit 222 verhindert, dass der Ladeanteil
auf den Cache- Speicher zugreift
(wie nachfolgend detaillierter mit Bezug zu den 5 bis 7 beschrieben ist). Stattdessen können die Ladedaten
durch den Lade/Schreib-Puffer 251 bereitgestellt. In einer
Ausführungsform
wird das geprüfte
Bit für
den zugeordneten Schreibanteil nicht gesetzt. Daher erfordert der
Schreibanteil des Lade/Schreiboperationsbefehls zwei Datencache-Zugriffe,
um mit diesem Szenario vollständig
ausgeführt
zu werden. In einer weiteren Ausführungsform wird das geprüfte Bit
für den
zugeordneten Schreibanteil gesetzt, und es wird ein Bit für den Schreibbefehl
gesetzt, der die Daten für
den Ladeanteil bereitstellt, wodurch angegeben wird, dass das Verriegelungsbit
nicht gesetzt werden soll, wenn dabei auf dem Datencache-Speicher 224 zugegriffen
wird. In dieser Ausführungsform
werden beide Schreiboperationen in einem einzelnen Zugriff auf den
Cache-Speicher abgeschlossen.
-
4b zeigt
eine Blockansicht eines Datencache-Markierungsarrays 404,
das mit dem Datencache-Speicher 224 verknüpft ist.
In einer Ausführungsform
ist der Datencache-Speicher 224 ein
teilassoziativer Speicher mit 8 Wegen und somit enthält jede
Reihe des Datencache-Markierungsarrays 404 8 Einträge der Art,
wie dies in 4a gezeigt ist. Das Cache-Markierungsarray 404 ist
ferner mit der Zurücksetzsignalleitung 257 verbunden,
so dass während
eines Taktzyklus, in welchem das Zurücksetzsignal gesetzt ist, jedes
Verriegelungsbit innerhalb des Datencache-Markierungsarray 404 zurückgesetzt
wird. Das Zurücksetzsignal
ermöglicht
es, dass die Verriegelungsbits zurückgesetzt werden, wenn der
Umordnungspuffer 216 erkennt, dass ein Lade/Schreib-Operationsbefehl
gelöscht
wird. Zu beispielhaften Gründen
für das
Löschen
gehören
eine Verzweigungsfehlvorhersage für einen Verzweigungsbefehl
vor dem Lade/Schreiboperationsbefehl und eine Ausnahme, die mit
einem Befehl vor dem Lade/Schreiboperationsbefehl verknüpft ist.
Derartige Löschereignisse können in
einem Taktzyklus zwischen dem Ausführen des Ladeanteils eines
Lade/Schreiboperationsbefehls und dem Schreibanteil des Befehls
auftreten. Wenn ein Verriegelungsbit, das von einem Lade/Schreiboperationsbefehl
gesetzt wurde, der später
gelöscht
wurde, nicht zurückgesetzt
wird, dann verbleibt die Zeile in dem Datencache-Speicher 224 in nicht definierter
Weise (da kein weiterer Schreibbefehl in die Zeile schreiben würde, um
das Verriegelungsbit zurückzusetzen).
Daher werden alle Verriegelungsbits in den Fällen zurückgesetzt, in denen ein Lade/Schreiboperationsbefehl
nach dem Ausführen
des Ladeanteils des Befehls gelöscht wird.
Wenn Schreibanteile von Lade/Schreiboperationsbefehlen, die nicht
gelöscht
wurden, wenn das obige Zurücksetzen
auftrat, weiterhin in dem Lade/Schreib-Puffer 251 vorhanden sind (siehe 2),
dann sind die geprüften
Bits dieser Schreiboperationen zurückgesetzt (wie in 2 und
Und-Gatter 251 gezeigt ist), und diese Schreiboperationen
beanspruchen zwei Zyklen für
die Ausführung.
Ereignisse, die das Setzen des Zurücksetzsignals hervorrufen,
sind in superskalaren Mikroprozessoren relativ selten und so weisen
die meisten Lade/Schreiboperationensbefehle den Vorteil des Schreibens
in einem einzelnen Zyklus auf.
-
Zu
beachten ist, dass das Datencache-Markierungsarray 404 als
Teil als Datencache-Arrays 224 eingerichtet
sein kann, das die Datenbytes speichert, oder es kann als ein physikalisch
separates Array eingerichtet sein. Ferner kann die assoziative Funktion
des Datencache-Speichers 224 sich von Ausführungsform zu
Ausführungsform
unterscheiden. In einer direkt zugeordneten Ausführungsform des Datencache-Speichers 224 wird
das Wegefeld in den Speicherstellen des Lade/Schreib-Puffers 251 nicht
verwendet.
-
Entsprechend
der obigen Offenbarung ist eine Lade/Schreib-Einheit und ein Datencache-Speicher
für einen
superskalaren Mikroprozessor beschrieben. Die Kombination der Lade/Schreib-Einheit
und des Datencache-Speichers ermöglicht,
dass ein Schreibanteil von Lade/Schreiboperationensbefehlen in einem
einzelnen Taktzyklus beim Zugreifen auf den Datencache-Speicher
ausgeführt
werden, im Gegensatz zu Zugriffen mit zwei Taktzyklen, wie sie typischerweise
von Schreiboperationen benötigt
werden, um die zugeordnete Cache-Zeile zu ermitteln und die Daten
zu speichern. Somit kann ein höheres
Leistungsvermögen
durch die Reduzierung eines Datencache-Zugriffzyklus aus den meisten Lade/Schreiboperationsbefehlen
erreicht werden.