DLX-Prozessor

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Der DLX-Mikroprozessor ist eine hypothetische Prozessorarchitektur, die von John L. Hennessy und David A. Patterson (den ursprünglichen Designern der MIPS und Berkeley RISC-Architektur) entwickelt wurde. Er wurde in dem – von beiden gemeinsam verfassten – Buch Computer Architecture: A Quantitative Approach vorgestellt. Der DLX-Prozessor wird mit einem RISC-Befehlssatz angesteuert und besitzt 32 Register. Es gibt DLX-Simulatoren, die die unterschiedlichen Pipelinestufen grafisch darstellen und Assembler-Befehle interpretieren. Solche werden an einigen Hochschulen in Vorlesungen zur hardwarenahen Programmierung benutzt.

Die Bezeichnung DLX[Bearbeiten]

Für die Herkunft der Bezeichnung "DLX" gibt es mehrere mögliche historische Erklärungen:

  • DLX wie deluxe
  • DLX als römische Zahl: 560 (Mittelwert aus den damals üblichen Prozessor-Architekturen: AMD Am29000, DECstation 3100, HP 850, IBM 801, Intel i860, MIPS M/120A, MIPS m/1000, Motorola 88000, RISC 1, SGI 4D/60, SPARCstation-1, Sun-4/110, Sun-4/260)

Pipeline[Bearbeiten]

Die Pipeline des DLX-Prozessors besteht aus fünf Stufen:

  1. Instruction Fetch (IF): Laden des Befehls in den Befehlspuffer, Erhöhung des Befehlszählers.
  2. Instruction Decode (ID): Erzeugung der prozessorinternen Steuersignale, Bereitstellung der Operanden aus den Registern.
  3. Execute (EX): ALU führt Operation aus, Berechnung der effektiven Adresse bei Lade-/Speicherbefehlen.
  4. Memory Access (MEM oder MA): Durchführung des Speicherzugriffs bei Lade-/Speicherbefehlen. Andere Befehle durchlaufen diese Phase passiv.
  5. Write Back (WB): Schreiben des Operationsergebnisses in ein Register. Befehle ohne Ergebnis durchlaufen diese Phase passiv.

Das Design der DLX-Pipeline verhindert das Auftreten von Schreibe-nach-Lese- (write after read) und Schreibe-nach-Schreibe-Konflikten (write after write). Lese-nach-Schreibe-Konflikte (read after write) werden jedoch nicht verhindert.

Registerbedeutungen[Bearbeiten]

  • R0 null; unveränderlich
  • R1 reserviert für den Assembler
  • R2-R3 Funktionsrückgabewerte
  • R4-R7 Funktionsparameter
  • R8-R15 beliebig
  • R16-R23 Registervariablen
  • R24-R25 beliebig
  • R26-R27 reserviert für das Betriebssystem
  • R28 Globaler Pointer
  • R29 Stackpointer
  • R30 Registervariable
  • R31 Rücksprungadresse

Befehlsformate[Bearbeiten]

Ein DLX-Befehl ist immer 32 Bit lang. Die unterschiedlichen Befehlsformate definieren die Aufteilung des 32-Bit-Befehls in Felder. Bei allen drei Formaten sind die ersten 6 Bit immer der Opcode.

I-Format[Bearbeiten]

Befehle dieses Formates sind Load/Store Instruktionen, arithmetische Befehle oder bedingte/unbedingte Sprünge. Die Instruktion besteht aus einem Quellregister rs1 und einem Zielregister rd, zusätzlich sind 16 Bit für den Immediate-Wert vorgesehen, die je nach Befehlstyp benutzt werden.

 0         5 6  10 11 15 16              31
 ==========================================
 | opcode   | rs1 |  rd |  immediate      |
 ==========================================

Beispielbefehle: LW, SW, JALR

R-Format[Bearbeiten]

Dieses Format wird benutzt um Operationen auf Registern durchzuführen, dabei werden die Quellregister rs1 und rs2 mit der Register-ALU Operation func ausgeführt, und das Ergebnis auf das rd–Register abgelegt.

 0         5 6  10 11 15 16 20 21        31
 ==========================================
 | opcode   | rs1 | rs2 |  rd |   func    |
 ==========================================

Beispielbefehl: SLT, ADD, SUB

J-Format[Bearbeiten]

Befehle dieses Formates sind Sprungbefehle. Die (dist)anz wird einfach auf den Befehlszähler hinzuaddiert.

 0         5 6                           31
 ==========================================
 | opcode   |            dist             |
 ==========================================

Beispielbefehle: J, JAL

Befehlssatz[Bearbeiten]

Auszug aus dem DLX-Befehlssatz ohne Floating-Point-Befehle:

Instruction                       Instruction meaning
LB / LH / LW         R1,val(R2)   Load byte / load half word / load word
LBU / LHU            R1,val(R2)   Load byte unsigned / load half word unsigned
SB / SH / SW         val(R2),R1   Store byte / store half word / store word
LHI                  R1,#val      Load high immediate
ADD / SUB            R1,R2,R3     Add / subtract
ADDU / SUBU          R1,R2,R3     Add unsigned / subtract unsigned
ADDI / SUBI          R1,R2,#val   Add immediate / subtract immediate
ADDUI / SUBUI        R1,R2,#val   Add immediate unsigned / subtract immediate unsigned
AND / OR / XOR       R1,R2,R3     And / or / exclusive or
ANDI / ORI / XORI    R1,R2,#val   And immediate / or immediate / exclusive or immediate
SLL / SRL / SRA      R1,R2,R3     Shift left logical / shift right logical / shift right arithmetic
SLLI / SRLI / SRAI   R1,R2,#val   Shift- left log. / right log. / right arithmetic -immediate
SLT / SLE / SEQ      R1,R2,R3     Set- less than / less or equal than / equal
SLTI / SLEI / SEQI   R1,R2,#val   Set- less than / less or equal than / equal -immediate
SGT / SGE / SNE      R1,R2,R3     Set- greater than / greater equal than / not equal
SGTI / SGEI / SNEI   R1,R2,#val   Set- greater than / greater equal / not equal -immediate
BEQZ / BNEZ          R4,name      Branch equal zero / branch not equal zero
J                    name         Jump
JR                   R5           Jump register
JAL                  name         Jump and link (save return address in R31)
JALR                 R5           Jump and link register (save return address in R31)
val:  16 Bit Wert als Adress-Offset oder Immediate-Wert
name: 16 oder 26 Bit Adress-Distanz

Literatur[Bearbeiten]

  • John Hennessy, David Patterson: Computer Architecture. A Quantitative Approach., 3. Ausgabe, Morgan Kaufmann Publishers, ISBN 1-55860-724-2 (engl.)
  • Uwe Brinkschulte, Theo Ungerer: Mikrocontroller und Mikroprozessoren, Springer-Verlag, Berlin 2007, ISBN 978-3-540-4680-1-1, Seite 49.

Weblinks[Bearbeiten]