SPARC (mikroprosessor)

Fra Wikipedia, den frie encyklopedi
Gå til: navigasjon, søk
Sun SPARC MB86900
Mikroprosessor
Produsert 1987
Produsent Sun Microsystems
Klokkefrekvens 16.67 MHz
Socket PGA med 256 pinner
Kjerne SPARC versjon 7

SPARC var en 32-bit RISC mikroprosessor som ble lansert av Sun Microsystems i 1987. SPARC var den første mikroprosessoren i SPARC-familien, og den første implementasjonen av spesifikasjonen SPARC Versjon 7.

SPARC ble annonsert av Sun Microsystems i 1986, og ble satt i produksjon i uke 46 i 1987 av Fujitsu.

SPARC ble første gang tatt i bruk av Sun Microsystems i arbeidsstasjonen Sun-4.

Spesifikasjonen SPARC Versjon 7 definerte en åpen, ikke-proprietær arkitektur, og forskjellige SPARC-prosessorer ble etterhvert produsert av Fujitsu, LSI Logic, Weitek, Texas Instruments og Cypress.

Eksempler på SPARC[rediger | rediger kilde]

Sun Microsystems SPARC MB86900 / MB86910[rediger | rediger kilde]

Implementasjonen fra Sun Microsystems bestod av to adskilte brikker. Heltallsenheten hadde benevnelsen MB86900 (også kalt SF9010), og desimaltallsenheten ble kalt MB86910. Klokkefrekvensen var 16.67 MHz.

Brikkene ble produsert i Japan ved hjelp av Fujitsus CMOS 20K prosss, og bestod av 110,000 transistorer produsert med en 1.30 µ CMOS-prosess. De opererte i sykluser på 60 ns.[1][2] Brikkenes interne elektriske spenning var 5 Volt.

Cypress/ROSS SPARC CY7C601[rediger | rediger kilde]

ROSS SPARC CY7C601
Mikroprosessor
Produsert 1987
Produsent Ross Technology
Klokkefrekvens 33 MHz
Kjerne SPARC versjon 7

Den andre SPARC-prosessoren ble lansert i 1987 av Ross Technology, som på denne tiden var et underselskap av Cypress. Implementasjonen bestod av tre brikker – en heltallsenhet, en desimaltallsenhet og en Memory Management Unit. Klokkefrekvensen var 33 MHz.

CY7C601 ble produsert med en 0.8 µ CMOS-prosess, og opererte i sykluser på 30 ns.[2]

Mikroprosessoren benyttet en 64 KB ekstern nivå-1 cache for både data og instruksjoner.

Da Cypress solgte Ross Technology til Fujitsu i 1993, ble implementasjonen omdøpt til ROSS RT601.

Cypress SPARC CY7C601-40 og Cypress SPARC CY7C601-40GC[rediger | rediger kilde]

Disse prosessorene ble produsert med en 0.8 µ CMOS-prosess, og bestod av 1.8 millioner transistorer. Cypress SPARC CY7C601-40GC hadde 207 pinner for en PGA-socket, mens Cypress SPARC CY7C601-40 hadde 208 pinner for en QFP socket. Begge prosessorene kjørte i 40 MHz.

Desimaltallsenheten ble kalt Cypress CY7C602 (40 MHz), mens cache-kontrolleren hadde navnet Cypress CY7C605 (40 Mhz).

Fujitsu SPARC MB86902[rediger | rediger kilde]

Fujitsu SPARC MB86902
Mikroprosessor
Produsert 1991
Produsent Fujitsu
Klokkefrekvens 20 og 25 MHz
Socket PQFP med 160 pinner
Kjerne SPARC versjon 7

Arbeidet med Fujitsu SPARC MB86902 startet allerede i 1986, og ble annonsert av Fujitsu i juni 1990 som en mikroprosessor for innebygde systemer. SPARC MB86902 var en avart av SPARC MB86901, som ble brukt i SPARCstation 1. Prosessoren ble lansert i uke 4 i 1991.

Fujitsu SPARC MB86902 var kompatibel med Fujitsu 86920 Memory Management Unit og desimaltallsprosessoren Weitek 3170. Prosessoren hadde ingen integrert cache.

Fujitsu SPARC MB86902 var tilgjengelig i klokkefrekvenser på 20 og 25 MHz og hadde 160 pinner i en PQFP socket.

Mikroprosessoren ble benyttet i Sun SPARCstation IPC.

Fujitsu SPARC MB86903[rediger | rediger kilde]

Fujitsu SPARC MB86903
Mikroprosessor
Ic-photo-fujitsu-MB86903-40.png
40 MHz Fujitsu SPARC MB86903
Produsert 1991
Produsent Fujitsu
Klokkefrekvens 33 og 40 MHz
Socket PGA med 207 pinner
Kjerne SPARC versjon 7

Arbeidet med Fujitsu SPARC MB86903 startet i 1987, og prosessoren ble lansert i uke 21 i 1991.

Denne prosessoren hadde en integrert desimaltallsprosessor og opererte i hastigheter på 33 og 40 MHz. Ved beregning av heltall hadde den en ytelse på 20 og 25 MIPS. Ved desimaltallsberegninger var ytelsen 4 og 5 MFLOPS.

Heltallsenheten benyttet 136 registre, organisert i åtte register-vinduer, og en optimalisert håndterer av betingede hopp.

Fujitsu SPARC MB86903 ble benyttet i Sun SPARCstation IPX i 1991.

Arkitekturen[rediger | rediger kilde]

Spesifikasjonen SPARC versjon 7 inkluderte en CPU (kalt heltallsenhet, Integer Unit), en desimaltalls prosessor (kalt flytetallsenhet, Floating Point Unit) og en valgfri koprosessor. De fleste SPARC-systemer hadde også en ekstern Memory Management Unit og en nivå-1 cache.

Alle instruksjoner og registre var 32-bit. Databussen og adressebussen var også 32-bit, og SPARC kunne adressere 232 eller 4 GB 8-bit bytes i minnet.

En typisk SPARC benyttet en 4-trinns pipeline for heltall, og arbeidet med fire instruksjoner samtidig. Mens en instruksjon ble hentet fra cache, ble en annen dekodet, en tredje utført, og resultatet av en fjerde skrevet til minnet:

Syklus 1 2 3 4 5 6 7
Instruksjon 1 HENT DEKOD UTFØR SKRIV
Instruksjon 2 HENT DEKOD UTFØR SKRIV
Instruksjon 3 HENT DEKOD UTFØR SKRIV
Instruksjon 4 HENT DEKOD UTFØR SKRIV

Register-vinduer[rediger | rediger kilde]

I CISC-prosessorer er en stor del av dataoverføringene mellom mikroprosessoren og RAM knyttet til prosedyrekall: Parametrene overføres, innholdet i registrene lagres, retur-adressen legges på stakken og hentes tilbake igjen når prosedyren er avsluttet. Datamaskinens minne har tradisjonelt vært, og er fortsatt, mye tregere enn mikroprosessorens interne registre. I mange arkitekturer er derfor prosedyrekall en stor flaskehals for den totale ytelsen.

Arkitektene bak RISC-prosessoren RISC I (1981) og etterfølgeren RISC II benyttet en genial metode for å oppheve nesten alle slike dataoverføringer. De innførte «overlappende register-vinduer», som også benyttes i SPARC.[3][4] RISC I og RISC II var inspirasjonskilden til SPARC, men SPARC benytter en noe avvikende implementasjon.

SPARC-spesifikasjonen opererer med 32 stk 32-bit registre, nummerert fra R0 til R31. Registrene er delt inn i fire grupper:

# 32 bit lange registre
R0–R7 Globale variabler
R8–R15 Inngående parametre
R16–R23 Lokale variable
R24–R31 Utgående parametre
  • R0–R7 er nedenfor nummererte fra G0 til G7. G0 er alltid null. Registrene G1–G7 er globale, og kan inneholde heltall, pekere til tabeller eller andre data-elementer.
  • R8–R15 er nedenfor nummererte fra I0 til I7, og inneholder de inngående parametrene til en kallende prosedyre. I tradisjonelle CISC-maskiner legges disse på stakken én etter én, like før prosedyrekall.
  • R16–R23 er nedenfor nummererte fra L0 til L7. De er avsatt til åtte lokale variabler inne i den kalte prosedyren. Også her unngår man bruk av stakken.
  • R24–R31 er nedenfor nummererte fra O0 til O7. De er avsatt til åtte utgående parametre fra prosedyren som er avsluttet. Også her unngår man stakken.

SPARC tillater flere sett («register-vinduer») med 32 stk 32-bit registre, som er det antallet enhver prosedyre på et gitt tidspunkt «ser». 5-bit variabelen CWP (Current Window Pointer) peker på R8. 25= 32, og gir opptil (32 x 16) + 8 globale registre, eller 520 registre.

Istedenfor å flytte data mellom registrene og RAM, flyttes CWP innenfor registrene, og gir programmet den illusjon at det opererer med et annet register.

 
# Register-innhold
R0–R7 Globale
# Register-innhold
R8–
R15
Inn
R16–R23 Lokale
R24–R31 Ut Fairytale right red.png
(R32–R38)
(R39–R45)
(R46–R52)
(R53–R59)
 
# Register-innhold
R0–R7 Globale
# Register-innhold
(R8–R15)
(R16–R23)
R8–
R15
Fairytale right red.png Inn
R16–R23 Lokale
R24–R31 Ut Fairytale right red.png
(R46–R52)
(R53–R59)
 
# Register-innhold
R0–R7 Globale
# Register-innhold
(R8–R15)
(R16–R23)
(R24–R31)
(R32–R38)
R8–
R15
Fairytale right red.png Inn
R16–R23 Lokale
R24–R31 Ut Fairytale right red.png

Ovenfor illustreres tre register-vinduer for tre prosedyrer. I det første register-vinduet (og prosedyren) ligger utgående variabler i R24–R31. Ved å flytte CWP nedover 16 registre i registervinduet til det andre registeret (og prosedyren), blir samme register omdefinert til å inneholde inngående variabler. Det samme gjentar seg i det tredje register-vinduet (og prosedyren).

I SPARC blir CWP dekrementert ved prosedyrekall. Prosedyren som foretar et kall legger parametrene i R8–R15, og disse blir R24–R31 i prosedyren som kalles opp. Ved prosedyrekall «glir» «vinduet» oppover istedenfor nedover.

Formatene på instruksjonene[rediger | rediger kilde]

SPARC Versjon 7 spesifiserer fem ulike formater på instruksjonene.

I det første tilfellet overføres innholdet fra et register til et annet. I det andre tilfellet overføres en konstant i størrelsesorden -4096 til +4096 til et register. Bit 13 skiller mellom disse to.

Format 2 bit 5 bit 6 bit 5 bit 1 bit 8 bit 5 bit
1 DEST OPCODE SRC 1 0 FP-OP SRC 2
2 DEST OPCODE SRC1 1 IMMEDIATE CONSTANT
Format 2 bit 1 bit 4 bit 3 bit 22 bit
3 A COND OP PC-RELATIVE DISPLACEMENT
4 DEST OP IMMEDIATE CONSTANT
5 PC-RELATIVE DISPLACEMENT

Instruksjonssettet[rediger | rediger kilde]

Instruksjon Forklaring
LDSB Hent byte (8 bit) med fortegn
LDSH Hent halvt ord (16 bit) med fortegn
LDUB Hent byte (8 bit) uten fortegn
LDUH Hent halvt ord (16 bit) uten fortegn
LD Hent ord (32 bit)
LDD Hent dobbelt ord (64 bit)
Instruksjon Forklaring
STB Lagre byte (8 bit)
STH Lagre halvt ord (16 bit)
ST Lagre ord (32 bit)
STD Lagre dobbelt ord (64 bit)
Instruksjon Forklaring
LDSTUB Hent og lagre byte (8 bit) uten fortegn
SWAP Swap ord (32 bit) i minnet med innhold i register
Instruksjon Forklaring
ADD Adder
ADDCC Adder, sett icc
ADDX Adder med mente
ADDXCC Adder med mente, sett icc
SUB Subtraher
SUBCC Subtraher, sett icc
SUBX Subtraher med mente
SUBXCC Subtraher med mente, sett icc
MULSCC Multipliser, sett icc
Instruksjon Forklaring
TADDCC
TSUBCC
TADDCCTV
TSUBCCTV
 
Instruksjon Forklaring
AND Boolsk AND
ANDCC Boolsk AND, sett icc
ANDN Boolsk NAND
ANDNCC Boolsk NAND, sett icc
OR Boolsk OR
ORCC Boolsk OR, sett icc
ORN Boolsk NOR
ORNCC Boolsk NOR, sett icc
XOR Boolsk XOR
XORCC Boolsk XOR, sett icc
XNOR Boolsk XNOR
XNORCC Boolsk XNOR, sett icc
Instruksjon Forklaring
SLL Logisk venstre-skift
SRL Logisk høyre-skift
SRA Aritmetisk høyre-skift
Instruksjon Forklaring
Bxx Betinget branch
Txx Betinget avbrudd
CALL Prosedyrekall
JMPL
SAVE Flytt registervindu fremover
RESTORE Flytt registervindu bakover
RETT Returner fra avbrudd
Instruksjon Forklaring
SETHI Sett de øverste 22 bit
UNIMP Ikke implementert (avbrudd)
RD Les et register
WR Skriv til et register
IFLUSH Tøm instruksjons-cache

Eksempel-algoritme: «Tårnene i Hanoi»[rediger | rediger kilde]

Utdypende artikkel: Tårnet i Hanoi

Det såkalte «Tårnet i Hanoi» er et yndet og populært eksempel på rekursjon innenfor programmering. Nedenfor er det vist en rekursiv løsning på dette puslespillet, skrevet i assembler-koden til SPARC. Eksempel-algoritmen viser bruken av registrene, som er forklart ovenfor.

 .proc 4                    ! start rutinen
 .globl _towers             ! definer "towers" som et globalt symbol
_towers: save %sp,-112%sp   ! flytt register-vinduet og stakkpeker
! if n = 1 then;            ! I0 = n, l1 = i, l2 = j
  cmp %IO,1                 ! hvis n = 1
  bne ELSE                  ! ellers gå til ELSE
! writeln("move", i, 'to', j);
     sethi %HI(AI), %00     ! 0o = de øverste 22 bit av adressen A1
     call .writestr         ! skriv ut teksten "Flytt"
     or %00,%L0(AI),%00     ! 00 = adressen til A1
     call .writenum         ! skriv ut i til skjerm
     mov %Il,%00            ! 0o = i
     sethi %HI(A2),%00      ! 0o = de øverste 22 bit til adressen A2
     call .writenum         ! skriv ut teksten 'til'
     or %00,%L0(A2),%00     ! 0o = adressen til A2
     call .writenum         ! skriv ut j til skjerm
     mov %12,%00            ! I0 = j
     call .writecr          ! Linjeskift
     nop                    ! Ingen utførelse
     b DONE                 ! hopp til rutinen DONE
     mov 0,%00              ! Returner 0 (OK)
 ! k = 6 - i - j;           ! Beregn k i det lokale registeret L0
 ELSE: mov 6,%LO            ! Lokalt register L0 = 6
       sub %L0,%Il,%LO      ! Lokalt register L0 = 6 - i
       sub %L0,%I2,%LO      ! Lokalt register L0 = 6 - i - j
 ! towers(n – 1, i, k);
       sub %I0,1,%00        ! parameter 0: 0o = n - 1
       mov %Il,%01          ! parameter 1: 01 = i
       call _towers,3       ! towers(n – 1, i, k)
       mov %L0,%02          ! parameter 2: 02 = k
 ! towers(l, i, j);
       mov 1,%00            ! parameter 0: 0o = 1
       mov %Il,%01          ! parameter 1: 01 = i
       call _towers,3       ! towers (l, i, j)
       mov %I2,%02          ! parameter 2: 02 = j
 ! towers(n – l, k, j)
       sub %I0, l, %00      ! parameter 0: 0o = n - 1
       mov %L0,%01          ! parameter 1: 01 = k
       call _towers,3       ! towers(n – 1, k, j)
       mov%I2, %02          ! parameter 2: 02 = j
       mov 0,%00            ! returnerer 0 (OK)
 DONE: ret                  ! avslutter algoritmen
       restore %g0,%00,%00  ! nullstiller register-vinduet
       .seg "data"          ! bruker data-segmentet
 A1:   .ascii "Flytt \0"    ! allokerer en tekst
 A2:   .ascii "til \0"      ! allokerer en tekst

Referanser[rediger | rediger kilde]

  1. ^ Le Quach og Richard Chueh: CMOS gate array implementation of SPARC, Compcon Spring apos;88, Thirty-Third IEEE Computer Society International Conference, Digest of Papers, 29. februar-3. mars 1988, side 14–17
  2. ^ a b Masood Namjoo: SPARC implementations: ASIC vs. custom design, System Sciences, 1989. Vol.I: Architecture Track, Proceedings of the Twenty-Second Annual Hawaii International Conference on System Sciences, Volume 1, Issue1, 3.-6. januar 1989 side 19–22
  3. ^ David. A. Patterson, Carlo. H. Sequin: RISC I: A Reduced Instruction Set VLSI Computer, Proc. 8th International Symposium on Computer Architecture, Association for Computing Machinery, side 443-457, 1981, 2. utgave, International Symposium on Computer Architecture archive, 25 years of the international symposia on Computer architecture, side 216–230, 1998, ISBN 1-58113-058-9
  4. ^ David A. Patterson og John L. Hennessy: Response to Computers, Complexity, and Controversy (pdf), IEEE Computer Magazine, vol. 18, side 142–143, november 1985