-
HINTERGRUND DER ERFINDUNG
-
1. TECHNISCHES GEBIET
-
Die
Erfindung betrifft allgemein Prozessor-Vorrichtungen und insbesondere
eine Pufferspeicher-Architektur für eine Prozessor-Vorrichtung.
-
2. BESCHREIBUNG DER VERWANDTEN
TECHNIK
-
Die
meisten Prozessor-Vorrichtungen verwenden eine Pufferspeicher-Architektur, um die
Abrufgeschwindigkeit von Informationen aus einem Hauptspeicher zu
erhöhen.
Ein Pufferspeicher (Cache-Speicher) ist ein Hochgeschwindigkeitsspeicher,
der sich zwischen dem Prozessorkern einer Prozessor-Vorrichtung
und dem Hauptspeicher befindet. Der Hauptspeicher ist im allgemeinen
sehr viel größer als
der Pufferspeicher, aber auch deutlich langsamer. Jedesmal, wenn
der Prozessorkern Informationen vom Hauptspeicher abruft, überprüft die Pufferspeicher-Steuerschaltung
den Pufferspeicher, um festzustellen, ob die Adresse, auf die zugegriffen
wird, derzeit im Pufferspeicher ist. Wenn ja, wird die Information
vom schnelleren Pufferspeicher abgerufen, anstatt vom langsameren
Hauptspeicher. Ist die Information nicht im Pufferspeicher, wird
auf den Hauptspeicher zugegriffen und der Pufferspeicher wird mit
der Information aktualisiert.
-
Da
Prozessorkerne im Verhältnis
zu Speicherkonstruktionen schneller werden, wird die Effizienz von Pufferspeicher-Architekturen
bedeutsamer. Ein Weg, um die Effizienz zu steigern, ist die Vergrößerung des Pufferspeichers.
Da ein größerer Pufferspeicher
mehr Informationen speichern kann, wird die Wahrscheinlichkeit für einen
Pufferspeicher-Treffer entsprechend erhöht. In den meisten Fällen führt jedoch
das Erhöhen
der Pufferspeichergröße ab einem
bestimmten Punkt zu einer negativen Rückwirkung. Zudem wird eine
Vergrößerung des
Pufferspeichers den Chip vergrößern (vorausgesetzt,
daß der
Pufferspeicher mit dem Prozessorkern integriert ist). Noch wichtiger
ist, daß sich
die Zugriffszeit erhöhen
wird, was den ursprünglichen
Zweck des Pufferspeichers zunichte macht. Entsprechend wird allein
die Vergrößerung eines
Pufferspeichers in vielen Fällen
keine lohnenden Ergebnisse bringen.
-
In
vielen Vorrichtungen werden gewisse Routinen kritische Zeitvorgaben
haben oder sonst vorhersagbare Ausführungszeit benötigen. In
diesen Fällen
kann es entscheidend sein, Wartezeiten aufgrund von Pufferspeicher-Fehltreffern
zu vermeiden. Einige Pufferspeicher-Systeme bieten Mechanismen,
die Einträge
bzw. Eingänge
in einen Pufferspeicher sperren, so daß Pufferspeichereinträge nicht überschrieben
werden, da auf andere Orte zugegriffen wird. Dieser Mechanismus
ist für
Einträge
nützlich,
die wiederholt verwendet werden; jedoch reduziert das Sperren von
Einträgen
auf einem Pufferspeicher seine Größe und Assoziativität. Beispielsweise
wird in einem 2-Wege-Satz-Assoziativpufferspeicher
das Sperren einiger Einträge
zur Folge haben, daß ein
Teil des Pufferspeichers als direkt abgebildeter Pufferspeicher
agiert, was die Wirksamkeit des Pufferspeichers stark reduziert.
Eine ähnliche
Lösung
benutzt einen lokalen Speicher, der parallel zum Pufferspeicher-System
arbeitet. Diese Lösung
erfordert eine Adreßdekodierung
für den
lokalen Speicher und einen Mechanismus, um den Pufferspeicher zu
deaktivieren, was Wartezeiten zur Folge haben kann. Während eine Ausführung mit
einem lokalen RAM mit speziell für
die Benutzung des lokalen RAM geschriebenen Routinen arbeiten kann,
werden andere Routinen, insbesondere OS(Betriebssystem)-Routinen,
die nicht in Vorwegnahme der spezifischen lokalen RAM-Konfiguration
geschrieben wurden, nicht in der Lage sein, den lokalen RAM in der
Art und Weise zu steuern, wie der Pufferspeicher gesteuert wird.
-
Andere
Prozessorsysteme, wie in
US 5,014,195 beschrieben,
umfassen eine zentrale Prozessoreinheit, einen Satz assoziativer
Pufferspeicher und einen Hauptspeicher. Der Satz assoziativer Pufferspeicher umfaßt eine
Pufferspeicher-Steuerschaltung
und einen oder mehrere Pufferspeicher, die miteinander verbunden
sind. Aber diese Systeme umfassen nur einen Satz von assoziativen
Pufferspeichern kontrolliert durch eine Pufferspeicher-Steuerschaltung,
womit deutlich deren Wirksamkeit beschränkt wird.
-
Es
ist auch ein Pool-Buffer bekannt, zum Beispiel im Dokument „Optimizing
Primary Data caches for parallel Scientific Application" von Liuxi Yang,
das ist ein Pufferspeicher parallel mit einem Primärdaten-Pufferspeicher.
Jeder Eingang in den Pool-Buffer ist ein Sektor, nämlich ein
Satz von benachbarten Pufferspeicherzeilen, der eine Adreßkennzeichnung
hat. Wenn der Prozessor auf eine Zeile verweist, werden sowohl der
Primärpufferspeicher
als auch der Pool-Buffer
durchsucht. Wenn jedoch ein Pool-Buffer-Treffer auftritt, werden die
Daten vom Pool-Buffer in den Primärpufferspeicher kopiert. Deshalb
benötigt
eine derartige Prozessor-Vorrichtung weitere Betriebszeit aufgrund
des Kopierens und Übertragens
vom Primärpufferspeicher.
-
Deswegen
ist ein Bedarf entstanden für
eine Pufferspeicher-Architektur, die die Pufferspeicherleistung und
-vorhersagbarkeit erhöht.
-
Um
die beschriebenen Nachteile im Stand der Technik zu beheben, schlägt die vorliegende
Erfindung ein Pufferspeicher-System vor, das folgendes umfaßt:
Ein
erstes Pufferspeicher-Untersystem, umfassend:
n Datenspeicher,
wobei jeder eine Mehrzahl von Eingängen zum Speichern von Information
von einem Hauptspeicher hat;
n Kennungsspeicher zum Speichern
von Adreßinformation,
die eine Hauptspeicheradresse identifiziert, assoziiert mit jedem
der Eingänge
in einem entsprechenden der n Datenspeicher.
-
Ein
zweites Pufferspeicher-Untersystem mit m Wegen, umfassend:
m
Datenspeicher, wobei jeder eine Mehrzahl von Eingängen zum
Speichern von Information von einem Hauptspeicher hat;
m Kennungsregister,
wobei jedes Adreßinformation
speichert, die einen benachbarten Block von Hauptspeicheradressen
definiert, abgebildet auf einem entsprechenden der m Datenspeicher;
und
Logik zum Bestimmen von Pufferspeicher-Treffern in dem
ersten n-Wege- und
in dem zweiten m-Wege-Pufferspeicher-Untersystem, dadurch gekennzeichnet,
daß m
größer ist
als 1 und daß Treffer
vom zweiten m-Wege-Pufferspeicher-Untersystem
Vorrang haben gegenüber
Treffern vom ersten n-Wege-Pufferspeicher-Untersystem.
-
Die
vorliegende Erfindung bietet deutliche Vorteile gegenüber dem
Stand der Technik. Erstens kann der RAM-Satz-Pufferspeicher (abgebildet
auf einem benachbarten Block von Hauptspeicheradressen) deutlich den
Betrieb einer Prozessor-Vorrichtung verbessern, die Operationen
in Echtzeit ausführt,
weil ein gewünschter
Code-Block in dem RAM-Satz-Pufferspeicher für einen schnellen Zugriff gespeichert
werden kann. Zweitens gibt es keinen zusätzlichen Nachteil wegen des
Zugriffs auf einen größeren Datenspeicher
für einen RAM-Satz-Pufferspeicher, solange
die Zugriffszeit des RAM-Satzes nicht größer ist als die Zugriffszeit
auf den Standard-Pufferspeicher. Drittens können ein oder mehrere RAM-Satz-Pufferspeicher
hinzugefügt
werden mit einem minimalen Zusatzaufwand an Verschaltung gegenüber einem
herkömmlichen
Pufferspeicher. Viertens können
die RAM-Satz-Pufferspeicher in sehr flexibler Art und Weise mit
anderen Pufferspeichern, wie beispielsweise einem Assoziativ-Pufferspeicher oder
einem direkt abgebildeten Pufferspeicher, wie gewünscht konfiguriert
werden. Fünftens
bietet der RAM-Satz-Pufferspeicher Vorteile gegenüber einem
lokalen RAM, weil ein getrennter Mechanismus zum Laden des Datenspeichers
für den
RAM-Satz-Pufferspeicher nicht notwendig ist und keine spezifische
Adressendekodierung in Serie mit der Speicherzugriffszeit benötigt wird.
Sechstens kann der Pufferspeicher vom Betriebssystem oder anderer
Software in der gleichen Art und Weise wie ein herkömmlicher
Pufferspeicher gesteuert werden – Laden, Spülen, Zeilen-Annulieren, usw.
können
durch die Software ausgeführt
werden, ohne Kenntnis der spezifischen Architektur des Pufferspeichers
oder mit geringfügigen Änderungen
in einem Treiber für
das Betriebssystem.
-
KURZE BESCHREIBUNG DER VERSCHIEDENEN
ANSICHTEN DER ZEICHNUNGEN
-
Für ein vollständigeres
Verständnis
der vorliegenden Erfindung und ihrer Vorteile wird Bezug genommen
auf die folgende Beschreibung zusammengenommen mit den begleitenden
Zeichnungen, in denen:
-
1 ein
Blockdiagramm einer Prozessor-Vorrichtung zeigt, die einen Pufferspeicher
umfaßt;
-
2 zeigt
ein Blockdiagramm einer bevorzugten Ausführungsform einer Pufferspeicher-Architektur;
-
3 ist
ein Diagramm, das die Abbildung eines Teils eines Hauptspeichers
auf einem RAM-Satz-Pufferspeicher zeigt; und
-
4 zeigt
ein Flußdiagramm,
das die Arbeitsweise der Treffer/Verfehlen-Logik von 2 beschreibt.
-
DETAILLIERTE BESCHREIBUNG
DER ERFINDUNG
-
Die
vorliegende Erfindung wird am besten im Zusammenhang mit den 1 bis 4 der
Zeichnung verstanden, gleiche Bezugszeichen werden für sich entsprechende
Elemente in den verschiedenen Zeichnungen verwendet.
-
1 zeigt
ein Blockdiagramm einer Prozessor-Vorrichtung 10. Die Prozessor-Vorrichtung 10 umfaßt einen
Prozessorkern 12, einen Datenspeicher 14, einen
Befehlspufferspeicher 16, und eine Untersystem-Speicherschnittstelle 18.
Die Untersystem-Speicherschnittstelle 18 bildet eine Schnittstelle
mit dem Hauptspeicher 20, der typischerweise ein externer
Speicher ist.
-
Wie
ausführlicher
weiter unten beschrieben, ist im bevorzugten Ausführungsbeispiel
der Befehlspufferspeicher ein Pufferspeicher mit drei Wegen, wobei
ein Pufferspeicherweg ein „RAM-Satz"-Pufferspeicher ist.
Der RAM-Satz-Pufferspeicher ist so konstruiert, daß er einen
benachbarten Speicherblock puffert, beginnend von einem gewählten Hauptspeicher-Adressenort. Die
anderen zwei Pufferspeicherwege können als RAM-Satz-Pufferspeicher gestaltet
sein, oder andere Architekturen verwenden. Beispielsweise könnte der
Befehlspufferspeicher 16 als ein RAM-Satz-Pufferspeicher und
ein 2-Wege-Satz-Assoziativpufferspeicher ausgebildet sein.
-
Im
Betrieb greift der Prozessorkern 12 auf den Hauptspeicher 20 innerhalb
eines gegebenen Adreßraumes
zu. Falls die an einer angeforderten Adresse im Hauptspeicher liegende
Information ebenso im Befehlspufferspeicher 16 gespeichert
ist, werden die Daten von dem Befehlspufferspeicher entnommen. Falls
die Information für
die angeforderte Adresse nicht im Befehlspufferspeicher gespeichert
ist, wird die Information vom Hauptspeicher 20 entnommen
und der Befehlspufferspeicher wird mit der entnommenen Information
aktualisiert.
-
2 zeigt
ein detaillierteres Blockdiagram des Befehlspufferspeichers 16,
in einer Ausführungsform mit
einem RAM-Satz-Pufferspeicher und einem 2-Wege-Satz-Assoziativpufferspeicher.
-
Eine
Pufferspeicher-Steuerschaltung 22 steuert den Betrieb des
Befehlspufferspeichers 16. Pufferspeicher-Steuerschaltung 22 umfaßt vier
Statusbits: RAM_fill_mode 24, Cache_Enable 26,
DM/2SA 28 und FULL_RAM_base 30. Pufferspeicher-Steuerschaltung 22 ist
verbunden mit Full_Set Kennungsregistern 32 (einzeln bezeichnet
als Register 321 bis 323 ), gesamtgültigen Bits 34 (einzeln
bezeichnet als Bits 341 bis 343 ), Kennungsspeichern 36 (einzeln
bezeichnet als Kennungsspeicher 362 und 363 ), gültigen Eingangsbit-Arrays 37 (einzeln
bezeichnet als Bit-Arrays 371 bis 373 ) und Datenarrays 38 (einzeln
bezeichnet als Datenarrays 381 bis 383 ). Komparatoren 40 (einzeln
bezeichnet als Komparatoren 401 bis 403 ) sind verbunden mit entsprechenden
Full_Set Kennungsregistern 32 (Full_Set_Tag). Komparatoren 42 (einzeln
gekennzeichnet als Komparatoren 422 und 423 ) sind verbunden mit entsprechenden
Kennungsspeichern 36. Ausgangsbuffer 44 (einzeln gekennzeichnet
als Buffer 441 bis 443 ) sind verbunden mit entsprechenden
Datenarrays 38. Eine Treffer/Verfehlen-Logik 46 (einzeln
gekennzeichnet als Logik 461 bis 463 ) ist verbunden mit den Komparatoren 40,
den gesamtgültigen
Bits 34, den gültigen
Bits 37, dem RAM_fill_mode Bit 24 und dem Cache_Enable
Bit 26.
-
Im
Betrieb wird der Befehlspufferspeicher 16 unter Verwendung
der Steuerbits 24, 26, 28 und 30 konfiguriert.
Das Cache_Enable 26 erlaubt es dem Befehlspufferspeicher
bereitgestellt oder nicht bereitgestellt zu sein, wie in einer Standard-Pufferspeicher-Architektur.
Falls der Befehlspufferspeicher 16 nicht bereitgestellt ist
(Cache_Enable=0), werden Befehls-Lesezugriffe auf dem Hauptspeicher 20 über die
Untersystem-Speicherschnittstelle 18 durchgeführt, ohne
den Befehlspufferspeicher 16 zu verwenden. Falls der Befehlspufferspeicher
bereitgestellt ist (Cache_Enable=1), werden Befehle in den Fällen, in
denen derartige Befehle im Befehlspufferspeicher 16 vorhanden
sind, vom Befehlspufferspeicher 16 ausgeführt. Falls
ein Verfehlen auftritt, wird eine Zeile (zum Beispiel 16 Bytes)
vom Hauptspeicher 20 geholt und dem Kern 12 zugeführt. Das
ist auch ein standardmäßiges Pufferspeicherverhalten.
-
Die
Größe des Datenarrays 381 kann anders sein als die Größe der Datenarrays 382,3 für die anderen Wege des Pufferspeichers.
Zum Zweck der Veranschaulichung sei angenommen, daß die Datenarrays 382 und 383 jeweils
8 KBytes umfassen, konfiguriert in 512 Zeilen, wobei jede Zeile 8 Befehle
von je 2 Bytes enthält. Datenarray 381 hat eine Größe von 16 KBytes, konfiguriert
in 1024 Zeilen, wobei jede Zeile acht Befehle mit je 2 Bytes enthält. ADDR[L]
wird verwendet, um eine Zeile des Datenarrays 38 und gültiges Bit-Array 37 (und Kennungsspeicher 36,
wenn zutreffend) anzusprechen. Entsprechend wird ADDR[L] für den ersten
Weg mit 1024 Zeilen Bits [13:4] einer Kernadresse enthalten. Für die 512
Zeilen des zweiten und dritten Weges wird ADDR[L] Bits [12:4] einer
Kernadresse enthalten. ADDR[H] definiert, welcher Satz auf einer
Zeile abgebildet wird. Deshalb verwendet ADDR[H], unter der Voraussetzung
eines Adreßraumes
von 4 Gigabyte (2 Gword), Bits [31:14] einer Kernadresse für den ersten
Weg und Bits [31:13] sowohl für
den zweiten als auch für
den dritten Weg des Pufferspeichers 16.
-
Die
Kennungsspeicher 36 und Komparatoren 42 werden
für einen
2-Wege-Satz-Assoziativpufferspeicher
verwendet. Wenn der Kern 12 einen Speicherzugriff durchführt, wird
auf die Kennungsspeicher 36 bei den Bits geringer Ordnung
der Adresse (ADDR[L]) zugegriffen. Die Kennungsspeicherstellen speichern
die Adressenbits hoher Ordnung der Hauptspeicheradresse der Information,
die in der korrespondierenden Zeile des Datenarrays 38 gespeichert
ist. Diese Adressenbits hoher Ordnung werden mit den Adressenbits
hoher Ordnung (ADDR[H]) der Adresse vom Kern 12 verglichen.
Falls ADDR[H] mit dem Inhalt des Kennungsspeichers bei ADDR[L] übereinstimmt,
erscheint ein Treffer, sofern das mit den Bits geringer Ordnung
(V[ADDR[L]]) gekoppelte Gültigkeitsbit
anzeigt, daß der
Pufferspeichereintrag gültig
ist. Gibt es einen Pufferspeicher-Treffer, können die Daten des entsprechenden
Datenarrays 38 bei ADDR[L] dem Kern 12 zugeführt werden,
indem der richtige Ausgangsbuffer 44 bereitgemacht wird.
Wie unten beschrieben, werden Daten aus dem Pufferspeicher mit zwei
Wegen dem Kern 12 nur angeboten, falls es ein Verfehlen
im RAM-Satz-Pufferspeicher gibt. Die Arbeitsweise des 2-Wege-Satz-Assoziativpufferspeichers
und des direkt abgebildeten Speichers selbst kann herkömmlich sein
und wird nicht von dem RAM-Satz-Pufferspeicher beeinflußt. Andere
Pufferspeichertechniken könnten
ebenso in Verbindung mit dem RAM-Satz-Pufferspeicher verwendet werden.
-
Der
RAM-Satz-Pufferspeicher speichert einen benachbarten Block des Hauptspeichers 20 beginnend an
einer Adresse, die durch das Full_set Kennungsregister 32 für den RAM-Satz
definiert ist. Dieser Informationsblock wird auf das entsprechende
Datenarray 38 des RAM-Satzes abgebildet. Nur die Bits hoher
Ordnung der Startadresse werden in dem Full_set Kennungsregister 32 gespeichert. 3 zeigt
diese Abbildung für einen
einzelnen RAM-Satz. Wie gezeigt, definiert der Inhalt des Full_set
Kennungsregisters 321 die Startadresse
für einen
benachbarten Speicherblock, der im Datenarray 381 gepuffert
ist.
-
Ein
RAM-Satz-Verfehlen tritt auf, wenn die Adressenbits hoher Ordnung
vom Kern 12 nicht mit den Inhalten des Full_set Kennungsregisters 32 übereinstimmen
oder das Gesamtgültigkeitsbit
gleich „0" ist. In beiden Fällen, wenn
ein RAM-Satz-Verfehlen auftritt, verhält sich der Befehlspufferspeicher 16 wie
eine normale 2-Wege-Pufferspeicherlogik – falls ein Treffer in dem
2-Wege-Pufferspeicher
auftritt, dann wird dem Kern 12 ein Befehl von dem 2-Wege-Satz-Assoziativpufferspeicher
zugeführt,
anderenfalls wird der Befehl vom Hauptspeicher 20 entnommen.
-
Eine
RAM-Satz-Treffersituation tritt auf, wenn die Adressenbits höherer Ordnung
vom Kern 12 mit den Inhalten des Full_set Kennungsregisters 32 übereinstimmen
und das Gesamtgültigkeitsbit
gleich „1" ist (das Setzen
des Gesamtgültigkeitsbits
wird ausführlicher
weiter unten beschrieben). Der RAM-Satz-Vergleich hat als Grundeinstellung
die höchste
Priorität.
Eine Treffersituation zeigt an, daß der angeforderte Befehl im RAM-Satz
abgebildet ist. Falls das gültige
Eingangsbit 37, das der Zeile entspricht, die den Befehl
enthält,
auf „1" gesetzt ist, erzeugt
die Logik 40 ein Treffer-Treffer-Signal, weil die Adresse
den RAM-Satz trifft und der Befehl im RAM-Satz enthalten ist. Falls
das entsprechende Gültigkeitsbit
des RAM-Satzeingangs 37 gleich „0" ist, erzeugt die Logik ein Treffer-Verfehlen,
weil die Adresse den RAM-Satz trifft, aber der Befehl noch nicht
im RAM-Satz vorliegt. In diesem Fall wird der Befehl vom Hauptspeicher 20 geholt
und in das Datenarray 38 des RAM-Satzes geladen. Ein Treffer
in der RAM-Satz-Logik hat Vorrang über der normalen Pufferspeicherlogik. Die
Standardlogik des 2-Wege-Pufferspeichers erzeugt immer ein Verfehlen,
wenn die RAM-Satz-Logik einen Treffer erzeugt. Informationen können sowohl
im RAM-Satz als auch im 2-Wege-Pufferspeicher liegen, ohne irgendein
Fehlverhalten hervorzurufen; der duplizierte Pufferspeichereintrag
im 2-Wege-Pufferspeicher wird schließlich durch den Ersetzen-Mechanismus
des 2-Wege-Pufferspeichers zwangsweise geräumt werden, weil es nie benutzt
werden wird.
-
Um
einen RAM-Satz für
den Betrieb vorzubereiten, muß das
Full_Set Kennungsregister 32 mit der Startadresse geladen
sein (set_start_addr) und das RAM_fill_mode Bit 24 muß für einen
gewünschten
Füllmodus
konfiguriert sein. Die Schaltung zum Füllen des Pufferspeichers kann
die gleiche sein, die genutzt wird, um Zeilen des Satz-Assoziativpufferspeichers
zu füllen.
Im bevorzugten Ausführungsbeispiel
werden zwei Füllmoden
angeboten: ein Zeile-für-Zeile-Füllmodus oder ein Satzfüllmodus.
-
Für eine Zeile-für-Zeile-Füllung (RAM_fill_mode=0)
ist das gesamtgültige
Bit 34 auf „1" gesetzt und die gültigen Eingangsbits 37 sind
auf „0" gesetzt, wenn das
Full_Set Kennungsregister 32 mit der Startadresse geladen
wird. An diesem Punkt ist das Datenarray 38 leer (es wird
davon ausgegangen, daß das Cache_Enable
Bit 26 auf „1" gesetzt ist, um
den Betrieb des Befehlspufferspeichers zu erlauben). Beim Empfang
einer Adresse vom Kern 12 wird ein gültiges Eingangsbit 37 ausgewählt, basierend
auf den Bits geringer Ordnung der Adresse. Wie oben ausgeführt, wird
das Full_Set Kennungsregister 18 Bits [31:14] der Startadresse
(set_start_addr) speichern, falls der RAM-Satz eine Größe von 16
KBytes hat, organisiert als ein Array von 1 K × 16 Bytes, wobei 16 Bytes äquivalent
ist zu einer Blockzeile in dem zugeordneten 2-Wege-Pufferspeicher. Die
Adresse, die jeden Eintrag des RAM-Satzes indiziert (ADDR[L]), wird
10 Bits [13:4] haben und die Befehlsadresse, die benutzt wird, um
auf einen Befehl in der Zeile zuzugreifen, wird 3 Bits [3:1] haben
(unter der Annahme, daß die
Befehle 2 Bytes breit sind). Eine Zeile des Datenarrays 38 (an
ADDR[L]) wird vom Hauptspeicher 20 jedesmal dann geladen,
wenn eine Treffer-Verfehlen-Situation
auftritt, weil (1) der Komparator 40 ein Übereinstimmen
zwischen ADDR[H] und der Set_start_addr feststellt, (2) das gesamtgültige Bit 34 auf „1" gesetzt ist und
(3) das gültige
Bit 37, das mit der Zeile bei ADDR[L] assoziiert ist, geleert
ist (V[ADDR[L]]="0"). Diese Situation
deutet an, daß die
ausgewählte
Zeile auf dem RAM-Satz abgebildet ist, aber noch nicht jetzt in
den Datenarray 38 des RAM-Satzes geladen ist. Wenn die
Zeile in das Datenarray 38 vom Hauptspeicher 20 geladen
ist, ist das gültige
Bit 37, das der Zeile entspricht, auf „1" gesetzt. Dieser Ladevorgang hat dieselbe
Zeiteinschränkung
wie ein normaler Ladevorgang einer Pufferspeicherzeile, aber der
Eintrag wird in dem RAM-Satz bleiben wie ein festgelegter Eintrag
und deswegen wird die Prozessor-Vorrichtung nicht
bei einem darauffolgenden Zugriff beeinträchtigt werden.
-
Wird
andererseits ein Satzfüllmodus
(RAM_fill_mode) gewählt,
ist das gesamtgültige
Bit 34 ursprünglich
auf „0" gesetzt und bleibt „0", nachdem das Full_set
Kennungsregister mit der Startadresse geladen ist. Die gültigen Bits 37 sind
ebenfalls auf „0" gesetzt. Wenn die
Startadresse in das Full_set Kennungsregister 32 geschrieben
wird, wird das zugeordnete Datenarray 38 durch einen DMA
(Direct Memory Access – direkter Speicherzugriff)
Prozeß gefüllt. Da
jede Zeile vom Hauptspeicher 20 geladen wird, ist das gültige Eingangsbit 37,
das der Zeile entspricht, auf „1" gesetzt. Nachdem
das Datenarray 38 vollständig vom Hauptspeicher 20 geladen
wurde, wird das gesamtgültige
Bit 34 auf „1" gesetzt. Diese Initialisierung
des Datenarrays 38 dauert länger als bei dem Zeile-für-Zeile-Füllmodus,
aber alle kritischen Echtzeitroutinen sind nach der Initialisierung verfügbar und
die Systemwartezeit ist vorherbestimmt. Nachdem der RAM-Satz im
Satzfüllmodus
initialisiert ist, wird nie ein Verfehlen von Code, der auf dem
RAM-Satz abgebildet ist, auftreten, selbst nicht beim ersten Zugriff.
-
Sowohl
im Satz- als auch im Zeile-für-Zeile-Füllmodus
kann der Inhalt eines RAM-Satzes geändert werden, indem einfach
eine neue Set_start_addr in das Full_set Kennungsregister 32 geschrieben
wird. Schreiben in dieses Register spült den Inhalt des entsprechenden
Satzes aus und initiiert einen Ladeprozeß entsprechend dem Füllmodus.
Die Steuerschaltung 22 kann die gleiche Schaltung zum Ausspülen von
Zeilen des RAM-Satz-Pufferspeichers verwenden wie für den Satz-Assoziativpufferspeicher
verwendet wird. Ausspülen
eines vollständigen
RAM-Satz-Pufferspeichers kann durchgeführt werden, indem einfach in
das passende Full_set Kennungsregister 32 geschrieben wird.
In ähnlicher
Weise kann die Steuerschaltung 22 die gleiche Schaltung
zum Füllen
der Zeilen des RAM-Satz-Pufferspeichers verwenden wie für den Satz-Assoziativpufferspeicher
verwendet wird. Der Vorgang zum Füllen eines vollständigen Pufferspeichers
im Satzfüllmodus
ist leicht unterschiedlich, weil auf mehrere Zeilen des Hauptspeichers 20 statt
auf eine einzelne Zeile zugegriffen wird und diese in das Datenarray 38 gespeichert
werden. Der RAM-Satz-Pufferspeicher
kann mit einem Betriebssystem verwendet werden, das nicht speziell
entworfen wurde, um mit einem RAM Satz-Pufferspeicher zu funktionieren
indem kleinere Treiberänderungen
verwendet werden.
-
Die
Arbeitsweise der Treffer/Verfehlen-Logik wird in Verbindung mit
dem Flußdiagramm
der 4 beschrieben. In Schritt 50 wird eine
Adresse vom Kern 12 in Verbindung mit einem Lesevorgang
empfangen. Falls der Befehlspufferspeicher in Schritt 52 außer Betrieb
gesetzt wird, wird in Schritt 54 der Befehl vom Hauptspeicher 20 entnommen.
Falls der Pufferspeicher bereit ist, dann ergibt sich ein RAM-Satz-Verfehlen, falls
entweder die Bits hoher Ordnung der Kernadresse (ADDR[H]) nicht
mit den Bits hoher Ordnung der Startadresse (set_start_addr) übereinstimmen
oder das gesamtgültige
Bit 34 auf „0" gesetzt ist (Schritt 56).
In diesem Fall wird die Information vom 2-Wege-Satz-Assoziativpufferspeicher
dem Kern 12 zugeführt,
falls es einen Pufferspeicher-Treffer
im 2-Wege-Satz-Assoziativpufferspeicher (Schritt 58) gibt.
Gibt es ein Verfehlen in dem 2-Wege-Satz-Assoziativpufferspeicher,
wird die Zeile in den 2-Wege-Pufferspeicher
geladen.
-
Noch
einmal zurück
zu Schritt 56, falls sowohl die Bits hoher Ordnung der
Kernadresse (ADDR[H]) mit den Bits hoher Ordnung der Startadresse
(set_start_addr) übereinstimmen
als auch das gesamtgültige
Bit 34 auf „1" gesetzt ist, dann
gibt es einen RAM-Satz-Treffer auf der Zeile, die ADDR[L] entspricht
und die gültigen Eingangsbits
werden verwendet, um festzustellen, ob es sich um eine Treffer-Treffer-Situation
handelt (in der der angeforderte Befehl im RAM-Satz vorhanden ist
und dem Kern 12 zugeführt
werden kann) oder eine Treffer-Verfehlen-Situation vorliegt (in
der der angeforderte Befehl auf dem RAM-Satz abgebildet ist, aber die Information
in das RAM-Satz Datenarray 38 vom Hauptspeicher 20 geladen
werden muß).
Falls in Schritt 64 das gültige Eingangsbit 37 für die Zeile
anzeigt, daß die
Zeile gültig
ist (V[ADDR[L]]=1), ist der Befehl im RAM-Satz vorhanden und wird
dem Kern über
den RAM-Satz-Ausgangsbuffer 44 zugeführt. Falls
auf der anderen Seite das gültige
Eingangsbit 37 für
die Zeile anzeigt, daß die
Zeile nicht gültig
ist (V[ADDR[L])=0), wird die Zeile in das Datenarray 38 des
RAM-Satzes vom Hauptspeicher in Schritt 68 geladen.
-
Das
Flußdiagramm
in 4 kann leicht unter Verwendung von kombinatorischer
Logik realisiert werden.
-
In
der bevorzugten Ausführungsform
bietet der Pufferspeicher
16 Flexibilität, in dem er ein, zwei oder drei
RAM-Sätze
bereitstellt, da verschiedene Anwendungen der Prozessor-Vorrichtung
10 verschiedene
Echtzeitanforderungen haben. In dieser Ausführungsform definieren die Steuerbits
DM/2SA
28 und Full_RAM_base
30 die Zuweisung von
RAM-Sätzen
in der 3-Wege-Pufferspeicher-Architektur. Tabelle I beschreibt die
Möglichkeiten
für die
dargestellte Ausführungsform. Tabelle 1 Pufferspeicherkonfiqurationen
Full_RAM_base | DM/2SA | Konfiguration |
0 | 0 | Ein
2-Wege-Satz-Assoziiativpufferspeicher
und ein RAM-Satz-Pufferspeicher |
1 | 0 | Ein
direkt abgebildeter Pufferspeicher und ein Zwei-Satz-RAM-Pufferspeicher |
1 | 1 | Drei-Satz-RAM-Pufferspeicher |
-
Das
Full_Set Kennungsregister 32 verwendet eine Anzahl von
Bits, die gleich ist der Länge
der ADDR[H] für
den assoziativen Weg des Pufferspeichers. Somit speichert das Full_set
Kennungsregister 321 die Bits [31:14]
und die Full_set Register 322 und 323 speichern die Bits [31:13], für die spezifischen
hier festgelegten Datenarray-Größen und
-Konfigurationen.
-
In
einem 2-Wege-Satz-Assoziativpufferspeicher werden beide Kennungsspeicher 36 benutzt;
in einem direkt abgebildeten Pufferspeicher wird ein einziger Kennungsspeicher 36 verwendet.
Die Kennungsspeicher 36 werden für keinen der Pufferspeicher
verwendet, die als RAM-Satz-Pufferspeicher konfiguriert sind. Damit benutzt
in der Konfiguration, die einen einzigen RAM- Satz-Pufferspeicher und einen 2-Wege-Assoziativpufferspeicher
verwendet, der RAM-Satz-Pufferspeicher das Full-Set Kennungsregister 321 , das gesamtgültige Bit 341 ,
gültige
Eingangsbits 371 , Datenarray 381 , Komparator 401 ,
Treffer/Verfehlen-Logik 461 und
Ausgangsbuffer 441 . Der 2-Wege-Satz-Assoziativpufferspeicher
würde die
Kennungsspeicher 362 und 363 , gültige
Bits 372 und 373 ,
Datenarrays 382 und 383 , Treffer/Verfehlen-Logik 462 und 463 und
Ausgangsbuffer 442 und 443 verwenden. Für eine Konfiguration, die zwei
RAM-Sätze und
einen direkt abgebildeten Pufferspeicher verwendet, würden die
RAM-Sätze die
Full_set Kennungsregister 321 und 322 , gesamtgültige Bits 341 und 342 , gültige
Eingangsbits 371 und 372 , Datenarrays 381 und 382 , Komparatoren 401 und 402 , Treffer/Verfehlen-Logik 461 und 462 und
Ausgangsbuffer 441 und 442 benutzen. Der direkt abgebildete Pufferspeicher
würde den
Kennungsspeicher 363 , gütige Bits 373 , Datenarray 383 ,
Treffer/Verfehlen-Logik 463 und
Ausgangsbuffer 443 verwenden. Für eine Konfiguration,
die drei RAM-Sätze
verwendet, würden
die RAM-Sätze
die Full_set Kennungsregister 321 , 322 und 323 ,
gesamtgültige
Bits 341 , 342 und 343 , gültige
Eingangsbits 371 , 372 und 373 ,
Datenarrays 381 , 382 und 383 ,
Komparatoren 401 , 402 und 403 ,
Treffer/Verfehlen-Logik 461 , 462 und 463 und Ausgangsbuffer 441 , 442 und 443 verwenden.
-
Während das
gezeigte Ausführungsbeispiel
einen 3-Wege-Pufferspeicher bereitstellt, kann jede Anzahl von Pufferspeicherwegen
bereitgestellt werden. Beispielsweise könnte ein 4-Wege-Pufferspeicher
konfiguriert werden zur Benutzung und Kombination eines RAM-Satzes
und satzassoziativer oder anderer Pufferspeicher-Architekturen.
Die einzige zusätzlich
benötigte
Hardware für
den zusätzlichen
RAM-Satz-Pufferspeicher würde
das zusätzliche
Full_Set Kennungsregister und das gesamtgültige Bit sein.
-
Der
RAM-Satz-Pufferspeicher ist kompatibel mit einem selbstmodifizierenden
Code. Falls der Prozessorkern 12 einen Befehl dynamisch
verändert,
wird die Zeile, die die modifizierte Stelle enthält, aus dem Pufferspeicher
gespült
(das heißt
ihr entsprechendes gültiges
Bit 37 wird auf „0" gesetzt), parallel
mit dem Vorgang des Schreibens in den Hauptspeicher. Das nächste Mal,
wenn der Befehl vom Kern 12 angefordert wird, wird das
entsprechende gültige
Bit auf „0" gesetzt sein und
eine Treffer/Verfehlen-Kondition hervorrufen. Die Zeile, die den
angeforderten Befehl enthält,
wird in den RAM-Satz-Pufferspeicher vom Hauptspeicher geladen. In
der bevorzugten Ausführungsform
werden Befehle nicht direkt im Pufferspeicher modifiziert, so daß der Hauptspeicher
nicht aktualisiert werden muß,
wenn eine Zeile im Pufferspeicher ersetzt wird.
-
Wenngleich
die Erfindung in Verbindung mit einem Befehlspufferspeicher diskutiert
wurde, könnte
sie ebenso als ein Datenpufferspeicher oder in einem gemeinsamen
Befehls-/Datenpufferspeicher Verwendung finden.
-
Die
vorliegende Erfindung bietet deutliche Vorteile gegenüber dem
Stand der Technik. Erstens kann der RAM-Satz-Pufferspeicher deutlich
den Betrieb einer Prozessor-Vorrichtung verbessern, die Operationen in
Echtzeit ausführt,
weil ein gewünschter
Code-Block in dem RAM-Satz für
einen schnellen Zugriff gespeichert werden kann. Zweitens gibt es
keinen zusätzlichen
Nachteil wegen des Zugriffs auf einen größeren Datenspeicher 38 für einen
RAM-Satz-Pufferspeicher,
solange die Zugriffszeit des RAM-Satzes nicht größer ist als die Zugriffszeit
auf den 2-Wege-Pufferspeicher. Drittens können ein oder mehrere RAM-Satz-Pufferspeicher
mit einem minimalen Zusatzaufwand an Verschaltung gegenüber einem
herkömmlichen
Pufferspeicher hinzugefügt
werden. Die einzigen zusätzlichen
Schaltungsteile, die erforderlich sind, sind ein oder mehrere Full_Set Kennungsregister 32 und
zugeordnete gesamtgültige
Bits 34 (die gültigen
Bits 37 sind für
die RAM-Sätze
nur nötig,
wenn ein Zeile-für-Zeile-Füllmodus verfügbar ist,
oder selbstmodifizierender Code erlaubt ist; falls der RAM-Satz
nur Satzfüllen
unterstützt
ohne selbstmodifizierenden Code, würden die gültigen Bits 37 unnötig sein).
Die gültigen
Bits 37 von einem satzassoziativen oder anderem Pufferspeicher
können
für den
RAM-Satz auch benutzt werden, falls die gültigen Bits nicht im Kennungsspeicher
selbst enthalten sind. Viertens können die RAM-Sätze in sehr
flexibler Art und Weise mit anderen Pufferspeichern, wie beispielsweise
einem Assoziativ-Pufferspeicher oder einem direkt abgebildeten Pufferspeicher,
wie gewünscht
konfiguriert werden. Fünftens
bietet der RAM-Satz-Pufferspeicher Vorteile gegenüber einem
lokalen RAM, weil ein getrennter Mechanismus zum Laden des RAM für den RAM-Satz-Pufferspeicher nicht
notwendig ist und keine spezifische Adressendekodierung in Serie
mit der Speicherzugriffszeit benötigt
wird. Sechstens kann der Pufferspeicher vom Betriebssystem oder
anderer Software in der gleichen Art und Weise wie ein herkömmlicher
Pufferspeicher gesteuert werden – Laden, Spülen, Zeilen-Annulieren, usw.
können
durch die Software ausgeführt
werden, mit geringfügiger
Software-Anpassung unter Verwendung herkömmlicher Pufferspeicher-Verwaltung.
-
Während die
vorliegende Erfindung hier für
eine spezifische Ausführungsform
gezeigt ist, könnte
sie in einer Anzahl von Realisierungen verwendet werden. Erstens
könnte
die RAM-Satz-Pufferspeicher-Architektur in jeder Art von Prozessor-Vorrichtung
verwendet werden, einschließlich
Mikroprozessoren, DSPs, gemischten analogen/digitalen Prozessoren
und Coprozessoren. Zweitens könnten
die Größen der
Datenarrays, wie sie für
eine bestimmte Realisierung benötigt
werden, mit kleineren Modifizierungen verändert werden. Zum Beispiel
kann es wünschenswert
sein, einen RAM-Satz zu haben mit einem Datenarray, das größer ist,
als der Satz-Assoziativpufferspeicher oder umgekehrt, abhängig von
der Größe der Anwendungen
mit Echtzeitvorgaben. Drittens, während die bevorzugte Ausführungsform
es erlaubt, Pufferspeichertypen in flexibler Art und Weise zu mischen,
kann es unter gewissen Umständen
vorzuziehen sein, einen Satz-Pufferspeichertyp zu haben, wie einen
einzigen RAM-Satz und einen Satz-Assoziativpufferspeicher.
Viertens, die Architektur, die verwendet wird, um Nicht-RAM-Satz-Pufferspeicher
zu realisieren (das heißt,
die Satz-Assoziativpufferspeicher und
die direkt abgebildeten Pufferspeicher) könnten von der hier gezeigten
Architektur abweichende Architekturen verwenden, zum Beispiel ein
CAM (Content Adressable Memory – inhaltsadressierbarer
Speicher) könnte
für die
Kennungsspeicher 36 verwendet werden.
-
Obwohl
die detaillierte Beschreibung der Erfindung auf gewisse beispielhafte
Ausführungsformen
gerichtet waren, sind zahlreiche Abänderungen dieser Ausführungsformen
sowie alternative Ausführungsformen für den Fachmann
erkennbar. Die Erfindung beinhaltet sämtliche Änderungen oder alternativen
Ausführungsformen,
die in den Schutzbereich der Ansprüche fallen.