68k-Übersicht

Wir schreiben das Jahr 1970. Die amerikanische Firma Intel Corp. baut den ersten programmierbaren Mikroprozessor, den legendären 4004. Aus 2300 Transistoren bestehend konnte ihm bei einer Taktfrequenz von 108 KHz die unglaubliche Anzahl von 60000 Rechenoperationen pro Sekunde abgerungen werden. Der Startschuss für eine unglaubliche Entwicklung war gefallen ...

Heute, 30 Jahre später, ist der Mikroprozessor aus der modernen Gesellschaft nicht mehr wegzudenken. Egal ob Mikrowelle, Wasch- oder Spülmaschine, Automobil oder Toaster – überall ist er anzutreffen. Und natürlich nicht zu vergessen ist der Computer, dessen immer komplexer werdende Anwendungen eine immer höhere Rechenleistung erfordern. Um diese bieten zu können war jedoch ein langer Weg notwendig. In diesem Artikel soll nun darauf eingegangen werden, wie man bei der 68k-Reihe versucht hat, die Performance zu verbessern. Mit dem oben erwähnten Prozessor hat die 68000er-Familie jedoch so gut wie nichts mehr gemein.

MC68000

Dieser Prozessor ist der Vater der 68er-Familie. Binnen zwei Jahren entwickelt, wurde er bereits 1979 veröffentlicht und konnte über die 80er (Atari ST, Amiga, Macintosh) bis in die 90er (SEGA Mega-Drive, Atari Jaguar) hinein erfolgreich vermarktet werden. Seine Bezeichnung stammt von der Anzahl der Transistoren, die in ihm werkeln (nämlich 68000), die 13000 Gatterfunktionen ausführen können. Dabei basiert dieser Prozessor auf Mikro-Code. Hierbei handelt es sich um ein ROM, das die Befehle intern in Steuerbefehle umwandelt. Dies geschieht folgendermaßen: Zunächst unterscheidet man zwischen Micro- und Nano-ROM. Das Micro-ROM enthält dabei lediglich Adressen, die auf einzelne Mikroinstruktionen im Nano-ROM verweisen. Wurde ein Befehl dekodiert, wird nun eine Startadresse im Micro-ROM gesetzt, das dann nacheinander die Befehle im Nano-ROM aufruft. Das Nano-ROM steuert schließlich 180 Steuerpunkte in der gesamten CPU an, und das bei jeder Mikro-Instruktion. Die Dauer für Dekodierung und Ausführung beträgt pro Befehl mindestens vier Taktzyklen. Um nicht erst mit der Dekodierung des nächsten Befehls beginnen zu können, wenn dieser aus dem langsamen externen RAM geladen wurde, verfügt der Prozessor über eine Prefetch-Technik (= vorher holen). Während also der eine Befehl noch dekodiert und bearbeitet wird, lädt der 68000 bereits den nächsten in einen internen Zwischenspeicher mit einer Größe von 4 Bytes. Natürlich stehen mit Hilfe dieses Puffers auch eventuelle Operanden der Befehle schneller zur Verfügung. Mit dieser Architektur schafft der 68000 eine Rechenleistung von etwa 1 MIPS (Million Instructions Per Second) bei 8 MHz bzw. 2 MIPS bei 20 MHz. Im Vergleich zu den damaligen 8-Bit-Prozessoren sicherlich ein großer Schritt nach vorne.

MC68020

Der seit 1984 vertriebene 68020-Prozessor wurde seinerzeit sicherlich zu Recht mit der Bezeichnung "Das Superding" bedacht. Grund dafür waren zum einen der interne Cache und zum anderen die parallele Ausführung von Befehlen. Der große Vorteil liegt darin, dass bereits mit der Verarbeitung des nächsten Befehls begonnen werden kann, während der aktuelle noch abgearbeitet wird. Dies wird allerdings nur durch einen von der Verarbeitung abgekoppelten Bus-Controller erreicht. Sobald nämlich ein Befehl abgearbeitet worden ist und von diesem ein Ergebnis in den Speicher geschrieben werden muss, übernimmt der Bus-Contoller diese Aufgabe und die Ausführungseinheit beginnt die Bearbeitung des nächsten Befehls. Die Folge ist ein sogenanntes Overlap. Die Bearbeitungszeit eines Befehls überlappt sich also mit der Bearbeitungszeit des Bus-Controllers. Im Idealfall beträgt somit die Ausführungszeit eines Befehls 0 Taktzyklen, da diese im "Schatten" des Bus-Controllers verschwindet – verglichen mit dem 68000 eine wahre Geschwindigkeitsexplosion. Aber daneben sind auch der nun 6 Bytes große Prefetch-Buffer, der die Befehle bereits dekodiert, während diese die drei Stufen des Prefetch-Buffers durchlaufen, und der 256 Bytes große Instruction-Cache für die Leistungssteigerung verantwortlich. Letzterer erlaubt das Holen von Befehlen in den Prefetch-Buffer nahezu ohne Zeitverzögerung. Hinzu kommt noch, dass der 020 nun über einen 32 Bit breiten externen Datenbus verfügt, im Gegensatz zu den 16 Bit beim 68000. Es sind also um die gleiche Menge Befehle und Daten aus dem Speicher in den Prozessor zu laden und weniger langsame Buszugriffe vonnöten. Auch eine verbesserte Ausführungseinheit kommt im 68020 zum Einsatz. Diese hat deutlich geringere Ausführungszeiten als noch der 68000. Besonders der DIV- und MUL-Befehl haben eine große Beschleunigung erfahren (DIV von 158 auf evtl. 54 Taktzyklen). Alles in allem sind für diese Architektur 250.000 Transistoren nötig, die für eine Rechenleistung von 10 MIPS bei 33 MHz sorgen.

MC68030

Die Änderungen vom 020 zum 030 sind sicherlich nicht so einschneidend, wie die vom 68000 zum 68020. Im Wesentlichen gibt es drei Verbesserungen gegenüber dem Vorgängermodell: Zu dem 256 Byte großen Befehls-Cache gesellt sich nun ein 256 Byte großer Cache für Daten, der die Buszugriffe erneut deutlich verringert und somit für eine weitere Beschleunigung des Prozessors führt. Besonders effektiv sind die für heutige Verhältnisse äußerst kleinen Caches – hauptsächlich, wenn kleine Programmschleifen ausgeführt werden. Ansonsten fällt die Geschwindigkeitssteigerung eher gering aus. Um einem der größten Probleme der Prozessoren entgegenzutreten, beinhaltet der MC68030 auch ein verbessertes Bus-Interface. Dem berühmten Flaschenhals soll damit Paroli geboten werden. Das verbesserte Bus-Interface unterstützt nun den sogenannten Burst-Mode. Hierbei ist der Prozessor in der Lage, seine Caches in ganz wenigen Taktzyklen mit vier Longwords (16 Bytes) zu laden. Damit können erstmals FPM-DRAMs (Fast Page Mode) optimal genutzt werden, bei denen nicht unbedingt für jeden Speicherzugriff sowohl Zeile (RAS) und Spalte (CAS) der Speicherzelle nacheinander angelegt werden müssen. Es genügt, wenn einmal beide Teile der Adresse und anschließend für die nächsten drei Zugriffe nur noch die Spaltenadresse angelegt wird. Der Speicherdurchsatz kann somit deutlich gesteigert werden, da der 030 nun in der Lage ist, ein Langwort in nur einem Taktzyklus zu laden, sofern der Speicher mitkommt.

Schließlich kommt in dieser Ausbaustufe zum ersten Mal eine PMMU (Paged Memory Management Unit) zum Einsatz. Diese ist in der Lage, logische Adressen in der CPU in physikalische Adressen für den Speicher umzusetzen. Dabei bedient sich die MMU dem Address Translation Cache (ATC). Dieser 22 Einträge umfassende Cache enthält die häufig genutzten Umrechnungen. Ist kein Eintrag für eine Umsetzung im Cache vorhanden, wird auf eine Tabelle im RAM zurückgegriffen. Die Umrechnung von Adressen erfolgt dabei parallel zu den Berechnungen der Execution Unit und parallel zu den Aktivitäten des Bus-Controllers. Im TT dient die MMU zur Emulierung des ST-Adressraums. Aber auch für virtuellen Speicher kann die MMU eingesetzt werden.

Ansonsten bleibt alles beim Alten, abgesehen von einer erneut verbesserten Ausführungseinheit. Diese Änderungen im Design sorgen für eine Rechenleistung von 18 MIPS bei 50 MHz.

MC68040 Der 040 war lange Zeit der letzte Prozessor der Familie, konnte aber auch die benötigte Performance bieten. Folgende Änderungen sind vorgenommen worden: Die bei 020 und 030 noch dreistufige Pipeline ist mittlerweile auf sechs Stufen angewachsen. Hierbei besteht jedoch das Problem, dass man bei bedingten Verzweigungen immer Teile des Inhalts der Pipe verwerfen muss, sollte der falsche Weg der Verzweigung eingeschlagen worden sein. Der MC68040 umgeht dieses Problem einfach dadurch, dass er beide Möglichkeiten in seine Pipeline lädt. Hierzu verfügt er über je zwei "Instruction Fetch" und "Decode" Stufen. Die weitere Verkleinerung der Strukturen auf den Chips sorgt auch dafür, dass man höhere Taktfrequenzen realisieren kann. Im 040 wird schlichtweg der interne Teil mit der doppelten Frequenz des Bus-Controllers betrieben. Die Vergrößerung der Caches auf nun jeweils 4 KB scheint daher unabdingbar, da ansonsten die Wahrscheinlichkeit für einen Cache-Miss zu groß wäre. Die Folge wären zu viele langsame Bus-Zugriffe, die den Prozessor merklich ausbremsen würden. Die CPU wäre dann nicht in der Lage, genügend Daten an die Pipeline zu liefern und die wahre Geschwindigkeit zu entfalten. Mittlerweile gibt es für Daten und Befehle getrennte MMUs, denen ein je 64 Einträge umfassender ATC zur Seite steht. Die Zugriffe auf Tabellen zur Adressumrechnung im Speicher entfallen also größtenteils. Und natürlich wurde erneut die Ausführungseinheit verbessert (Ausführungszeit von DIV auf evtl. 8(ea Calculate)+27(Execute)=35 Taktzyklen). Insgesamt liegt das Zauberwort des MC68040 in der Verringerung der Buszugriffe, aber auch die weitere Parallelisierung der Aktionen spielt sicherlich eine gewichtige Rolle. Mit diesen Optimierungen kann der 040 eine Rechenleistung von 44 MIPS bei 40/80 MHz bieten, was in etwa der Rechenleistung von 486DX2-Rechnern entspricht, bei denen ebenfalls der interne Takt verdoppelt wurde.

MC68060

...ist der letzte Vertreter der 68k-Reihe und mit großer Überlegenheit auch der Schnellste. Der 060 kann architektonisch als Pendant zum ersten PPC auf 68k-Basis gesehen werden und hat daher – verglichen mit dem 68040 – so manches zu bieten. Ein äußerst wichtiges Kriterium stellen wie immer die Caches dar. Mit nun jeweils 8 KB für Befehle und Daten kann der 68060 erneut einen enormen Geschwindigkeitszuwachs verbuchen. Allerdings kann man dieses Spielchen nicht beliebig weit treiben: Irgendwann lohnt sich die Vergrößerung der 1st-Level-Caches kaum noch, da die Wahrscheinlichkeit für einen Cache-Hit dadurch nur noch unmerklich gesteigert wird. Bei modernen Prozessoren haben sich zwischen 16-64 KB große Caches je für Daten und Befehle durchgesetzt. Die zweite bedeutendste Änderung ist mit Sicherheit, dass die Integer-Unit nun über zwei Pipelines verfügt (Operand Execution Pipelines), die simultan Befehle abarbeiten können. Dazu hat man das Holen der Befehle (Fetch) von der übrigen Verarbeitung abgekoppelt. Die "Instuction Fetch Unit" verfügt über eine vierstufige Pipeline, die die Befehle bereits teilweise dekodiert und der Integer-Unit noch gewisse Steuerbits bereitstellt. Der 96 Byte große "Instruction Buffer" fungiert als FIFO-Buffer (First In – First Out) und lagert die abzuarbeitenden Befehle zwischen, bis die OEPs Zeit haben für deren Bearbeitung. Die Größe von 96 Byte sorgt dabei dafür, dass die Integer Unit immer möglichst viel zu tun hat und die kostbare Rechenzeit nicht durch Leerlauf vergeudet wird. Die IFU beinhaltet aber noch eine weitere sehr wichtige Neuerung: Den Branch Cache. Dieser 256 Einträge umfassende Cache merkt sich, ob ein bedingter Sprung an einer bestimmten Adresse beim letzten Mal getätigt oder nicht getätigt wurde und enthält auch gleich das Ziel eines getätigten Sprungs. Ist kein Eintrag im Branch Cache vorhanden, so wird ohne zu verzweigen der nächste Befehl geladen. Der Sinn des Ganzen liegt darin, dass man versucht, nicht unnötig falsche Befehle in die Pipeline zu laden, die, wenn sich herausstellt, dass der Sprungbefehl doch an die andere Stelle springt, verworfen werden müssen. Das erneute langwierige Füllen der Pipes ist dann nämlich die Folge. Die Ausführungseinheiten des MC68060 sind nun soweit optimiert, dass der überwiegende Teil der Integer Befehle in einem Taktzyklus abgearbeitet werden kann. Wird festgestellt, dass ein Befehl für die FPU gedacht ist, so wird er nach der Berechnung der effektiven Adresse an diese weitergegeben. Ist die Bearbeitung eines Befehls abgeschlossen, so kommt das Ergebnis in einen vier Einträge umfassenden Puffer (Data Available), sofern es ein Ergebnis gibt, das in den externen Speicher oder in den internen Cache geschrieben werden muss. Erst wenn der Bus für die CPU frei ist, wird das Resultat in den Speicher zurückgeschrieben (Write Back). Der vier Einträge umfassende Puffer sorgt dabei für die Abtrennung von Ausführen und Rückschreiben des Resultats, wodurch die Ausführung nicht etwa durch einen von einem anderen Chip benutzten Bus unterbrochen werden müsste.

Es gibt aber noch eine grundlegende Änderung im 060: Sämtliche Register und Speicher sind nun statischer Natur. Das hießt, dass man nicht wie bei allen anderen Vertretern der 68k-Familie den Inhalt der Register nach einer gewissen Zeit auffrischen muss, um diesen nicht zu verlieren. Als positiver Nebeneffekt erhält man die Möglichkeit, Teile des Prozessors einfach abzuschalten und auch nicht mehr mit einem Taktsignal zu versorgen, das bei den übrigen Vertretern der Famile immer die Refresh-Signale hervorbrachte. Der Prozessor macht sich dies selbst zunutze und schaltet gerade nicht benötigte Einheiten im Prozessor einfach ab. Man erhält aber auch per Software die Möglichkeit, den Prozessor in einen Tiefschlaf zu versetzen. Er hört dann auf, Befehle zu holen und auszuführen, indem die Execution Unit und die übrigen Teile des Prozessors zum Großteil abgeschaltet werden. Und anstatt den Prozessor weiterhin mit der normalen Taktfrequenz von z.B. 60 MHz zu betreiben, kann man diese nun auf 0 MHz herunterfahren, was zu einer weiteren Einsparung der Stromverbrauchs führt (im Idealfall nur 30 mW!).

Insgesamt weist der 060 bereits auf die Architektur moderner Prozessoren hin: Große Caches, mehrere Pipelines und ein Branch-Cache machen die Performance des 060 aus. Sicherlich eine gute Architektur, die durch weiteres Ausbauen zweifellos noch hätte verbessert werden können. Mit der Zeit allerdings – so ist zu vermuten – wäre das 68k-Design wohl dennoch am Ende gewesen. Man hätte schon einschneidende Veränderungen vornehmen müssen, um z.B. die für heutige Verhältnisse etwas bescheidenen acht Daten- und acht Adressregister zu erweitern.

Wir sind am Ende unseres Streifzuges durch die 68000-Familie angelangt. Zwar haben wir Exoten wie 68008, 68010, 68012 oder gar den 68070 außer Acht gelassen (nein, bei letzterem handelt es sich nicht um eine Weiterentwicklung des 68060, sondern nur um einen 68000 mit integrierten Controllern, der z.B. in Philips CD-i eingesetzt wurde), aber dennoch sieht man deutlich, dass man nicht einfach von der Taktfrequenz auf die Geschwindigkeit eines Prozessors schließen kann. Es kommt eben auf die Architektur an! Und diese zielt in der Zukunft – wie auch schon in der Vergangenheit – immer weiter auf die Parallelisierung, da man die Taktfrequenzen aufgrund der Gatterlaufzeiten nicht beliebig steigern kann. War der erste PPC 601 nur in der Lage, drei Befehle gleichzeitig auszuführen, so sind es beim G4 bereits acht.

Die 68k-Familie im Überblick
Bezeichnung:MC68000MC68020MC68030MC68040MC68060
Einführung:19791984198719891994
Datenbus[Bit]:1632323232
Adressbus[Bit]:2432323232
I-Cache:25625640968192
D-Cache:25640968192
Burst-Mode16 Byte R16 Byte R/W16 Byte R/W
FPU68881/2(Soft)68881/268881/2internintern
MMUneinneinjajaja
ATC222*642*64
Int-Pielines11112
Stufen233610
Branch Cache256
Transistoren[Mio]0,0680,250,31,22,5
f max [MHz]20335040/8075
Rechenleist.[MIPS]2101844110
Rechenleist.[MFLOPS]0,250,53,512

Tech-Talk: Pipelining

Bei alten Prozessoren war es üblich, dass immer nur ein Schritt ausgeführt werden konnte. Zuerst wurde der Befehl geladen, anschließend dekodiert, ausgeführt und das Ergebnis zurückgeschrieben, ohne dass während dieser Zeit etwas mit dem darauffolgenden Befehl geschieht. Beim Pipelining geht man nun daran und lässt den Prozessor diese Aktionen parallel, also gleichzeitig ausführen. Wenn der erste Befehl dekodiert wird, findet bereits das Laden oder Holen (Fetch) des nächsten Befehls statt. Während der Ausführung eines Befehls wird schließlich der nächste dekodiert und der übernächste geladen. Die Ausführungsgeschwindigkeit wird so drastisch gesteigert, da immer mehrere Aktionen gleichzeitig ausgeführt werden.

Die Länge der Pipes ist höchst unterschiedlich. Der 68000 z.B. bietet nur eine zweistufige Pipe (s. Text), während moderne Prozessoren über bis zu 16-stufige (Pentium III) Pipes verfügen. Dabei hat die Länge großen Einfluss auf die Geschwindigkeit: Sind diese zu kurz erreicht man ein zu geringes Maß an Parallelität und die einzelnen Stufen haben viel Arbeit zu leisten. Der Pipelinetakt kann dann nicht allzu hoch sein. Sind diese zu lang, kann zwar der Pipeline-Takt hoch sein, aber bei Programmverzweigungen hat man das Problem, dass mehr Stufen der Pipe erneut mit anderen Befehlen gefüllt werden muss, wenn vorher der falsche Weg eingeschlagen wurde. Das theoretische Optimum ist im Bereich von 8-9 Stufen anzusiedeln.


Matthias Alles
Aus: ST-Computer 08 / 2000, Seite 26

Links

Copyright-Bestimmungen: siehe Über diese Seite