-
TECHNISCHES
GEBIET DER ERFINDUNG
-
Die Erfindung bezieht sich allgemein
auf das Gebiet der Mikroprozessoren und insbesondere auf Mikroprozessoren,
die interne Caches für
Daten verwenden.
-
HINTERGRUND
DER ERFINDUNG
-
Mikroprozessoren, die in heutigen
Personalcomputern verwendet werden, verarbeiten Daten mit sehr hoher
Geschwindigkeit. Dies gilt vor allem für superskalare Mikroprozessoren,
die mehr als einen Befehl gleichzeitig verarbeiten können. Es
ist wirtschaftlich nicht machbar, das gesamte Speichersystem des
Computers mit derselben Geschwindigkeit wie den Mikroprozessor zu
betreiben. Ferner ist er nicht notwendig, ein solches Speichersystem
aufzubauen. Mikroprozessoren verwenden Daten- oder Befehls-Caches
auf der Grundlage einer Annahme von Lokalität. Sobald bestimmte Daten oder
ein bestimmter Befehl aus dem Hauptspeicher mit einem Verweis versehen
worden ist, ist es normalerweise der Fall, auch in nächster Zukunft
nahegelegene Daten oder Befehle mit Verweisen zu versehen. Es ist machbar,
einen kleinen und schnellen Speicher aufzubauen, der solche Daten
oder Befehle vorübergehend
speichert. Es ist üblich,
Daten in Mindestgrößen, die
größer als
die kleinste adressierbare Speichergröße sind, aus dem Hauptspeicher
abzurufen. Solche Speicherabrufe können über einen Datenbus, der breiter
als die kleinste adressierbare Speichergröße ist, oder über Bündel aus
mehreren Speicherzugriffen oder über
beides erfolgen. Ein solches Abrufen von benachbarten Daten nützt außerdem der Lokalitätsannahme,
indem nahegelegene Adressen, die wahrscheinlich in nächster Zukunft
mit Verweisen versehen werden, abgerufen werden. Speicher-Caches
speichern ihre Daten mit einer Angabe der entsprechenden Hauptspeicheradresse.
-
Jeder Speicherverweis durch den Mikroprozessor
wird gegen diese Cache-Adreßangaben
geprüft,
um festzustellen ob die Adresse, auf die verwiesen wird, im Cache
erfaßt
ist. Falls die Adresse, auf die verwiesen wird, im Cache gespeichert
ist, was als Cache-Treffer bezeichnet wird, findet im Cache, anstatt
im Hauptspeicher ein Speicherzugriff statt. Da der Speicherzugriff
auf den Cache schneller als ein Zugriff auf den Hauptspeicher ist,
stellt jeder Cache-Treffer eine Zunahme der Speicherzugriffsgeschwindigkeit
dar. Es sei angemerkt, daß solche Speicherzugriffe
sowohl für
das Lesen im Speicher als auch für
das Schreiben in den Speicher ausgeführt werden können. Falls
der Zugriff ein Schreiben ist, erfolgt dieses Schreiben in die Kopie
der im Cache gespeicherten Daten. Dieser Cache-Eintrag wird dann
als schmutzig markiert. Dies bedeutet, daß er Daten enthält, die
sich von den Daten unter der entsprechenden Adresse im Hauptspeicher
unterscheiden, und die Cache-Daten dem im laufenden Programm verlangten
Zustand entsprechen. Falls die Adresse, auf die verwiesen wird,
nicht im Cache gespeichert ist, was als Cache-Fehlschuß bezeichnet wird,
muß auf
den Hauptspeicher zugegriffen werden. Bei einem Lesezugriff muß die Mikroprozessor-Betriebseinheit,
die die Daten benötigt,
angehalten werden, bis die Daten von dem langsameren Hauptspeicher
zurückschickt
worden sind. Wenn diese Hauptspeicherdaten abgerufen worden sind,
werden sie sowohl der anfordernden Mikroprozessor-Betriebseinheit
zugeführt
als auch im Cache gespeichert. Manche Mikroprozessoren erfassen
nach einem Cache-Fehlschuß bei
einem Schreibzugriff keine Daten im Cache. Diese Mikroprozessoren
schreiben lediglich in den Hauptspeicher. In superskalaren Mikroprozessoren
werden wahrscheinlich andere nützliche
Tasks ausgeführt,
während
dieses Schreibens in den Hauptspeicher stattfindet. Andere Mikroprozessoren
wenden eine Cache- Schreibzuteilungsstrategie an, indem sie nach
einem Cache-Fehlschuß bei
einem Schreibzugriff Daten abrufen. Die unter der Speicheradresse
zu schreibenden Daten werden abgerufen und im Cache gespeichert.
Das Schreiben in den Speicher findet dann in den entsprechenden
Cache-Ort statt. Dieser Cache-Eintrag wird als schmutzig markiert,
was angibt, daß sich
der Cache-Eintrag von der Kopie im Hauptspeicher unterscheidet.
Eine Schreibzuteilungsstrategie basiert auf der Annahme, daß für ein auf
einen fehlgeschlagenen Cache-Schreibzugriff folgendes Lesen oder Schreiben
nochmals für
kurze Zeit auf den Speicherort zugegriffen werden muß. Falls
dies wahr ist, finden die nachträglichen
Zugriffe innerhalb des Cache statt und steigern die Speicherzugriffsgeschwindigkeit.
-
Welche Größe der Speicher-Cache auch
immer hat, füllt
ihn der Mikroprozessor eventuell. Beim nächsten folgenden Cache-Fehlschuß muß ein Cache-Eintrag
gelöscht
werden, um das Speichern der fehlenden Daten aus dem Hauptspeicher
freizugeben. Speicher-Caches verwenden üblicherweise einen Algorithmus
"der längsten
Nichtverwendung". Zusammen mit der entsprechenden Speicheradresse
und einer Angabe, ob der Cache-Eintrag schmutzig ist, muß der Speicher-Cache
eine Angabe der letzten Verwendung des Cache-Eintrags speichern. Der
zu ersetzende Cache-Eintrag ist der am längsten nichtverwendete Cache-Eintrag.
Dies basiert auf den Annahme, daß der längsten nichtverwendete Cache-Eintrag
derjenige Eintrag ist, der am wenigsten wahrscheinlich in nächster Zukunft
wieder benötigt wird.
-
Dieser Cache-Eintrag-Ersetzungsprozeß beginnt
mit einem Cache-Fehlschuß,
da die angeforderten Daten nicht im Cache sind. Der Cache-Controller
muß bestimmen,
welche Cache-Einträge
durch die jüngst
angeforderten Daten zu ersetzten sind. Wenn der am längsten nichtverwendete
Cache-Eintrag sauber ist und genau den Daten im Hauptspeicher entspricht,
wird dieser Cache-Eintrag überschrieben.
Da der Cache-Eintrag gleich den am entsprechenden Ort im Speicher
gespeicherten Daten ist, verändert
dieses Überschreiben
den Funktionszustand des Programms nicht. Wenn der am längsten nichtverwendete
Cache-Eintrag schmutzig ist, enthält der Cache-Eintrag Daten,
die sich vom entsprechenden Speicherort unterscheiden. In diesem Fall
hält der
Cache-Eintrag den Funktionszustand des Programms und wäre ein Überschreiben
dieser Daten falsch. Dieser Cache-Eintrag muß geräumt werden, d. h., im Hauptspeicher
aufgezeichnet werden, bevor der Cache-Eintrag wiederverwendet werden
kann.
-
Die Notwendigkeit, schmutzige Cache-Einträge zu räumen, kann
zu einem Anhalten des Mikroprozessors führen. Diese Situation tritt
nur nach einem Cache-Fehlschuß ein, der üblicherweise
angibt, daß eine
Mikroprozessor-Ausführungseinheit
Daten benötigt.
Diese Situation kann entweder nach einem Lesen im Speicher oder
einem Schreiben in den Speicher, falls eine Schreibzuteilungsstrategie
angewandt wird, eintreten. Jedoch können die aus dem Hauptspeicher
angeforderten Daten nicht gespeichert werden, solange der schmutzige
Cache-Eintrag nicht in den Speicher geschrieben ist. Somit fordert der
Mikroprozessor neue Daten an, muß jedoch warten, bis alte Daten
in den Speicher geschrieben sind, bevor die neue Daten aus dem Speicher
abgerufen werden können.
Es ist an sich bekannt, einen Rückschreibpuffer
bereitzustellen, um dieses Problem zu behandeln. Der Rückschreibpuffer
ist ein First-in-First-out-Puffer für Cache-Einträge, die durch Scheduling in
den Speicher geschrieben werden. Jeder Eintrag in den Rückschreibpuffer
umfaßt
die Cache-Eintrag-Daten und die entsprechende Hauptspeicheradresse.
Wenn der Speicherbus frei ist, werden die Daten des letzten Eintrags
im Rückschreibpuffer
an der entsprechenden Adresse in den Hauptspeicher geschrieben.
Nach Abschluß dieses
Schreibens in den Hauptspeicher wird ein Rückschreibpuffer-Eintrag freigeben,
um einen weiteren geräumten Cache-Eintrag
zu speichern. Der Rückschreibpuffer verzögert das
Freigeben des angeforderten Schreibens in den Speicher bis nach
dem Lesen im Speicher. Da eine Mikroprozessor-Betriebseinheit auf
den Abschluß des
Lesens im Speicher wartet, ermöglicht das
Vorangehen des Lesens vor dem Schreiben das Fortsetzen des Mikroprozessorbetriebs
nach der Cache-Eintragräumung.
-
Es gibt Gelegenheiten, in denen die
Annahme der Lokalität
von Verweisen nicht zutrifft. Einer dieser Fälle ist ein Kontextwechsel,
wenn der Mikroprozessor von seiner momentanen Task zu einer anderen
Task wechselt. Dies kann beim Laden eines neuen Programms, dem Wechseln
zwischen Teilen eines einzelnen Programms oder beim Behandeln einer
Unterbrechung eintreten. In diesen Fällen wechselt die Speicheroperation
von einem ursprünglichen Adressenblock
zu einem anderen Adressenblock. Ein solches Wechseln des Speicherverweises
erfordert das Holen einer großen
Menge von Daten aus dem Hauptspeicher in einer relativ kurzen Zeitperiode.
Dies erfordert das Ersetzen eines großen Abschnitts an Inhalten
des Speicher-Cache. Somit kann während
eines Kontextwechsels das Räumen
einer großen
Anzahl von schmutzigen Cache-Einträgen erforderlich sein. Ein
Rückschreibpuffer
verzögert
lediglich die Notwendigkeit, in den Speicher zu schreiben. Sobald
der Rückschreibpuffer
voll ist, muß vor einem
angeforderten Lesen im Speicher ein Zurückschreiben eines schmutzigen
Cache-Eintrags erfolgen. Bei einem Kontextwechsel tritt diese Situation häufig wiederholt
ein, was den Betrieb des Mikroprozessors jedesmal verlangsamt.
-
Das Erweitern der Tiefe des FIFO-Rückschreibpuffers
führt zu
einer Verringerung dieses Problems. Bei ausreichender Tiefe kann
das Zurückschreiben
verzögert
werden, bis eine neue Task beginnt, im Cache erfaßte Daten
mit Verweisen zu versehen. Stets dann, wenn die neue Task einen
Cache-Treffer landet, ist kein Speicherbuszyklus erforderlich, um
die angeforderten Daten abzurufen. Dies gibt einen Speicherbuszyklus
zum Zurückschreiben aus
dem Rückschreibpuffer
frei. Je größer der
Rückschreibpuffer
ist, desto wahrscheinlicher ist, daß die Zurückschreibungen verzögert werden,
bis ihre erforderlichen Speicherbuszyklen hinter Cache-Treffern versteckt
werden können.
Jedoch verbraucht der Rückschreibpuffer
relativ große
Mengen an Fläche
in der integrierten Schaltung, die den Mikroprozessor aufnimmt.
Jeder Eintrag in den Rückschreibpuffer muß einen
vollständigen
Cache-Eintrag umfassen, der eine Breite von 46 bit oder 256 bit
oder mehr besitzen kann. Jeder Eintrag in den Rückschreibpuffer benötigt außerdem die
Anfangsadresse der Daten, die häufig
27 bis 29 bit beträgt.
Außerdem
wird üblicherweise
die Adresse jedes Eintrags im Rückschreibpuffer
mit der Adresse jedes Speicherzugriffs verglichen. Das Zurückschreiben
von Daten wird im allgemeinen abgebrochen, wenn die Adresse eines Speicherzugriffs
mit einer Adresse innerhalb des Rückschreibpuffers übereinstimmt.
Eine Übereinstimmung
bei einem Lesen im Speicher bedeutet, daß Daten im Rückschreibpuffer
von einer Betriebseinheit des Mikroprozessors benötigt werden.
Es erspart Zeit, wenn diese Daten aus dem Rückschreibpuffer erhalten werden,
anstatt sie in den Hauptspeicher zu schreiben, was einen Cache-Fehlschuß beim Lesezugriff
erzeugt, und danach in den Cache zurückzuschreiben. Eine Übereinstimmung
bei einem Schreiben in den Speicher bedeutet, daß die Daten im Rückschreibpuffer
zu verändern
sind. Somit sind die Daten im Rückschreibpuffer
die falschen Daten zum Schreiben in den Speicher. Außerdem bedeutet ein
Zugriff auf Daten im Rückschreibpuffer
in jedem Fall, daß diese
Daten nicht mehr die am längsten nichtverwendeten
Daten sind. Somit sollte ein anderer Cache-Eintrag als der Cache-Eintrag
im Rückschreibpuffer
ersetzt werden. Da der Rückschreibpuffer
die Mikroprozessor-Ausführungseinheit,
die Daten benötigt,
anhalten kann, sollten alle diese Vergleiche rechtzeitig abgeschlossen
werden, um nach einer Übereinstimmung
das schnelle Löschen
eines Rückschreibpuffer-Eintrags
zu ermöglichen.
-
Dies erfordert eine Menge an paralleler Hardware
für die
Vergleiche. Wegen dieser Schaltungsumfänge wird die Tiefe des Rückschreibpuffers üblicherweise
so festgelegt, daß ein
Anhalten der Mikroprozessor-Betriebseinheit während der gewöhnlichen
Verarbeitung zumeist verhindert wird, jedoch nicht während Kontextwechseln.
-
Das US-Patent Nr. 4.530.055 offenbart
ein hierarchisches Speichersystem, bei dem Cache-Speichersegmente
nach einem Algorithmus, der auf dem Alter des Segments seit dem
ersten Schreiben basiert, einzeln an den Massenspeicher zurück übergeben
werden.
-
IBM Technical Disclosure Bulletin,
Bd. 23, Nr. 12, 12. Mai 1981 "Preventive Cast-Outs Operations in
Cache Hierarchies" offenbart die Verwendung von präventiven
Auslagerungen von modifizierten Cache-Blöcken in den Hauptspeicher,
wenn sich der Prozessor in einem seiner unvermeidbaren Wartezustände (z.
B. während
anstehender E/A-Operationen) befindet.
-
ZUSAMMENFASSUNG
DER ERFINDUNG
-
Diese Erfindung sieht ein preemptives
Cache-Zurückschreiben
in einem Mikroprozessor mit einem internen Cache, wie er in Anspruch
10 dargelegt ist, und ein entsprechendes Verfahren, wie es in Anspruch
1 dargelegt ist, vor. Die Erfindung prüft jeden Cache-Eintrag einmal
in jeder vorgegebenen Zeitperiode, um festzustellen, ob der Cache-Eintrag
verschmutzt ist. Wenn ein Cache-Eintrag schmutzig ist, prüft sie eine
Schreibhistorie, um festzustellen, ob der Cache-Eintrag alt ist. Wenn der Cache-Eintrag
alt ist, schreibt sie den Cache-Eintrag preemptiv in den Hauptspeicher
und markiert den Cache-Eintrag als sauber.
-
In einer bevorzugten Ausführungsform
enthält
die Schreibhistorie einen Zählwert
für die
Anzahl von aufeinanderfolgenden vorgegebenen Zeitperioden, in denen
kein Schreiben in den Cache-Eintrag stattfand. Der Cache-Eintrag
ist alt, wenn der Zählwert
eine vorgegebene Zahl übersteigt.
Dieser Nichtschreibzyklus-Zählstand
wird bei jedem Beginnen eines Cache-Eintrags auf null gesetzt. Bei
jedem Schreiben in den Cache-Eintrag wird ein Schreibbit gesetzt.
Bei jeder Prüfung
der Schreibhistorie wird ein Nichtschreibzyklus-Zählwert inkrementiert,
falls das entsprechende Schreibbit nicht gesetzt ist, und dekrementiert,
falls das Schreibbit gesetzt ist. Jede Prüfung der Schreibhistorie setzt
das Schreibbit zurück.
Der Cache-Eintrag wird als alt bestimmt, wenn der Nichtschreibzyklus-Zählwert eine vorgegebene Zahl übersteigt.
Alternativ wird der Nichtschreibzyklus-Zählwert auf null gesetzt, falls
das entsprechende Schreibbit gesetzt ist.
-
Das preemptive Cache-Zurückschreiben verwendet
vorzugsweise einen First-in-First-out-Rückschreibpuffer.
Der Zustands-Cache-Eintrag und seine entsprechende Adresse werden
in einen ersten Puffereintrag kopiert. Das schmutzige Bit oder die
schmutzigen Bits, die diesem Cache-Eintrag entsprechen, können ebenfalls
in den Rückschreibpuffer
kopiert werden. Dies könnte
dazu verwendet werden, den Rückschreibpuffer
lediglich für
das Zurückschreiben
des schmutzigen Teils des Cache-Eintrags freizugeben. Der ausgegebene
Eintrag des Rückschreibpuffers
wird stets dann in den Hauptspeicher geschrieben, wenn der Hauptspeicher
zur Annahme eines Einschreibens frei ist. Der schmutzige Cache-Eintrag
kann beim Kopieren in den Rückschreibpuffer
als sauber markiert werden. Alternativ kann der schmutzige Cache-Eintrag
als sauber markiert werden, wenn der Rückschreibpuffer den schmutzigen
Cache-Eintrag in den Hauptspeicher schreibt.
-
Jede Speicherzugriffsadresse wird
mit der Adresse jedes Eintrags im Rückschreibpuffer verglichen.
Falls eine Schreibadresse mit der Adresse eines Rückschreibpuffer-Eintrags übereinstimmt,
wird der übereinstimmende
Eintrag aus dem Rückschreibpuffer
geleert. Falls der jenem Rückschreibpuffer-Eintrag
entsprechende Cache-Eintrag als sauber markiert worden ist, wird
er als schmutzig ummarkiert. Ein Lesereklamierungs-Zählstand
kann die Lesereklamierung eines Rückschreibpuffer-Eintrags ermöglichen.
Der Lesereklamierungs-Zählstand
wird beim Kopieren des Cache-Eintrags und seiner entsprechenden
Adresse in den Rückschreibpuffer
auf null gesetzt. Wenn eine Leseadresse mit der Adresse eines Rückschreibpuffer-Eintrags übereinstimmt, wird
der Lesereklamierungs-Zählstand
inkrementiert. Der Rückschreibpuffer-Eintrag
wird geleert, wenn und nur dann wenn der Lesereklamierungs-Zählstand
die vorgegebene Zahl nicht übersteigt.
-
Das Prüfen jedes Cache-Eintrags einmal
in jeder vorgegebenen Zeitspanne kann das Anhalten des Betriebs
des Mikroprozessors einmal in jeder vorgegebenen Zeitspanne und
das sequentielle Prüfen
sämtlicher
Cache-Einträge
umfassen. Vorzugsweise erfolgt das Prüfen jedes Cache-Eintrags im Hintergrund
während
der normalen Verarbeitung. Beim Erreichen einer vorgegebenen Anzahl
von Befehlszyklen wird der nächste
sequentielle Cache-Eintrag geprüft.
Wenn der Mikroprozessor aus dem nächsten sequentiellen Cache-Eintrag
liest oder in diesen schreibt, ruht die Cache-Eintrag-Prüfung, bis das
Lesen oder Schreiben beendet ist.
-
KURZBESCHREIBUNG
DER ZEICHNUNG
-
Die vorliegende Erfindung wird nun
anhand von Beispielen und mit Bezug auf die begleitende Zeichnung
näher beschrieben,
worin:
-
1 in
Form eines Blockschaltplans die Gesamtarchitektur eines Mikroprozessors
gemäß der Erfindung
zeigt;
-
2 in
Form eines Blockschaltplans die Beziehung zwischen der Busschnittstelleneinheit, dem
Daten-Cache, einem Cache für
Daten niederer Ebene und dem Rückschreibpuffer
gemäß dieser
Erfindung zeigt;
-
3 die
Definition von Cache-Eintrag-Bits gemäß einer bevorzugten Ausführungsform
dieser Erfindung zeigt;
-
4 die
Definition von Rückschreibpuffer-Bits
gemäß einer
bevorzugten Ausführungsform dieser
Erfindung zeigt;
-
5 den
Aufbau des Zeitsteuerungsabschnitts einer bevorzugten Ausführungsform
der Logik für
preemptives Cache-Zurückschreiben
dieser Erfindung zeigt;
-
6 den
Aufbau des Etikettbehandlungsabschnitts der bevorzugten Ausführungsform
der Logik für
preemptives Cache-Zurückschreiben
dieser Erfindung zeigt;
-
7 in
Form eines Ablaufplans die Arbeitsweise einer bevorzugten Ausführungsform
der Logik für
preemptives Cache-Zurückschreiben
dieser Erfindung zeigt; und
-
8 den
Aufbau einer alternativen Ausführungsform
des Etikettbehandlungsabschnitts der bevorzugten Ausführungsform
der Logik für
preemptives Cache-Zurückschreiben
dieser Erfindung zeigt.
-
GENAUE BESCHREIBUNG
BEVORZUGTER AUSFÜHRUNGSFORMEN
-
Diese Erfindung strebt das Identifizieren
alter Daten innerhalb des Cache an. Alte Daten sind Daten, die vom
Mikroprozessor für
das Schreiben nicht mehr benötigt
werden. Diese alten Daten werden dann zurückgeschrieben, bevor der Cache-Eintrag geräumt werden
muß. Die
Daten werden im Cache aufbewahrt, bilden jedoch nun saubere Daten.
Bei einem Kontextwechsel müssen
weitaus weniger Daten in den Hauptspeicher geschrieben werden, da
die identifizierten alten Daten bereits in den Hauptspeicher geschrieben
worden sind. Dies dient dazu, dem Bedarf an Zurückschreibungen zuvorzukommen
und diese vor der durch den Kontextwechsel erzeugten Speicherzugriffsspitze
zu plazieren. Dies führt
zu einer reduzierten Spitzen-Speicherzugriffsanforderung, was eine
bessere Nutzung eines Rückschreibpuffers
ermöglicht.
-
Eine selbständige Zustandsmaschine oder ein
selbständiger
Prozessor schreiben schmutzige Cache-Einträge preemptiv zurück. Die
Logik für preemptives
Cache-Zurückschreiben
arbeitet vorzugsweise nur selten und nur dann, wenn die Speicherbusaktivität niedrig
ist. Wenn die Logik für preemptives
Cache- Zurückschreiben
aktiv ist, bestimmt sie, ob ein Cache-Eintrag alt ist. Sie verwendet
eine Schreibhistorie für
den Cache-Eintrag. Wenn der Cache-Eintrag sowohl schmutzig als auch
alt ist, wird er in einen Rückschreibpuffer
kopiert. Der Rückschreibpuffer
speichert die Cache-Eintrag-Daten und deren Adresse in einer Warteschlange
für das Schreiben
in den Hauptspeicher. Der entsprechende Cache-Eintrag kann beim Kopieren in den Rückschreibpuffer
oder dann, wenn der Rückschreibpuffer diesen
wirklich in den Hauptspeicher schreibt, als sauber markiert werden.
-
Wenn sonst nichts dazwischenkommt,
wird der Cache-Eintrag im Rückschreibpuffer
in den Hauptspeicher oder in einen externen Cache geschrieben. Es
gibt bestimmte Fälle,
in denen es besser ist, anders vorzugehen. Wenn sich beim Lesen
im Speicher ein Cache-Treffer für
einen zum Zurückschreiben
anstehenden Cache-Eintrag ergibt, wäre es das Beste, für einen
Cache-Eintrag, der gerade verwendet wird, keinen Speicherbuszyklus
zu verwenden. Dementsprechend kann der Zurückschreib-Eintrag geleert werden.
In einer alternativen Ausführungsform
wird der Rückschreibpuffer-Eintrag nur
bis zu einer vorgegebenen Anzahl von Lesevorgängen geleert. Wenn der Cache-Eintrag öfters als die
vorgegebene Anzahl von Malen ohne ein dazwischenliegendes Schreiben
gelesen wurde, wird der entsprechende Rückschreibpuffer nicht geleert.
In diesem Fall lassen die Schreibzugriffe nicht darauf schließen, daß das Programm
das Schreiben auf diese Adresse beendet hat. Somit kann das preemptive Cache-Zurückschreiben
weitergehen.
-
Wenn sich beim Schreiben in den Speicher ein
Cache-Treffer für
einen zum Zurückschreiben
anstehenden Cache-Eintrag ergibt, wird der Zurückschreib-Eintrag geleert. In diesem Fall ist
der Cache-Eintrag nicht mehr alt. Es ist besser, zum Schreiben eines
veränderten
Cache-Eintrags keinen Speicherbuszyklus zu verwenden. Diese Daten
können
nochmals benötigt
werden, weshalb sie kein guter Kandidat für preemptives Zurückschreiben
sind.
-
1 zeigt
einen Blockschaltplan eines Mikroprozessors in den die Ausführungsformen
dieser Erfindung eingebaut werden können. Zunächst wird mit Bezug auf 1 ein exemplarisches Computersystem 102,
das einen exemplarischen superskalaren Pipeline-Mikroprozessor 110 enthält, in dem
die bevorzugte Ausführungsform
implementiert ist, beschrieben. Selbstverständlich wird die Architektur des
Computersystems 102 und des Mikroprozessors 110 hier
nur beispielhaft beschrieben, da es beabsichtigt ist, die vorliegenden
Ausführungsformen
in Mikroprozessoren unterschiedlicher Architektur zu verwenden.
Es wird daher erwartet, daß jeder
gewöhnliche
Fachmann, der sich auf diese Patentbeschreibung bezieht, ohne weiteres
in der Lage ist, die vorliegenden Ausführungsformen in anderen Mikroprozessorarchitekturen
zu implementieren.
-
Der in 1 gezeigte
Mikroprozessor 110 ist über
den Bus B mit anderen Systembausteinen verbunden. Obwohl der Bus
B in diesem Beispiel als ein einzelner Bus gezeigt ist, kann der
Bus B natürlich mehrere
Busse mit verschiedenen Geschwindigkeiten und Protokollen repräsentieren,
wie dies bei herkömmlichen
Computern, die die PCI-Local-Bus-Architektur verwenden, bekannt
ist; hier ist lediglich als Beispiel und zwecks Einfachheit, ein
einzelner Bus B gezeigt. Das Computersystem 102 enthält herkömmliche
Untersysteme wie etwa Kommunikationsschnittstellen 103 (einschließlich Modem-Anschlüsse und
Modems, Netzschnittstellen und dergleichen), ein graphisches Anzeigesystem 104 (einschließlich Videospeicher,
Videoprozessoren, Graphikmonitor), ein Hauptspeichersystem 105,
das üblicherweise mittels
eines dynamischen Direktzugriffsspeichers (DRAM) implementiert ist
und einen Stapelspeicher 107 umfaßt, Eingabegeräte 106 (einschließlich Tastatur,
Zeigegerät
und zugehörige
Schnittstellenschaltungen) und ein Plattensystem 108 (das
Festplattenlaufwerke, Floppy-disk-Laufwerke und CD-ROM-Laufwerke
umfassen kann). Das Computersystem 102 von 1 soll also einem herkömmlichen
Desktop-Computer oder einer herkömmlichen Desktop-Workstation
entsprechen, wie sie gegenwärtig
allgemein verwendet werden. Natürlich
können
auch andere Systemimplementierungen von den vorliegenden Ausführungsformen
profitieren, wie Fachleute erkennen werden.
-
Der Mikroprozessor 110 enthält eine
Busschnittstelleneinheit (BIU) 112, die mit dem Bus B verbunden
ist und die Kommunikation zwischen dem Mikroprozessor 110 und
den anderen Elementen im Computersystem 102 steuert und
aus führt.
Die BIU 112 enthält
die geeignete Steuer- und Taktschaltungsanordnung zur Ausübung dieser
Funktion einschließlich
der Schreibpuffer zur Steigerung der Betriebsgeschwindigkeit und
einschließlich
der Zeitgeberschaltungsanordnung zur Synchronisation der Ergebnisse
des internen Betriebs mit den Zeitbedingungen des Busses B. Der
Mikroprozessor 110 enthält
außerdem
eine Takterzeugungs- und
Steuerungsschaltungsanordnung 120, die bei diesem exemplarischen
Mikroprozessor 110 interne Taktphasen auf der Grundlage
des Bus-Taktes vom Bus B erzeugt; die Frequenz der internen Taktphasen
kann in diesem Beispiel wählbar
als Vielfaches der Frequenz des Bus-Taktes programmiert werden.
-
Wie aus 1 hervorgeht, besitzt der Mikroprozessor 110 drei
Ebenen von internem Cache-Speicher, wobei die höchste von diesen der Ebene-2-Cache 114 ist,
der mit der BIU 112 verbunden ist. In diesem Beispiel ist
der Ebene-2-Cache 114 ein Unified-Cache und konfiguriert,
um alle in einem Cache erfaßbaren
Daten und in einem Cache erfaßbaren
Befehle über
die BIU 112 vom Bus B zu empfangen, so daß ein großer Teil
des vom Mikroprozessor 110 angewiesenen Busverkehrs über den
Ebene-2-Cache 114 abgewickelt wird. Natürlich kann der Mikroprozessor 110 den
Busverkehr auch unter Umgehung des Cache 114 ausführen, indem
bestimmte Bus-Lesevorgänge
und Bus-Schreibvorgänge
als "nicht cache-fähig"
behandelt werden. Der in 1 gezeigte
Ebene-2-Cache 114 ist mit zwei Ebene-1-Caches 116 verbunden;
der Ebene-1-Daten-Cache 116d ist
für Daten
reserviert, während
der Ebene-1-Befehls-Cache 116i für Befehle
reserviert ist. Der Energieverbrauch durch den Mikroprozessor 110 wird
dadurch minimiert, daß auf
den Ebene-2-Cache 114 nur im Fall von Cache-Fehlschüssen des
geeigneten der Ebene-1-Caches 116 zugegriffen wird. Ferner
ist auf der Datenseite ein Mikro-Cache 118 als
Ebene-0-Cache vorgesehen, der in diesem Beispiel ein Cache ist,
der völlig
getrennte Adreß- und
Datenwege (Dual-Ports) besitzt.
-
Wie in 1 gezeigt
und oben angemerkt worden ist, ist der Mikroprozessor 110 vom
superskalaren Typ. In diesem Beispiel sind innerhalb des Mikroprozessors 110 mehrere
Ausführungseinheiten vorgesehen,
die eine parallele Ausführung
von bis zu vier Befehlen gleichzeitig für einen einzigen Befehlszeigereintrag ermöglichen.
Diese Ausführungseinheiten
umfassen zwei Arithmetik-Logik-Einheiten (ALU) 1440 , 1442 für die Verarbeitung
von bedingten Sprungoperationen, Ganzzahloperationen und logischen
Operationen, eine Gleitpunkteinheit (FPU) 130, zwei Lade-
und Speichereinheiten 1400 , 1401 und eine Mikro-Ablaufsteuerung 148. Die beiden
Lade- und Speichereinheiten 140 benutzen die zwei Anschlüsse des
Mikro-Cache 118, um darauf wirklich parallel zuzugreifen,
und (ihren außerdem
Lade- und Speicheroperationen auf Register in der Registerdatei 139 aus.
Der Mikro-Datenadressenumsetzpuffer (mTLB) 138 ist dazu
vorgesehen, in herkömmlicher Weise
die logischen Datenadressen in physikalische Adressen umzuwandeln.
-
Diese mehreren Ausführungseinheiten
werden über
mehrere Pipelines mit jeweils sieben Stufen mit Zurückschreiben
gesteuert. Die Pipeline-Stufen sind folgende:
F Abrufen: Diese
Stufe erzeigt die Befehlsadresse und liest den Befehl aus dem Befehls-Cache
oder dem Befehlsspeicher
PD0 Vordecodierstufe 0: Diese Stufe
bestimmt die Länge
und die Startposition von bis zu drei abgerufenen x86-Befehlen
PD1
Vordecodierstufe 1: Diese Stufe extrahiert die x86-Befehlsbytes
und codiert sie für
das Decodieren in ein Format mit fester Länge x86-Befehle in atomare
DC Decodieren: Diese Stufe wandelt die Operationen (AOps) um
SC
Rechenzeit zuweisen (Schedule): Diese Stufe weist den geeigneten
führungseinheiten
bis zu vier AAusOps zu
P Operand: Diese Stufe liest die durch
die AOOps angegebenen Registeroperanden aus
EX Ausführen: Diese
Stufe betreibt die Ausführungseinheiten
entsprechend den AOps und den ausgelesenen Operanden
WB Zurückschreiben:
Diese Stufe speichert die Ergebnisse der Ausführung in Registern oder im
Speicher
-
Wieder mit Bezug auf 1, die oben angeführten Pipeline-Stufen werden
von verschiedenen Funktionsblöcken
im Mikroprozessor 110 ausgeführt. Die Abrufeinheit 126 erzeugt
Befehlsadressen vom Befehlszeiger mittels des Mikro-Befehlsadressenumsetzpuffers
(mTLB) 122, der in herkömmlicher
Weise die logische Befehlsadresse in eine physikalische Befehlsadresse
für die
Anwendung auf den Ebene-1-Befehls-Cache 116i umwandelt.
Der Befehls-Cache 116i erzeugt
einen Strom von Befehlsdaten für
die Abrufeinheit 126, die ihrerseits den Befehlscode in
der gewünschten
Abfolge an die Vordecodierstufen liefert. Die spekulative Ausführung wird in
erster Linie durch die Abrufeinheit 126 gesteuert, und
zwar in einer Weise, die weiter unten näher erläutert wird.
-
Die Vordecodierung der Befehle wird
im Mikroprozessor 110 in zwei Teile, nämlich die Vordecodieren-0-Stufe 128 und
Vordecodieren-1-Stufe 132, aufgebrochen. Diese beiden Stufen
arbeiten als getrennte Pipeline-Stufen und arbeiten zusammen, um bis
zu drei x86-Befehle zu lokalisieren, und verwenden denselben Decodierer 134.
Als solche besitzt die Vordecodierstufe der Pipeline im Mikroprozessor 110 eine
Breite von drei Befehlen. Die oben angeführte Vordecodieren-0-Einheit 128 bestimmt
die Größe und die
Position von maximal drei x86-Befehlen
(die natürlich
eine variable Länge
besitzen) und besteht als solche aus drei Befehlsinterpretierern;
die Vordecodieren-1-Einheit 132 codiert die Mehrbytebefehle in
ein Format mit fester Länge
um, um das Decodieren zu erleichtern.
-
Die Decodiereinheit 134 umfaßt in diesem Beispiel
vier Befehlsdecodierer, wovon jeder einen x86-Befehl mit fester
Länge von
der Vordecodieren-1-Einheit 132 empfangen und zwischen
einer und drei atomaren Operationen (AOps) erzeugen kann; AOps sind
im wesentlichen äquivalent
zu RISC-Befehlen, Drei der vier Decodierer arbeiten parallel, wobei
sie bis zu neun AOps in die Decodierwarteschlange am Ausgang der
Decodiereinheit 134 einreihen, um auf das Scheduling zu
warten; der vierte Decodierer ist für Spezialfälle reserviert. Der Scheduler 136 liest
bis zu vier AOps aus der Decodierwarteschlange am Ausgang der Decodier einheit 134 und weist
diese AOps den geeigneten Ausführungseinheiten
zu. Außerdem
empfängt
die Operandeneinheit 144 die Operanden und bereitet diese
für die
Ausführung
vor. Wie in 1 angegeben
ist, empfängt
die Operandeneinheit 144 einen Eingang vom Scheduler 136 und
außerdem
vom Mikrocode-ROM 148 über einen
Multiplexer 145 und ruft Registeroperanden zur Verwendung
bei der Ausführung
der Befehle ab. Außerdem
führt die
Operandeneinheit 144 gemäß diesem Beispiel eine Operandenweiterleitung,
um zum Speichern bereite Ergebnisse an Register zu senden, und auch
eine Adressenerzeugung für
AOps des Lade- und Speichertyps durch.
-
Die Mikro-Ablaufsteuerung 148 steuert
in Kombination mit dem Mikrocode-ROM 146 die
ALUs 142 und die Lade- und Speichereinheiten 140 bei
der Ausführung
von Mikrocode-Eintrag-AOps, die im allgemeinen die letzten in einem
Zyklus auszuführenden
AOps sind. In diesem Beispiel steuert die Mikro-Ablaufsteuerung 148 den Zeitablauf über im Mikrocode-ROM 146 gespeicherte
Mikrobefelle, um diese Steuerung für jene mikrocodierten Mikrobefehle
auszuführen.
Beispiele von mikrocodierten Mikrobefehlen umfassen für den Mikroprozessor 110 umfangreiche
und selten benutzte x86-Befehle, x86-Befehle, die Segment- oder
Steuerregister modifizieren, die Behandlung von Ausnahmen und Unterbrechungen
und Mehrzyklus-Befehle (wie etwa REP-Befehle und Befehle, die die
Inhalte sämtlicher
Register in den Stapelspeicher schreiben und zurückschreiben (PUSH und POP)).
-
Der Mikroprozessor 110 enthält außerdem eine
Schaltungsanordnung 124 für die Steuerung der Ausführung der
JTAG-Scan-Prüfung
und bestimmter automatischer Selbsttestfunktionen, die die Gültigkeit des
Betriebs des Mikroprozessors 110 nach dem Abschluß der Fertigung
sowie nach einem Rücksetzen und
nach anderen Ereignissen sicherstellen.
-
2 zeigt
eine Schnittstelle zwischen der Busschnittstelleneinheit 112,
dem Ebene-2-Cache 114 und dem Ebene-1-Daten-Cache 116d genauer, wobei elektrische Verbindungen
dargestellt sind. 2 zeigt
Verbindungen zwischen dem Ebene-1-Daten-Cache 116d und
dem Ebene-2-Cache 114. Fachleuten ist klar, daß dies mit
einem Cache wie etwa dem in 2 gezeigten
Ebene-2-Cache 114, der mit dem Lade- und Speichereinheiten 1400 , 1401 direkt
verbunden ist, bewerkstelligt werden könnte. Der einzige Unterschied
zwischen diesen Ausführungsformen
wäre, daß der Ebene-2-Cache 114 getrennte
Adreß-
und Datenwege (Dual-Ports) für
den Datenzugriff haben müßte oder
die Speichereinheiten 1400 , 1401 eine einzige gemeinsame Datenschnittstelle
mit dem Ebene-2-Cache 114 haben müßten. 2 zeigt nicht die Verbindungen zwischen
dem Ebene-2-Cache 114 und dem Ebene-1-Befehls-Cache 116i . In der bevorzugten Ausführungsform
ist der Ebene-2-Cache 114 ein kombinierter Daten- und Befehls-Cache.
In der bevorzugten Ausführungsform
sind die Verbindungen zwischen dem Ebene-2-Cache 114 und
dem Ebene-1-Befehls-Cache 116i herkömmlicher
Art. Diese Verbindungen sind in 2 zwecks
Kürze nicht
gezeigt.
-
Der Ebene-2-Cache 114 umfaßt eine
Logik für
preemptives Cache-Zurückschreiben 212,
eine Steuerlogik 214, Etiketten und Adressen 216 und
Cache-Daten 218. 2 zeigt
ferner den Rückschreibpuffer 220,
der eine Steuerlogik 222, Etiketten und Adressen 224 und
Rückschreibpuffer-Daten 226 umfaßt. Ein
Multiplexer 230 wickelt unter der Steuerung der Steuerlogik 214 die
Auswahl von Daten aus den Cache-Daten 218 oder den Rückschreibpuffer-Daten 226 ab,
mit denen der Ebene-1-Daten-Cache 116d und
die Rückschreibpuffer-Daten 226 versorgt
werden.
-
3 zeigt
die Definitionen der Etiketten- und Adressenfelder 216 und
der Cache-Daten 218 eines bei dieser Erfindung verwendeten
Cache-Eintrags. Jeder Cache-Eintrag im Ebene-2-Cache 214 umfaßt einen
Satz von Etiketten und Adressen 216 und die entsprechenden
Cache-Eintrag-Daten 218. Es sei angemerkt, daß in 3 Darstellungen von anderen,
normalerweise verwendeten Feldern wie etwa eine Markierung für "am längsten nichtverwendet",
die von herkömmlicher
Art sind, weggelassen sind. Die Etiketten- und Adressenfelder 216 enthalten
ein Schreib-(WR)-Feld 312. Das Schreibfeld 312 besteht
vorzugsweise aus einem einzelnen Bit. Dieses Schreibfeld 312 wird
bei der ersten Verwendung des Cache-Eintrags auf 0 gesetzt. Dieses
Feld wird bei jedem Schreiben in die entsprechenden Cache-Eintrag-Daten
auf 1 gesetzt. Die Steuerlogik 214 wickelt diese Operationen
an dem Schreibfeld 312 ab. Das Schreibfeld 312 wird
stets dann, wenn die Logik für
preemptives Cache-Zurückschreiben 212 den
Cache-Eintrag bearbeitet,
auf 0 zurückgesetzt. Das
Nichtschreibzyklus-(NWcycle)-Feld 314 besteht vorzugsweise
aus 2 oder 3 Bits. Das Nichtschreibzyklus-Feld 314 speichert
eine Schreibhistorie des entsprechenden Cache-Eintrags. Das Nichtschreibzyklus-Feld 314 wird
allein von der Logik für
preemptives Cache-Zurückschreiben 212 gesteuert,
und zwar in einer Weise, die weiter unten erläutert wird. Das Lesereklamierungs-(RRclm)-Feld 316 besteht
vorzugsweise aus 1 oder 2 Bits. Das Lesereklamierungs-Feld 316 speichert
eine Lesereklamierungs-Historie
des entsprechenden Cache-Eintrags. Das Lesereklamierungs-Feld 316 wird
anfänglich
beim Beginnen des Cache-Eintrags auf null zurückgesetzt. Das Lesereklamierungs-Feld 316 wird
durch die Steuerlogik 216 bei jedem Schreiben in den entsprechenden
Cache-Eintrag auf null zurückgesetzt.
Das Lesereklamierungs-Feld 316 wird von der Logik für preemptives
Cache-Zurückschreiben 212 in
einer Weise verwendet, die weiter unten erläutert wird. Das schmutzige
(D) Feld 318 ist das herkömmliche schmutzige Feld, das
angibt, daß in
den entsprechenden Cache-Eintrag seit dem letzten Zurückschreiben
in das Hauptspeicheruntersystem 105 geschrieben wurde. Wie
an sich bekannt ist, kann das schmutzige Feld 318 ein einziges
Bit für
den gesamten Cache-Eintrag sein oder kann mehrere Bits, eines für jedes
kleinste adressierbare Datenwort, umfassen. Das schmutzige Feld 318 wird
allein durch die Steuerlogik 214 gesteuert, jedoch von
der Logik für
preemptives Cache-Zurückschreiben 212 verwendet.
Das entsprechende Bit bzw. die entsprechenden Bits werden bei jedem
Schreiben in das entsprechende kleinste adressierbare Datenwort
des Cache-Eintrags auf null zurückgesetzt
bzw. insgesamt mit Nullen belegt. Das schmutzige Feld 318 wird
beim Schreiben der entsprechenden Daten in das Hauptspeicheruntersystem 105 durch
die Steuerlogik 216 auf null zurückgesetzt bzw. insgesamt mit
Nullen belegt. Das Adressenfeld 320 ist das herkömmliche
Cache-Adressenfeld. Die Länge
dieses Adressenfeldes 320 hängt von der durch den Mikroprozessor
verwendeten Adressenlänge
und der Größe der Cache-Eintrag-Daten ab.
Lediglich als Beispiel, der Mikroprozessor 110 kann 32-bit-Adressen
verwenden, wobei jede Adresse ein Byte im Hauptspei cheruntersystem 105 auswählt und
die Länge
jedes Cache-Dateneintrags 32 bäte betragen kann. In diesem
Fall besteht das Adressenfeld 320 aus 27 Bits. Die Cache-Eintrag-Daten 218 bestehen
aus den entsprechenden Daten des Cache-Eintrags.
-
4 zeigt
die Definitionen der Etiketten- und Adressenfelder 224 und
der Rückschreibpuffer-Daten 226 eines
verwendeten Rückschreibpuffers.
Jeder Rückschreibpuffer-Eintrag
im Rückschreibpuffer 220 umfaßt einen
Satz von Etiketten und Adressen 224 und entsprechende Rückschreibpuffer-Eintrag-Daten 226.
Das Feld für
preemptives Zurückschreiben
(P) 332 besteht vorzugsweise aus einem einzelnen Bit. Das
Feld für
preemptives Zurückschreiben 332 wird
bei einer Übertragung
von Daten aus dem Ebene-2-Cache 114 in den Rückschreibpuffer 220 für ein preemptive
Cache-Zurückschreiben
auf 1 gesetzt. Das Feld für
preemptives Zurückschreiben 332 wird
bei einer Übertragung
von Daten aus dem Ebene-2-Cache 114 in
den Rückschreibpuffer 220 für ein normales
Cache-Räumungszurückschreiben
auf 0 gesetzt. Das Feld für preemptives
Zurückschreiben 332 wird
durch die Steuerlogik 222 in Verbindung mit der Steuerlogik 214 verwendet,
um zu bestimmen, ob ein preemptiver Cache-Zurückschreib-Eintrag im Rückschreibpuffer 220 zu
leeren ist. Dies wird weiter unten näher beschrieben. Der Rückschreibpuffer-Eintrag
kann auch das schmutzige Feld 334 mit einem oder mehreren
schmutzigen Bits umfassen. Wenn das schmutzige Feld 318 des
Cache-Eintrags mehrere
Bits zum Markieren von Abschnitten der Cache-Eintrag-Daten 218 enthält, erfordert
der Zurückschreib-Eintrag
eine Kopie dieses Feldes als schmutziges Feld 334. Dieses
könnte
dazu verwendet werden, den Rückschreibpuffer 220 lediglich
zum Zurückschreiben
des schmutzigen Teils des Cache-Eintrags
freizugeben. Zum Schluß,
die Etiketten- und Adressenfelder 224 umfassen ferner ein
Adressenfeld 336 des gleichen Typs wie das Adressenfeld 320 jedes
Cache-Eintrags.
-
Die Logik für preemptives Cache-Zurückschreiben 212 bearbeitet
jeden Eintrag im Ebene-2-Cache 114 auf einer periodischen
Basis. Gemäß einer
bevorzugten Ausführungsform
arbeitet die Logik für
preemptives Zurückschreiben 212 relativ selten.
Ein Tätigwerden
bei erfolgreichen Cache-Einträgen
nach jeweils 500 bis 4000 Befehlszyklen wird als ausreichend angesehen. 5 zeigt eine Cache-Eintrag-Zugriffsschaltung
für den
Zugriff auf den Ebene-2-Cache 114. Ein Zähler 410 zählt Zyklen
des Befehlstaktes. Der Zähler 410 ist
9 bis 12 bit breit. Neun Bits ergeben 512 Befehlszyklen zwischen
Cache-Eintrag-Prüfungen.
Zwölf Bits
ergeben 4096 Befehlszyklen zwischen Cache-Eintrag-Prüfungen.
Der Zähler 410 erzeugt
ein Überlaufsignal,
das einen Signalspeicher 412 jedesmal setzt, wenn er seinen
vollen Zählwert
erreicht. Falls der Signalspeicher 412 gesetzt ist, erzeugt
er ein Aktivierungssignal. Zusätzliche
Befehlstaktzyklen führen
dazu, daß sich
der Zähler 410 überrollt
(roll over) und wieder ab null zählt.
-
Unter momentaner Außerachtlassung
des UND-Gliedes 414 versorgt das Aktivierungssignals des
Signalspeichers 412 den Zähleingang des Zählers 420.
Caches sind üblicherweise
in Größen, die der
zweiten Potenz entsprechen, aufgebaut. Die Anzahl von höchstwertigen
Bits im Zähler 420 entspricht der
kleinsten Anzahl von Bits, die zum Umfassen der Anzahl von Cache-Einträgen erforderlich
ist. Ganz gleich, wo der Zähler 420 zählt, liefert
er eine inkrementierten Cache-Eintrag-Zahl.
Wenn die Cache-Eintrag-Prüfoperation
abgeschlossen ist, erzeugt die Logik für preemptives Cache-Zurückschreiben 212 ein
Cache-Eintrag-Prüfung-abgeschlossen-Signal.
Dieses Cache-Eintrag-Prüfung-abgeschlossen-Signal
setzt den Signalspeicher 412 zurück. Dies gibt den Signalspeicher 412 frei,
um beim nächsten Überlauf
des Zählers
wieder das Aktivierungssignal auszugeben. Für jeden solchen Zyklus gibt
der Zähler 420 die
Bearbeitung der nächsten
Cache-Eintrag-Zahl
frei. Dies setzt sich fort, bis alle Cache-Einträge geprüft worden sind, worauf der
Zähler 420 zum
ersten Cache-Eintrag überrollt
(rolls over).
-
Zurück zum UND-Glied 414,
das vom Signalspeicher 412 ausgegebene Aktivierungssignal
wird einem nichtinvertierenden Eingang des UND-Gliedes 414 zugeführt. Ein
invertierender Eingang des UND-Gliedes 414 empfängt ein
Etiketten-Belegt-Signal. Der Ausgang des UND-Gliedes 414 versorgt
den Zähleingang
des Zählers 420.
Es besteht die Möglichkeit,
daß die
Logik für
preemptives Zurückschreiben 212 und
die Steuerlogik 214 auf die Etiketten und Adressen 216 gleichzeitig
auf denselben Cache-Eintrag zuzugreifen versuchen. Die Steuerlogik 216 erfaßt eine Übereinstimmung
zwischen dem um eins erhöhten
Cache-Etiketteneintrag-Signal des Zählers 420 und der
Identität
des mit einer momentanen Adresse übereinstimmenden Cache-Eintrags.
Wenn dies der Fall ist, sendet die Steuerlogik 212 ein
aktives Etiketten-Belegt-Signal an die Logik für preemptives Cache-Zurückschreiben 212.
Das invertierte Etiketten-Belegt-Signal schließt das UND-Gatter 414 und
hält den
Zählbetrieb
des Zählers 420 an.
Gleichzeitig stoppen auch alle anderen Operationen der Logik für preemptives
Cache-Zurückschreiben 212.
Der Zählvorgang
im Zähler 420 und
der Betrieb der Logik für
preemptives Cache-Zurückschreiben 212 werden wieder
aufgenommen, wenn die Steuerlogik 216 ihren Zugriff auf
den Cache-Eintrag abgeschlossen hat und das Etiketten-Belegt-Signal
deaktiviert. Der Signalspeicher 412 behält seinen Zustand während der Zeit,
in der die Etiketten belegt sind, bei, so daß kein Zählwert fehlt. Die Operation
des preemptiven Cache-Zurückschreibens
ist eine Hintergrund-Task, so daß diese Task gewöhnliche
Cache-Operationen abwartet. Da die Logik für preemptives Cache-Zurückschreiben 212 so
selten arbeitet, verändert
andererseits ein solches gelegentliches Anhalten Operationen des
preemptiven Cache-Zurückschreibens
nicht. Es sei angemerkt, daß es
möglich
ist, die erforderlichen Cache-Etiketten als Speicher mit getrennten Adreß- und Datenwegen
(Dual-Ported-Speicher) aufzubauen, um einen simultanen Zugriff zu
ermöglichen.
Konflikte treten selten auf, und die Folgen des Anhaltens der Operation
des preemptiven Cache-Zurückschreibens
bis zu sieben Befehlszyklen sind infinitesimal. Deshalb sind die
zusätzlichen
Schaltungen für
das erforderliche Versehen dieser Cache-Etiketten mit getrennten
Adreß-
und Datenwegen nicht gerechtfertigt.
-
6 zeigt
den Aufbau der Betriebsteile der Logik für preemptives Cache-Zurückschreiben 212. Die
Logik für
preemptives Cache-Zurückschreiben 212 umfaßt einen
Multiplexer 501, einen Addierer 502, einen Multiplexer 503,
eine Anpassungsschaltung 504, ein UND-Glied 505,
ein ODER-Glied 506, ein UND-Glied 507, einen Multiplexer 508,
einen Addierer 509, eine Anpassungsschaltung 510 und
ein 010-Datenregister 511. Nach Auswahl des zu prüfenden Cache- Eintrags durch die
Cache-Eintrag-Nummer-Ausgabe des Zählers 410 werden das
Datenfelderschreiben 312, das Nichtschreibzyklus-Feld 314 und
das Lesereklamierungs-Feld 316 abgerufen und der Logik
für preemptives
Cache-Zurückschreiben 212 zugeführt. Die
Logik für
preemptives Cache-Zurückschreiben 212 empfängt außerdem das
Rückschreibpuffer-Treffer-Signal
von der Steuerlogik 222 über die Steuerlogik 214 und
das Lese/Nichtschreib-Signal vom Ebene-1-Daten-Cache 116d über die
Steuerlogik 214. Die Logik für preemptives Cache-Zurückschreiben 212 berechnet
neue Werte für das
Nichtschreib-Feld 314 und das Lesereklamierungs-Feld 316,
die im entsprechenden Cache-Eintrag gespeichert werden. Die Logik
für preemptives Cache-Zurückschreiben 212 erzeugt
außerdem
das Rückschreibpuffer-Eintrag-Leerung-Signal,
das die Steuerlogik 214 dem Rückschreibpuffer 220 zuführt. Es
sei angemerkt, daß das
Schreibfeld 312 stets dann, wenn von der Logik für preemptives
Cache-Zurückschreiben 212 ein
Cache-Eintrag geprüft
wird, auf 0 zurückgesetzt
wird. Die Schaltung, die diese Funktion erfüllt, ist zwecks Kürze weggelassen.
Es sei außerdem
angemerkt, daß die
in 6 gezeigten Schaltungen
bei einer normalen Prüfung
von Cache-Einträgen und
bei einer Prüfung
von Cache-Einträgen,
die auf einen Rückschreibpuffer-Treffer
folgen, wirksam werden.
-
Der Multiplexer 501 wird
durch das Schreibfeld 312 (WR) gesteuert. Falls das Schreibfeld
1 ist, was angibt, daß der
Cache-Eintrag seit dem letzten Zyklus geschrieben wurde, wählt der
Multiplexer 501 seinen –1-Dateneingang. Falls das
Schreibfeld 0 ist, was angibt, daß der Cache-Eintrag seit dem
letzten Zyklus nicht geschrieben wurde, wählt der Multiplexer 501 seinen
+1-Dateneingang. Der Multiplexer 501 liefert einen Eingang
an den Addierer 502. Der zweite Eingang des Addierers 502 empfängt den Wert
des abgerufenen Nichtschreibzyklus-Feldes 314 (NWcyle).
Das Abrufen jenes Nichtschreibzyklus-Feldes 314 umfaßt vorzugsweise
2 oder 3 Bits. Der Addierer 502 bildet eine Summe mit einer
entsprechenden Anzahl von Bits. Es sei angemerkt, daß die kleinste
Ausgabe des Addierers 502 null ist. Somit können mehrere
aufeinanderfolgende Schreibzyklen das Nichtschreibzyklus-Feld 314 nicht
unter null dekrementieren. Dies ist als Sättigungssubtraktionsoperation
bekannt. Der Addierer 502 liefert seinen Summen ausgang
an einen Eingang des Multiplexers 503. Der Multiplexer 503 wählt im allgemeinen
diesen Eingang, der im Nichtschreibzyklus-Feld 314 des entsprechenden
Cache-Eintrags gespeichert wird. Somit wird das Nichtschreib-Feld 314 im
allgemeinen inkrementiert, falls der Cache-Eintrag während des vorhergehenden
Zyklus nicht geschrieben wurde, und dekrementiert, falls der Cache-Eintrag
während des
vorhergehenden Zyklus geschrieben wurde.
-
Die Anpassungsschaltung 504 erfaßt, wenn das
Nichtschreibzyklus-Feld 314 einen vorgegebenen Wert übersteigt.
Dies tritt stets dann ein, wenn die Anzahl von jüngsten Nichtschreibzyklen die
Anzahl der jüngsten
Schreibzyklen um den vorgegebenen Wert übersteigt. In der bevorzugten
Ausführungsform
erfaßt
die Anpassungsschaltung 504 den Überlaufzustand des Addierers 502,
was angibt, daß die
Summe 7 (binär
111) übersteigt.
Alternativ kann die Anpassungsschaltung 504 stets dann
ausgelöst werden,
wenn der Summenausgang des Addierers 502 gleich einer bestimmten
Zahl ist. Wenn die Anpassungsschaltung 504 ihren Zustand
erfaßt,
erzeugt sie ein Signal für
preemptives Cache-Zurückschreiben.
Dieses signalisiert der Steuerlogik 214, die Adressen und
Daten des entsprechenden Cache-Eintrags in den Rückschreibpuffer 220 zu übertragen.
Die Steuerlogik 214 signalisiert außerdem der Steuerlogik 222,
das Feld für
preemptives Zurückschreiben
(P) auf 1 zu setzen. Dies gibt den Rückschreibpuffer 220 frei,
um einen Rückschreibpuffer-Treffer
für preemptive
Zurückschreibungen
anders als für
normale den Cache betreffende Räumungs-Zurückschreibungen
zu behandeln. Sobald der Cache-Eintrag im FIFO-Rückschreibpuffer 220 ist,
wird der Cache-Eintrag
im allgemeinen über
die Busschnittstelleneinheit 112 in das Hauptspeicheruntersystem 105 geschrieben.
Es ist an sich bekannt, daß die
Datenmenge in jedem Rückschreibpuffer-Eintrag
ein Vielfaches der Datenbreite zwischen der Busschnittstelleneinheit 112 und
dem Bus B zum Hauptspeicheruntersystem 105 sein kann. Die
Busschnittstelleneinheit 112 wickelt das Puffern und das Sequentialisieren
sowohl der Lesevorgänge
als auch der Schreibvorgänge,
die zur Kompensation dieses Unterschieds in der Datenbreite erforderlich
sind, in an sich bekannter Weise ab. Die Steuerlogik 214 kann
den entsprechenden Cache-Eintrag nach dem Kopieren in den Rückschreibpuffer 220 über das schmutzige
Feld 318 (D) als sauber markieren oder alternativ bis zum
eigentlichen Schreiben in das Hauptspeicheruntersystem 105 warten.
-
Die Logik für preemptives Cache-Zurückschreiben 212 erzeugt
das Rückschreibpuffer-Eintrag-Leerung-Signal über das
UND-Glied 505 und das ODER-Glied 506. Das Rückschreibpuffer-Treffer-Signal
von der Steuerlogik 220 wird über die Steuerlogik 214 einem
nichtinvertierenden Eingang des UND-Gliedes 505 zugeführt. Ein
invertierender Eingang des UND-Gliedes 505 empfängt das
Lese/Nichtschreib-Signal (R/) von der Steuerlogik 214. Das
UND-Glied 505 liefert einen Eingang an das ODER-Glied 506.
Somit erzeugen das UND-Glied 505 und das ODER-Glied 506 nach
der Erfassung eines Rückschreibpuffer-Treffers
ein aktives Rückschreibpuffer-Eintrag-Leerung-Signal,
wenn der Ebene-1-Daten-Cache 116d ein Schreiben anfordert. Wie oben
beschrieben wurde, bedeutet ein Treffer auf den Rückschreibpuffer 220 bei
einem Schreiben, daß der
Rückschreibpuffer-Eintrag
die falschen, in das Hauptspeicheruntersystem 105 zu schreibenden
Daten enthält.
Somit sollte dieser Zurückschreib-Eintrag gelöscht und
nicht in das Hauptspeicheruntersystem 105 geschrieben werden.
Es sei angemerkt, daß der Rückschreibpuffer 220 seinen
Eintrag bei einem Treffer auf einen preemptiven Zurückschreib-Eintrag
leeren kann, da diese Daten noch im Ebene-2-Cache 114 gespeichert sind.
Dieser Zustand wird durch das P-Feld 322 angegeben. Somit
kann der Ebene-2-Cache 114 auf den Speicherzugriff normal
reagieren, obwohl der Cache-Eintrag auch im Rückschreibpuffer 220 ist.
Wenn bei einem normalen Zurückschreiben,
das einem geräumten
Cache-Eintrag entspricht, ein Rückschreibpuffer-Treffer
vorkommt, müssen diese
Daten zum Ebene-2-Cache 114 zurückübertragen
werden, bevor jegliche Verarbeitung fortsetzen kann. Im Fall einer
Räumung
speichert der Ebene-2-Cache 114 diese Daten nicht mehr.
Die Steuerlogik 214 muß den
zurückgehenden
Rückschreibpuffer-Eintrag
speichern und einen anderen zu ersetzenden oder zu räumenden
Cache-Eintrag identifizieren. Dieser Prozeß ist an sich bekannt und muß nicht
weiter beschrieben werden.
-
Das UND-Glied 507 empfängt außerdem sowohl
das Rückschreibpuffer-Treffer-Signal als
auch das Lese/Nichtschreib-Signal. Diese beiden Signale werden an
nichtinvertierende Eingänge
geliefert. Das UND-Glied 507 erzeugt beim Empfang dieses
Rückschreibpuffer-Treffer-Signals
ein aktives Signal, wenn der Ebene-1-Daten-Cache eine Leseanforderung
ausgibt. Der entsprechende Rückschreibpuffer-Eintrag
kann in Abhängigkeit
von der Anzahl der Lesereklamierungen geleert werden. Der Ausgang des
UND-Gliedes 507 steuert die Wahl des Multiplexers 508.
Falls das UND-Glied 507 einen aktiven Ausgang erzeugt,
was den Empfang eines Rückschreibpuffer-Treffers
während
eines Lesezugriffs angibt, wählt
der Multiplexer 508 sein +1-Eingangssignal. Andernfalls
wählt der
Multiplexer 508 sein 0-Eingangssignal. Der Multiplexer 508 liefert
einen Eingang an den Addierer 509. Der zweite Eingang des
Addierers 509 empfängt
den Wert des abgerufenen Lesereklamierungs-Feldes 316 (RRclm).
Das Abrufen jenes Lesereklamierungs-Feldes 316 besteht
vorzugsweise aus 1 oder 2 Bits. Der Addierer 509 bildet
eine Summe mit einer entsprechenden Anzahl von Bits. Diese Summe
wird im Lesereklamierungs-Feld 316 des entsprechenden Cache-Eintrags gespeichert.
Im allgemeinen führt
diese Summe zu keiner Veränderung
des Lesereklamierungs-Feldes 316, da der Multiplexer 508 im
allgemeinen seinen 0-Eingang wählt.
-
Die Anpassungsschaltung 510 erfaßt, wenn das
Lesereklamierungs-Feld 316 einen vorgegebenen Wert übersteigt.
Dies tritt stets dann ein, wenn die Anzahl von Lesereklamierungen
des Cache-Eintrags vom Rückschreibpuffer 220 einen
vorgegebenen Wert übersteigt.
In der bevorzugten Ausführungsform
erfaßt
die Anpassungsschaltung 510 den Überlaufzustand des Addierers 509,
was angibt, daß die
Summe 3 (binär
11) übersteigt.
Alternativ kann die Anpassungsschaltung 510 stets dann
ausgelöst werden,
wenn der Summenausgang des Addierers 509 gleich einer bestimmten
Zahl ist. Wenn die Anpassungsschaltung 510 ihren Zustand
erfaßt,
erzeugt sie ein aktives Ausgangssignal. Dieses Signal versorgt einen
invertierenden Eingang des ODER-Gliedes 506. Somit erzeugt
das ODER-Glied 506 das Rückschreibpuffer-Eintrag-Leerung-Signal bei
Lesetreffern, falls die Anpassungsschaltung 510 nicht ihren
Zustand erfaßt.
Dies gibt die Lesereklamierung von in den Rückschreibpuffer 220 kopierten Daten
für eine
vorgegebene Anzahl von Malen frei. Sobald diese Anzahl überschritten
wird, was von der Anpassungsschaltung 510 erfaßt wird,
wird der Rückschreibpuffer-Eintrag
bei einem Lesen nicht geleert, sondern kann über die Busschnittstelle 112 in den
Hauptspeicher 105 geschrieben werden. Es sei angemerkt,
daß jedes
Schreiben in einen Cache-Eintrag
das Lesereklamierungs-Feld 316 auf 0 zurücksetzt.
Somit erreicht das Lesereklamierungs-Feld 316 seine Grenze
erst nach mehreren Lesevorgängen
ohne ein dazwischenliegendes Schreiben. In diesem Fall wäre es das
Beste, den Cache-Eintrag unter der Annahme, daß der Mikroprozessor 110 mit dem
Schreiben auf diese Adresse fertig ist, zurückzuschreiben.
-
Die Anpassungsschaltung 510 steuert
außerdem
die Wahl des Multiplexers 503. Normalerweise steuert die
Anpassungsschaltung 510 den Multiplexer 503 so,
daß er
den Summenausgang des Addierers 502 wählt. Wenn die Anpassungsschaltung 510 ein
aktives Signal erzeugt, wählt
der Multiplexer 503 seinen Eingang vom 010-Register 511.
Dies stellt den Nichtschreibzyklus-Zählstand bei jeder Lesereklamierung
vom Rückschreibpuffer 220 im
voraus auf 2 (binär
010) ein. Somit sind zur Erzeugung eines preemptiven Zurückschreibens,
das auf eine Lesereklamierung folgt, weniger Lesezyklen erforderlich.
-
7 zeigt
in Form eines Ablaufplans die Prozeßschritte, die eine Logik für preemptives
Cache-Zurückschreiben 212 in
Gestalt eines selbständigen
Prozessors oder einer selbständigen
Zustandsmaschine ermöglicht.
Der in 7 gezeigte Prozeß 700 beginnt
mit dem Erfassen, ob der Rückschreibpuffer 220 einen
Treffer erzeugt (Entscheidungsblock 701). Falls dies nicht
wahr ist, prüft
der Prozeß 700, um
zu bestimmen, ob der Zähler
einen nächsten Zählstand
erreicht hat (Entscheidungsblock 702). Falls dies nicht
wahr ist, kehrt der Prüfung 700 zum Entscheidungsblock 701 zurück. Der
Prozeß wiederholt
diese Schritte, bis eine Bedingung erfüllt ist.
-
Beim Erfassen eines nächsten Zählstandes prüft der Prozeß 700,
um zu bestimmen, ob die Etiketten des nächsten zu prüfenden Cache-Eintrags belegt
sind (Entscheidungsblock 703). Dies kann gelegentlich geschehen,
wenn normale Ca che-Prozesse auf den Cache-Eintrag zugreifen. Der
Prozeß 700 wiederholt
die Prüfung
des Entscheidungsblocks 703, bis die Cache-Etiketten nicht
belegt sind. Da das preemptive Cache-Zurückschreiben ein Hintergrundprozeß ist, wartet
es, bis es keinen Konflikt mit anderen höherprioren Prozessen gibt.
Der Prozeß 700 ruft die
Cache-Etiketten für
den Eintrag, auf den zugegriffen wird, ab. Diese Cache-Etiketten
enthalten das Schreib-(WR)-Feld 312, das Nichtschreibzyklus-(NWcycle)-Feld 314,
das Lesereklamierung-(RRclm)-Feld 316 und das schmutzige (D) Feld 318,
die in 3 gezeigt sind.
-
Der Prozeß 700 prüft als nächstes,
um zu bestimmen, ob der Cache-Eintrag, auf den zugegriffen wird,
schmutzig ist (Entscheidungsblock 705). Für einen
sauberen Eintrag ist kein preemptives Cache-Zurückschreiben geeignet. Somit
kehrt der Prozeß 700 zum
Entscheidungsblock 701 zurück, falls der Cache-Eintrag
nicht schmutzig ist. Falls der Cache-Eintrag schmutzig ist, prüft der Prozeß 700,
um zu bestimmen, ob das Schreibfeld 312 1 ist (Entscheidungsblock 706).
Falls das Schreibfeld 312 1 ist, dekrementiert der Prozeß 700 das
Nichtschreibzyklus-Feld 314 (Verarbeitungsblock 707).
Wie oben beschrieben wurde, ist dies eine Sättigungssubtraktion, weshalb
das Nichtschreibzyklus-Feld 314 keinen Wert besitzen kann,
der kleiner als null ist. Der Prozeß 700 setzt danach
das Schreibfeld 312 auf 0 zurück (Verarbeitungsblock 708).
Die neuen Werte dieser beiden Felder werden in den entsprechenden
Cache-Etiketten für
den der Prüfung
unterzogenen Cache-Eintrag
gespeichert. Der Prozeß 700 kehrt
danach zum Entscheidungsblock 701 zurück, um in der Schleife zu bleiben,
bis ein Rückschreibpuffer-Treffer vorkommt
(Entscheidungsblock 701) oder der nächste Zählstand erreicht ist (Entscheidungsblock 702). Falls
das Schreibfeld 312 0 ist, dekrementiert der Prozeß 700 das
Nichtschreibzyklus-Feld 314 (Verarbeitungsblock 709).
Der Prozeß 710 prüft, ob der
inkrementierte Zählstand
eine vorgegebene Zahl übersteigt
(Entscheidungsblock 710). Falls der Zählstand die vorgegebene Zahl
nicht übersteigt,
kehrt der Prozeß 700 zum
Entscheidungsblock 710 zurück, um in der Schleife zu bleiben,
bis ein Rückschreibpuffer-Treffer
vorkommt (Entscheidungsblock 701) oder der nächste Zählstand
erreicht ist (Entscheidungsblock 702). Falls der inkrementierte
Zählstand
die vorgegebene Zahl übersteigt,
beginnt der Prozeß 700 ein preemptives
Cache-Zurückschreiben
jenes Eintrags (Verarbeitungsblock 711). Der Prozeß 700 kehrt
danach zum Entscheidungsblock 701 zurück, um in der Schleife zu bleiben,
bis ein Rückschreibpuffer-Treffer
vorkommt (Entscheidungsblock 701) oder der nächste Zählstand
erreicht ist (Entscheidungsblock 702).
-
Beim Erfassen eines Rückschreibpuffer-Treffers
(Entscheidungsblock 701) prüft der Prozeß 700 das
P-Feld 332 (Entscheidungsblock 712). Wie oben
beschrieben wurde, wird das P-Feld 332 für preemptive
Cache-Zurückschreibungen
auf 1 und für
normale Cache-Räumungszurückschreibungen auf
0 gesetzt. Wenn der Rückschreibpuffer-Treffer auf
einen normalen Cache-Räumungszurückschreib-Eintrag
erfolgte, kehrt der Prozeß 700 zur Ausgangsschleife
mit den Entscheidungsblöcken 701 und 702 zurück. Wenn
der Rückschreibpuffer-Treffer
auf einen preemptiven Rückschreibpuffer-Eintrag
erfolgte, prüft
der Prozeß 700,
um zu bestimmen, ob der Speicherzugriff ein Schreiben ist (Entscheidungsblock 713).
Wenn der Speicherzugriff, der den Rückschreibpuffer-Treffer erzeugte,
ein Schreiben ist, setzt der Prozeß 714 das Schreibfeld 312 auf
1 (Verarbeitungsblock 714) und dekrementiert das Nichtschreibzyklus-Feld 314 (Verarbeitungsblock 715).
Anschließend
wird der Rückschreibpuffer-Eintrag
geleert (Verarbeitungsblock 716). Es sei angemerkt, daß aufgrund
dessen, daß dies
ein preemptiver Rückschreibpuffer-Eintrag
ist, die entsprechenden Daten noch immer im Ebene-2-Cache 114 gespeichert
sind. Somit muß der
Rückschreibpuffer 220 diese
Daten nicht in den Cache zurückkopieren.
Tatsächlich
kann der Ebene-2-Cache 114 den Schreib-Speicherzugriff
normalerweise versorgen, während
der Rückschreibpuffer 220 diesen
Eintrag leert. Sobald der Rückschreibpuffer-Eintrag
geleert ist, kehrt der Prozeß 700 zur
Ausgangsschleife zurück.
-
Wenn der Speicherzugriff, der den
Rückschreibpuffer-Treffer
erzeugt, ein Lesen ist, inkrementiert der Prozeß 714 das Lesereklamierungs-Feld 316 (Verarbeitungsblock 717).
Der Prozeß 700 prüft dann,
um zu bestimmen, ob das Lesereklamierungs-Feld 316 seine
vorgegebene Zahl übersteigt
(718). Falls dies wahr ist, wird der Rückschreibpuffer-Eintrag nicht
geleert und kehrt der Prozeß 700 zur
Ausgangsschleife zurück.
Falls das Lesereklamierungs-Feld 316 seine vorgegebe ne
Zahl nicht übersteigt,
setzt der Prozeß 714 das
Schreibfeld 312 auf 0 (Verarbeitungsblock 719)
und das Nichtschreibzyklus-Feld 314 auf 010 (Verarbeitungsblock 715).
Anschließend
wird der Rückschreibpuffer-Eintrag
geleert (Verarbeitungsblock 716). Sobald der Rückschreibpuffer-Eintrag
geleert ist, kehrt der Prozeß 700 zur
Ausgangsschleife zurück.
-
8 zeigt
den Aufbau der Betriebsteile der Logik für preemptives Cache-Zurückschreiben 212 gemäß einer
alternativen Ausführungsform.
In dieser alternativen Ausführungsform
setzt ein Schreiben in den Cache-Eintrag das Nichtschreibzyklus-Feld 212 auf
null, wobei Lesereklamierungen vom Rückschreibpuffer 220 nicht
unterstützt
werden. Die Logik für
preemptives Cache-Zurückschreiben 212 umfaßt einen
Multiplexer 511, einen Addierer 502, einen Multiplexer 513,
eine Anpassungsschaltung 504 und ein UND-Glied 515.
Nach Auswahl des zu prüfenden
Cache-Eintrags durch die Cache-Eintrag-Nummer-Ausgabe des Zählers 410 werden
das Datenfelderschreiben 312 und das Nichtschreibzyklus-Feld 314 abgerufen
und der Logik für
preemptives Cache-Zurückschreiben 212 zugeführt. Das
Lesereklamierungs-Feld 316 wird in dieser alternativen
Ausführungsform
nicht unterstützt.
Die Logik für
preemptives Cache-Zurückschreiben 212 empfängt außerdem das
Rückschreibpuffer-Treffer-Signal
von der Steuerlogik 222 über die Steuerlogik 214 und
das Lese/Nichtschreib-Signal vom Ebene-1-Daten-Cache 116d über die
Steuerlogik 214. Die Logik für preemptives Cache-Zurückschreiben 212 berechnet
einen neuen Wert für
das Nichtschreib-Feld 314, das im entsprechenden Cache-Eintrag
gespeichert wird. Die Logik für
preemptives Cache-Zurückschreiben 212 erzeugt
außerdem
das Rückschreibpuffer-Eintrag-Leerung-Signal,
das die Steuerlogik 214 dem Rückschreibpuffer 220 zuführt.
-
Der Multiplexer 511 wird
durch Schreibfeld 312 (WR) gesteuert. Falls das Schreibfeld
1 ist, was angibt, daß der
Cache-Eintrag seit dem letzten Zyklus geschrieben wurde, wählt der
Multiplexer 511 seinen 0-Dateneingang. Falls das Schreibfeld
0 ist, was angibt, daß der
Cache-Eintrag seit dem letzten Zyklus nicht geschrieben wurde, wählt der
Multiplexer 511 seinen +1-Dateneingang. Der Multiplexer 511 liefert
einen Eingang an den Addierer 502. Der zweite Eingang des Addierers 502 empfängt den
Wert des abgerufenen Nichtschreibzyklus-Feldes 314 (NWcycle).
Der Addierer 502 liefert seinen Summenausgang an einen
Eingang des Multiplexers 513. Der Multiplexer 513 wählt im allgemeinen
diesen Summeneingang, wenn das Schreibfeld 312 0 ist. Der Multiplexer 513 wählt seinen
0-Eingang, wenn das Schreibfeld 312 1 ist. Somit wird das
Schreibfeld 312 inkrementiert, wenn für den vorhergehenden Zyklus kein
Schreiben stattgefunden hat, und auf 0 zurückgesetzt, wenn wenigstens
ein Schreibvorgang stattgefunden hat.
-
Die Anpassungsschaltung 504 erfaßt, wenn das
Nichtschreibzyklus-Feld 314 einen vorgegebenen Wert übersteigt.
Dies tritt stets dann ein, wenn die Anzahl von aufeinanderfolgenden
Nichtschreibzyklen den vorgegebenen Wert übersteigt. Wenn die Anpassungsschaltung 504 ihren
Zustand erfaßt,
erzeugt sie ein Signal für
preemptives Cache-Zurückschreiben.
Dies geschieht, wie oben beschrieben wurde.
-
Die Logik für preemptives Cache-Zurückschreiben 212 erzeugt
das Rückschreibpuffer-Eintrag-Leerung-Signal über das
UND-Glied 515. Das Rückschreibpuffer-Treffer-Signal
von der Steuerlogik 220 wird über die Steuerlogik 214 einem
nichtinvertierenden Eingang des UND-Gliedes 515 zugeführt. Ein
invertierender Eingang des UND-Gliedes 515 empfängt das
Lese/Nichtschreib-Signal
(R/) von der Steuerlogik 214. Das UND-Glied 515 liefert
beim Erfassen eines Rückschreibpuffer-Treffers
ein aktives Rückschreibpuffer-Eintrag-Leerung-Signal, wenn der Ebene-1-Daten-Cache 116d ein Schreiben anfordert.