2. Teil. “68040 Spezial”. Sehr ins Detail gegangen… [28.05.1990]
Aha! Du willst also mehr wissen…schoen! (Nebenbei: Du darfst ruhig auch mal was hier loswerden)
Der MC 68040 (so heisst er richtig) besteht aus fuenf Bloecken,die weitgehend unabhaengig voneineander arbeiten koennen. Die Integer und FP einheit sind die eigentl. Arbeitsbereiche. Sie enthalten eigene Pipe- lines fuer maximale Leistung. Die Befehlseinheit enthaelt Befehls-MMU mit Uebersetzungscache, Befehlscache und Snooplogik; Sie versorgt die beiden Uberstezungseinheiten (UeE) mit den Befehlen und entlastet somit den Bus. Die Dateneinheit enhaelt Daten-MMU mit Ue-cache, Datencache und Snoop- logik. Sie dient dazu die beiden Verarbeitungseiheiten mit Operanden zu versorgen und dabei den Bus moeglichst wenig in Ansruch zu nehmen. Der Buscontroller stellt dann die Schnittstelle zu externen Bus dar. Durch mehrere 128 Bit Register und eine 3 stufige Pipeline wird der externe Bus so optimal genutzt. Fuer schnellstmoeglichen Datentransport ist der interne Bus teilweise 128 Bit breit. Das zur “Geographie”. Die 68000’er Familie ist microprogrammiert. Das erlaubt leistungs- fahigere Befehle und Adressierungsarten sowie zugleich einen Ueber- sichtlichen,modularen Aufbau des Bausteins. Die RISC Familie (z.B.: 88000’er, SPARC oder ARM) geht da einen anderen Weg: Direkte ausfuehrung der Befehle in Hardware. Das steigert zwar die Anzahl der Befehle pro Zeiteinheit, beschraenkt aber gleichzeitig Umfang und Leistungsfaehigkeit der einzellen Befehle. Der 68040 versucht die Vorteile beider Verfahren zu verbinden. Er ist zwar mircoprogrammiert, aber einzellne Schritte innerhalb vieler Befehele wurden vom Microprogramm in die Hardware verlegt. Ein Bsp. hiefuer sind vor allem die Adressierungsarten. Die 68000 Familie verfuegt uber eine grosse Anzahl solcher Befehle. Man hat nun Untersuchungen ueber die Nutzung dieser angestellt. Jetzt verarbeitet ein speziell fuer den 040 entwickelter Hardwaredekoder diese Adressierungen in Hardware. Auch die Arbeit der beiden MMU, beim 030 ebenfalls in Mircocode erledigt, wird beim 040 in der Hardware durchgefuehrt, was die Adressierungszeiten drastisch steigerte.
DIE INTEGEREINHEIT ist funktions und objektkompatibel zu der des 020/030. Viele Optimierungen sorgen aber dafur, dass deren Leistung im Schnitt 3,6 mal hoeher ist als die eines 020 bei gleichem Takt (=BCLOCK). Dies resultiert aus verschiedenen Dingen: Hauptsaechlich aber da die Integer- einheit mit doppeltem Takt (=PCLOCK) arbeitet (Wie alle anderen Teile auch) Verglichen mit 020/030 sind somit alle Operationen von vorneherein doppelt so schnell. Durch viele weitere Optimierungen (Hardwareverlagerung, grosse Pipeline etc) wurde erreicht,dass die Anzahl der Takte pro Befehl um den Faktor 1,8 reduziert werden konnte. Dazu existiert in der Int-Einheit eine 6 Stufige Pipeline (Die nicht nur als prefetch Queue benutzt wird sondern auch pro Stufe je einen Befehl ausfuehren kann). Die Stufen sind:
* Prefetch des Befehls
* Befehl dekodieren
* Die effektive Adresse der benoetigten Daten berechnen
* Die Daten holen
* Die Berechnung durchfuehren
* Das Ergebnis zurueckschreiben
Damit kann diese Pipeline der Int.-Einheit schon 6 Befehle gleichzeitig abarbeiten. Eine derartig lange Pipeline hat normalerweise aber auch Nachteile. So muss sie bei jedem ausgefuehrten Sprung geleert werden und wieder neu geladen werden. Da Spruenge recht haeufing sind(alle 5-8 Befehle ein Sprung), wuerde ohne Vorkehrung die Leistung sehr schnell in die Kniee gehen. Der 040 vermeidet dieses Pipeline-Sprung Probelm indem die ersten beiden Stufen doppelt vorhanden sind. Wird in der 2. Stufe erkannt, dass ein bedingter Sprung vorliegt, so ist zu diesem Zeitpunkt noch nicht bekannt,ob der Sprung ausgefuehrt wird oder nicht (die Bedingung ist noch nicht ausgewertet). Der 040 liest dann beide Programmzweige aus dem Cache und dekodiert bereits die beiden moeglichen Befehle nach dem Sprung (den Befehl an der Stelle des Sprungziels, fuer den Fall, dass der bedingte Sprung ausgefuehrt werden soll und den Befehl unmittelbar nach dem Sprungbefehl, falls der Sprung nicht ausgefuehrt wird) Sobald bekannt ist ob der Sprung ausgefuehrt wird ist der erste Befehl aus jedem Zweig bereits geholt und dekodiert. Wird der Sprung aus- gefuehrt, so kann direkt weitergearbeitet werden. Wird der Sprung NICHT ausgefuehrt,brauch nur auf die andere Pipeline umgeschaltet werden und der Befehlsfluss wird dadurch nicht gestoert. (IST DAS NICHT GEIL!?) Die Pipeline ist fuer “ausgefuehrte bedingte Spruenge” optimiert, denn Untersuchungen haben ergeben, dass fast 70% aller bedingten Sprunenge ausgefuehrt werden.
DIE FOATINGPOINTEINHEIT ist voll kompatibel zum IEEE-754-1988 Standart und arbeitet PARALLEL zur Integereinheit. Sie hat eine 3 Stufige Pipe- line und einen eigenen Registersatz mit 8 FP-Registern,die 80Bit breit sind (komp. zu 68881/2). Die Pipeline ist folgendermasse aufgebaut:
* Konvertieren der Operanden in das interne 80Bit Format
* Ausfuehrung des Befehls
* Zuruekschreiben des Ergebnisses
Die FP-EInheit wurde fuer Befehle optimiert,die am Meisten genutzt werden. Fuer maximale Leistung wurde eine FP-Hardware-Multiplizierer eingebaut. Fuer bessere Optimierung wurden nur die FP-Grundbefehle im 040 implementiert und fuer die restlichen Befehle (Trigonometrie etc.) steht ein Software- paket zur verfuegung. Dieses Paket kann ueber einen sog. F-LINE-TRAP implementiert werden. CACHES sind ja anscheinend momentan das Nonplusultra wenn es um Vergleiche bei Prozessoren geht. Naja. Also die dinger sind ja dazu da,um moeglichst unabhangig von der Geschwindigkeit des Speichers zu sein. So besass der 68020 schon einen 256Byte grossen Befehlscache, der im 030 noch einen ebenso grossen Datencache zur Seite gestellt bekam. Beide wurden als logische Caches (sie befinden sich am logischen Adressbus zwischen CPU und MMU) mit einer groesse von 256 Bytes ausgefuehrt. Beim 68040 dient der groesste Teil der 1,2 Millionen Transistoren den Caches und deren Verwaltung. Es gibt wieder getrennte Befehls/Datencaches mit eigenen Bussen,sodass auf beide gleichzeitig zugegriffen werden kann. Hier wurden PHYSIKALISCHE Caches implementiert,die sich am physikalischen Adressbus der MMU befinden. Das bietet gewisse Vorteile: Im Multitaskingbetrieb ueberschneiden sich meist die logischen Adress- bereiche der verschiedenen Tasks, falls eine MMU verwendet wird. Ein logisches Cache kann nicht zwischen Speicherbereichen versch. Tasks unterscheiden, wenn sie gleiche (logische) Adressen haben. Das hat zur Folge,dass nach jedem Taskswitch ein logischer Cache von der Software geloescht werden muss. Bei einem Copy-Back-Cache muessten alle ver- aenderten Daten in den Speicher zurueckgeschrieben werden,was bei einem grossen Cache viel Zeit kostet. Damit erhoehen sich bei einem Taskswitch notwendige Zeiten drastisch, was einen Echtzeitbetrieb unmoeglich macht. Der 040 Cache kennt solche Nachteile nicht (der Glueckliche!). Da sich die physikalischen Adressen der versch. Tasks immer unterscheiden koennen Speicherausschnitte beliebig vieler Tasks gleichzeitig im Cache gehalten werden. Bei einem Taskswitch muss der Cache also nicht ge- loescht werden, und veraenderte Daten brauchen nicht zurueckgeschrieben werden. Ausserdem steigt dabei die Trefferwahrscheinlichkeit des Caches. Beide Caches haben eine grosse von 4K. Die Caches sind fuer den Burstmode optimiert,d.h. fuer die Aufnahme des Datentyps “Cachezeile” (16Byte) vor- gesehen. So das soll erstmal langen. Falls noch weiteres Interesse nach z.B. Datenkosistenz bei mehreren Busmastern, Memory managment oder Businterface/controller besteht bitte melden,gell.
Ach ja bevor ich es vergesse: Ich liebe diesen Prozessor! 🙂
mfg AXEL