• No results found

Portning och utökning av processor för ASIC och FPGA

N/A
N/A
Protected

Academic year: 2021

Share "Portning och utökning av processor för ASIC och FPGA"

Copied!
121
0
0

Loading.... (view fulltext now)

Full text

(1)

Portning och ut¨

okning av processor

or ASIC och FPGA

Martin Olsson

LiTH-ISY-EX--09/4249--SE

(2)
(3)

or ASIC och FPGA

ISY, Link¨opings Universitet

Martin Olsson LiTH-ISY-EX--09/4249--SE

Examensarbete: 20 p Level: D

Supervisor: Anders Forslund,

Signal Processing Devices Sweden AB Examiner: Oscar Gustafsson,

ISY, Link¨opings Universitet Link¨oping, april 2009

(4)
(5)

Elektroniksystem, ISY 581 83 LINK ¨OPING SWEDEN april 2009 x x http://urn.kb.se/resolve?urn=urn:nbn:se:liu:diva-18250 LiTH-ISY-EX--09/4249--SE

Portning och ut¨okning av processor f¨or ASIC och FPGA Port and extension of processor for ASIC and FPGA

Martin Olsson

In this master thesis, the possibilities of customizing a low-cost micropro-cessor with the purpose of replacing an existing micropromicropro-cessor solution are investigated. A brief survey of suitable processors is carried out whe-rein a replacement is chosen. The replacement processor is then analyzed and extended with accelerators in order to match set requirements. The result is a port of the processor Lattice Mico32 for the FPGA circuit Xilinx Virtex-5 which replaces an earlier solution using Xilinx MicroBla-ze. To reach the set requirements, accelerators for floating point arith-metics and FIR filtering have been developed. The toolchain for the pro-cessor has been modified to support the addition of accelerated floating point arithmetics.

A final evaluation of the presented solution shows that it fulfills the set requirements and constitutes a functional replacement for the previous solution.

CPU, Mico32, FPU, FPGA, FIR, accelerators, GDB Nyckelord Keyword Sammanfattning Abstract F¨orfattare Author Titel Title

URL f¨or elektronisk version

Serietitel och serienummer Title of series, numbering

ISSN ISRN ISBN Spr˚ak Language Svenska/Swedish Engelska/English Rapporttyp Report category Licentiatavhandling Examensarbete C-uppsats D-uppsats ¨ Ovrig rapport

(6)
(7)

In this master thesis, the possibilities of customizing a low-cost micropro-cessor with the purpose of replacing an existing micropromicropro-cessor solution are investigated. A brief survey of suitable processors is carried out wherein a replacement is chosen. The replacement processor is then analyzed and ex-tended with accelerators in order to match set requirements.

The result is a port of the processor Lattice Mico32 for the FPGA circuit Xilinx Virtex-5 which replaces an earlier solution using Xilinx MicroBlaze. To reach the set requirements, accelerators for floating point arithmetics and FIR filtering have been developed. The toolchain for the processor has been modified to support the addition of accelerated floating point arithmetics.

A final evaluation of the presented solution shows that it fulfills the set requirements and constitutes a functional replacement for the previous solu-tion.

Keywords: CPU, Mico32, FPU, FPGA, FIR, accelerators, GDB

Sammanfattning

I det h¨ar examensarbetet unders¨oks m¨ojligheterna att anpassa en mikro-processor med l˚ag kostnad i syfte att ers¨atta en existerande mikroproces-sorl¨osning. En kort kartl¨aggning ¨over l¨ampliga processorer g¨ors, i vilken en ers¨attare v¨aljs ut. Ers¨attningsprocessorn analyseras sedan och kompletteras med acceleratorer f¨or att motsvara st¨allda krav.

Resultatet ¨ar en portning av processorn Lattice Mico32 till FPGA-kretsen Xilinx Virtex-5 som ers¨atter en tidigare l¨osning med Xilinx MicroBlaze. F¨or att n˚a upp till de krav som st¨allts upp har acceleratorer f¨or flyttalsaritmetik och FIR-filtrering utvecklats. Verktygskedjan f¨or processorn har modifierats f¨or att st¨odja den tillagda accelererade flyttalsaritmetiken.

En slutlig utv¨ardering av l¨osningen som presenteras visar att den uppfyller de krav som st¨allts upp och utg¨or en funktionell ers¨attning f¨or den tidigare l¨osningen.

(8)
(9)

Jag vill tacka min handledare Anders Forslund och alla andra p˚a SP Devices f¨or m¨ojligheten att f˚a genomf¨ora det h¨ar examensarbetet samt f¨or all hj¨alp och v¨agledning ni erbjudit under arbetet.

Tack ocks˚a till min opponent Victoria Dahl som grundligt g˚att igenom arbetet och kommit med m˚anga bra insikter och synpunkter.

(10)
(11)

ASIC Application Specific Integrated Circuit 1

BSD Berkley Software Distribution, BSD-liknande

licenser ¨ar ett samlingsnamn f¨or en typ av li-censer f¨or ¨oppen k¨allkod

8

DDD Data Display Debugger, ett grafiskt gr¨anssnitt f¨or debugverktyg

24

FIR Finite Impulse Response, en filtertyp med im-pulssvar av begr¨ansad l¨angd

2

Flyttalsaccelerator Se FPU 2

FPGA Field-Programmable Grid Array, en form av

programmerbar logik

1

FPU En accelerator f¨or hantering flyttal och

ber¨akning av flyttalsaritmetik

9

GAS GNU Assembler, en assemblator 41

GCC GNU Compiler Collection, en kompilator 7

GDB GNU Debugger, ett debugverktyg 24

GPIO General Purpose Input/Output, en enhet f¨or

digital I/O

63

GPL GNU General Public License, en licens f¨or

¨oppen k¨allkod

8

IDE Intergrated Development Environment,

verk-tyg f¨or mjukvaruutveckling

7 IP-block Kodmoduler som utg¨or immateriell egendom 7 JTAG En standard f¨or testportar f¨or integrerade

kretsar

20

(12)

LGPL GNU Lesser General Public License, en licens f¨or ¨oppen k¨allkod

8 LSB Least Significant Bit, biten med l¨agst

signifi-kans i ett dataord

30

MAC Multiply-Accumulate, en funktion d¨ar tv˚a tal multipliceras och produkten adderas till ett ackumulerat resultat, en MAC-enhet ¨ar en en-het som implementerar den funktionen

8

MMU Memory Management Unit, enhet f¨or

minnes-hantering

2

MSB Mico System Builder, konfigurationsverktyg

f¨or Mico32, alt. Most Significant Bit, biten med h¨ogst signifikans i ett dataord

24

OS Operativsystem 2

RISC Reduced Instruction Set Computer, en

de-signstrategi f¨or instruktionsarkitekturer

9

Slice LUT Ett logikblock i FPGA-kretsar best˚aende av ett visst antal LUT:ar och register, anv¨ands som ungef¨arligt m˚att p˚a fyllnadsgraden hos FPGA-kretsen

63

Strukturerad ASIC En kretstyp d¨ar programmerbara logikblock anv¨ands men routinglager tillverkas fixt

1

UART En standard f¨or seriell ¨overf¨oring av data 20 Verilog Ett spr˚ak f¨or h˚ardvarubeskrivande kod 9 Verktygskedja Den samling verktyg som beh¨ovs f¨or

mjukva-ruutveckling

8

(13)

1 Introduktion 1

1.1 Bakgrund och syfte . . . 1

1.2 Kravspecifikation . . . 2

1.3 Disposition . . . 3

I

Val och portning av processor

5

2 Processor 7 2.1 Existerande l¨osning . . . 7

2.2 Val av ny processor . . . 8

2.2.1 Licenser . . . 8

2.2.2 Urval . . . 8

2.3 Introduktion till Mico32 . . . 9

2.3.1 Registerarkitektur . . . 10

2.3.2 Undantagshantering . . . 10

2.3.3 Pipelinearkitektur . . . 12

2.3.4 Hopp och anrop . . . 15

2.3.5 Utvecklingsverktyg . . . 15 2.4 Portning . . . 17 2.4.1 Minnen . . . 18 2.4.2 Debugsystem . . . 20 2.4.3 Utvecklingsverktyg . . . 24

II

Utveckling av acceleratorer

27

3 Flyttalsacceleration 29 3.1 Flyttalsaritmetik . . . 29 3.1.1 Flyttal . . . 29 3.1.2 Flyttalsoperationer . . . 31 Olsson, 2009. xiii

(14)

3.2 Val av flyttalsenhet . . . 31

3.3 Minnesmappad flyttalsacceleration . . . 32

3.4 Instruktionsgr¨anssnitt . . . 37

3.5 Kompilatorst¨od . . . 40

3.6 Ny flyttalsaccelerator . . . 42

3.6.1 Bakgrund och begr¨ansningar . . . 42

3.6.2 Design . . . 43 3.6.3 Testning . . . 45 3.6.4 Resultat . . . 46 4 Filteracceleration 47 4.1 Specifikation . . . 47 4.2 Design . . . 49 4.2.1 Ber¨akning av FIR-filter . . . 49 4.2.2 Adressering . . . 51 4.3 Implementation . . . 54 4.3.1 Gr¨anssnitt . . . 57 4.3.2 Programmeringsgr¨anssnitt . . . 59 4.4 Testning . . . 61 4.5 Resultat . . . 61

5 Resultat och vidareutveckling 63 5.1 Resultat . . . 63 5.2 Vidareutveckling . . . 66 5.2.1 Mico32 . . . 66 5.2.2 Debugenhet . . . 67 5.2.3 Flyttalsacceleration . . . 67 5.2.4 Filteracceleration . . . 69 A Exjobbsf¨orslag 73 B RTL-schema MicoFPU 75 B.1 Pipelinesteg P0 . . . 76 B.2 Pipelinesteg P1 . . . 77 B.3 Pipelinesteg P2 . . . 78 B.4 Pipelinesteg P3 . . . 79 B.5 Specialtal, multiplikation . . . 80 B.6 Specialtal, addition/subtraktion . . . 81 B.7 Submoduler MicoFPU . . . 82 C Debugserver 83

(15)

Introduktion

I f¨orsta kapitlet presenteras bakgrunden och syftet till arbetet tillsammans med en genomg˚ang av rapportens inneh˚all.

1.1

Bakgrund och syfte

Den h¨ar rapporten dokumenterar ett examensarbete som har genomf¨orts av Martin Olsson som en del av utbildningen Civilingenj¨or i datateknik 180p vid Link¨opings Universitet. Arbetet utf¨ordes f¨or Signal Processing Devices Sweden AB i Link¨oping under 2008–2009.

SP Devices ¨ar ett f¨oretag baserat i Link¨oping som inriktar sig p˚a h¨ogprestrerande signalbehandlingssystem. Fokus ligger p˚a system f¨or multiplexad A/D-omvandling och efterbehandling av A/D-konverterad data. F¨oretagets produkter innefat-tar stora digitala system som byggs med hj¨alp av FPGA-teknik. Som en kom-ponent i SP Devices digitala system anv¨ands en integrerad mikroprocessor, Xilinx MicroBlaze.

Processorn MicroBlaze licensieras som en del av utvecklingsverktygen f¨or de FPGA-kretsar som anv¨ands. En av nackdelarna med MicroBlaze, tillika den st¨orsta anledningen att det h¨ar examensarbetet kom till ¨ar att proces-sorn enbart licensieras f¨or implementation i Xilinx FPGA:er. Den framtida utvecklingen av SP Devices system leder mot implementation i strukture-rad ASIC och ASIC. F¨or det beh¨ovs en ers¨attare till MicroBlaze som kan implementeras i valfri teknologi. I avsnitt 2.1 beskrivs MicroBlaze lite nog-grannare.

Syftet med det h¨ar arbetet har allts˚a varit att utv¨ardera potentiella ers¨attare till MicroBlaze, v¨alja ut en processor och anpassa den f¨or SP De-vices syften. Exjobbsf¨orslaget som l˚ag till grund f¨or arbetet finns ˚atergivet i

(16)

bilaga A.

1.2

Kravspecifikation

Eftersom den nya processorn ers¨atter en existerande l¨osning blir den tidigare l¨osningen en naturlig baslinje f¨or de krav som st¨alls p˚a den nya implementa-tionen. F¨oljande krav och begr¨ansningar sattes upp innan arbetet p˚ab¨orjades:

K1.1 Processorn ska ha en flyttalsaccelerator.

K1.2 Processorn ska ha en l˚ag eng˚angskostnad och ingen styckekost-nad.

K1.3 Processorn ska ha en minimal konfiguration f¨or inbyggt system. K1.4 Inget OS ska k¨oras p˚a processorn, den ska programmeras i ren C

och Assembler.

K1.5 Det ska g˚a att exekvera FIR-filter med en 16 bitars multiplikation och 48 bitars ackumulation per klockcykel. Detta beh¨over dock inte ske i processork¨arnan utan kan l¨osas m.h.a. delade minnen och en extern ber¨akningsenhet.

K1.6 Till processorn ska finnas en utvecklingsmilj¨o med C-kompilator, debugger och simulator.

K1.7 Processorn ska ha en debug-port med anslutning till standardde-bugger.

K1.8 Processorn ska inte ha en MMU.

K1.9 Processorn ska inte anv¨anda sig av cacheminne.

K1.10 Processorn ska kunna exekvera med en klockfrekvens p˚a minst 100 MHz i Xilinx FPGA.

Kraven ¨ar l¨ost definierade eftersom det initialt fanns en oklar bild ¨over urvalet av processorer och deras prestanda. Gemensamt f¨or alla krav ¨ar en str¨avan att beh˚alla den funktionalitet och prestanda som den nuvarande l¨osningen erbjuder.

(17)

1.3

Disposition

Rapporten ¨ar indelad i fem kapitel, d¨ar det f¨orsta kapitlet utg¨or en introduk-tion. Resten av rapporten utg¨ors av tv˚a ¨overgripande delar enligt nedan. Kapitel 1

I kapitel ett ges en introduktion till arbetets bakgrund och m˚alen med arbetet fastst¨alls.

DEL I

F¨orsta delen av arbetet utg¨ors av kapitel tv˚a och handlar om arbetet som gjorts med processorn.

Kapitel 2

I kapitel tv˚a ges en beskrivning av valet av processor. D¨arefter beskrivs funk-tionaliteten hos den valda processorn. Kapitlet avslutas med en beskrivning av vad som gjordes f¨or att anpassa processorn.

DEL II

Den andra delen av arbetet handlar om utvecklingen av acceleratorer f¨or den nya processorn, dels en flyttalsaccelerator och dels en filteraccelerator. Kapitel 3

I kapitel tre redog¨ors arbetet med acceleration av flyttalsaritmetik. F¨orst ges en kort introduktion till flyttalsformatet och flyttalsaritmetik. D¨arefter beskrivs hur processorn i steg kompletterades med en flyttalsaccelerator. Kapitel 4

I kapitel fyra ges f¨orst en kort bakgrund till teorin bakom FIR-filtrering, d¨arefter beskrivs hur en filteraccelerator designades och implementerades. Kapitel 5

I femte och sista kapitlet ges en sammanfattning av resultaten fr˚an arbe-tet med ˚aterkoppling till m˚alen ifr˚an kapitel ett. D¨arefter ges f¨orslag p˚a f¨orb¨attringar och vidareutveckling av olika delar i arbetet.

(18)
(19)

Val och portning av processor

(20)
(21)

Processor

I det h¨ar kapitlet ges en kort beskrivning av den processor som har ersatts. Vidare beskrivs hur valet av en ers¨attande processor gick till. En introduktion till den nya processorn ges tillsammans med en beskrivning av de ¨andringar och kompletteringar som har gjorts f¨or att anpassa den till systemet.

2.1

Existerande l¨

osning

F¨or Xilinx FPGA-kretsar finns en rad med licensierbara IP-block som kan anv¨andas f¨or att snabba upp utvecklingen. Till dessa h¨or processork¨arnan MicroBlaze tillsammans med en flyttalsaccelerator och en rad andra kring-enheter. F¨or utveckling med MicroBlaze finns en samling verktyg som un-derl¨attar konfigurering av processorn med kringenheter samt utveckling av mjukvara f¨or MicroBlaze. Verktygsupps¨attningen g˚ar under namnet Xilinx EDK och inneh˚aller bland annat kompilatorn GCC och ett grafiskt IDE. [5] Xilinx EDK inneh˚aller ett grafiskt gr¨anssnitt, Xilinx Platform Studio (XPS) f¨or att konfigurera processorns valbara delar samt tillg¨angliga kring-enheter. Med hj¨alp av XPS kan man definiera minnesstorlekar, adressutrym-men, klockfrekvens med mera f¨or ett processorsystem. [5]

MicroBlaze i sig ¨ar en 32-bitars processor av RISC-typ. Den har en femstegs pipeline och kan i den aktuella h˚ardvaran (Xilinx Virtex-5) klockas i upp till 200MHz. Processorn har utvecklats internt hos Xilinx och bygger p˚a en tidigare, enklare variant med trestegs pipeline som utvecklades 2001 (den h¨ar varianten finns fortfarande tillg¨anglig som ett utrymmessn˚alare al-ternativ). Debuggning av programkod i h˚ardvaran g˚ar att g¨ora ¨over JTAG med hj¨alp av GDB och verktyg i Xilinx EDK. MicroBlaze distribueras utan k¨allkod. [10]

Den flyttalsaccelerator som MicroBlaze anv¨ander sig av har en fyrastegs

(22)

pipeline och kan vid fullt utnyttjande utf¨ora en flyttalsber¨akning var fj¨arde klockcykel. Acceleratorn g˚ar att klocka i samma hastighet som processorn. [10]

2.2

Val av ny processor

2.2.1

Licenser

Krav K1.2 sl˚ar fast att l¨osningen som v¨aljs inte f˚ar ha n˚agon styckekost-nad och m˚aste ha en l˚ag eng˚angskostnad. En styckekostnad ¨ar en kostnad som l¨aggs p˚a varje producerad produkt. En eng˚angskostnad ¨ar en kostnad som l¨aggs t.ex. under utvecklingen men inte v¨axer med antalet producera-de produkter. Det h¨ar kravet leproducera-der till att i huvudsak l¨osningar som bygger p˚a ¨oppen k¨allkod har beaktats. Det finns ett antal varianter av licenser f¨or ¨oppen k¨allkod men gemensamt ¨ar att koden licensieras utan kostnad. ¨Oppen k¨allkod ¨ar ett v¨al etablerat f¨orfarande inom mjukvaruutveckling men licenser f¨or ¨oppen k¨allkod som ¨ar speciellt anpassade f¨or h˚ardvarubeskrivningar ¨ar ovanliga. [6] Under f¨orstudien till projektet konstaterades ocks˚a att m˚anga av de licenser som anv¨ands f¨or h˚ardvarubeskrivande ¨oppen k¨allkod ¨ar s˚adana som tidigare anv¨ants f¨or mjukvara, till exempel GPL eller LGPL.

F¨or k¨allkod som licensieras med GPL g¨aller att modifikationer av koden m˚aste vidaredistribueras under samma licens. [9] F¨or det h¨ar projektet ¨ar ett s˚adant villkor inte godtagbart eftersom integrering med IP som licensieras under andra villkor beh¨over kunna g¨oras i ett senare skede. Kod som enbart kan licensieras under GPL har d¨arf¨or valts bort. K¨allkod som licenseras under t.ex. LGPL eller BSD har inte s˚adana begr¨ansningar.

2.2.2

Urval

I f¨orstudien till projektet togs ett antal processorer i beaktning. Bland des-sa valdes visdes-sa bort direkt p˚a grund av olika faktorer s˚asom pris, prestanda och licenskrav. Bland de som valdes bort i f¨orstudien fanns bland andra Opensparc S1, LEON3, ZPU och AEMB. Utifr˚an f¨orstudien valdes tre pro-cessorer ut och presenterades i detalj f¨or handledaren och representanter fr˚an SP Devices. Processorerna beskrivs i korthet nedan.

• LEON2

En 32-bitars LGPL-licensierad RISC-arkitektur skriven i VHDL. Pro-cessorn ¨ar utvecklad av Gaisler Research Institute och har en femstegs

(23)

pipeline. Instruktionsups¨attningen implementerar SPARCv8. En 16x16-bitars MAC-instruktion med ett 40-16x16-bitars ackumulatorregister som ex-ekverar en operation per klockcykel finns. Till processorn finns en FPU som m˚aste licensieras separat. Ett verktygskedja baserat p˚a GCC finns tillg¨angligt, men f¨or att debugga programkod i processorn kr¨avs ett verktyg som licensieras separat till en extra kostnad. F¨or att konfigure-ra processorn och ansluta kringenheter finns ett gkonfigure-rafiskt hj¨alpverktyg. [11]

• Mico32

En 32-bitars RISC-arkitektur med en sexstegs pipeline skriven i Veri-log. Processorn ¨ar utvecklad av Lattice Semiconductor f¨or f¨oretagets egentillverkade FPGA-kretsar. Licensen som anv¨ands g˚ar under nam-net Lattice Open IP Core License och ¨ar speciellt utformad f¨or ¨oppen h˚ardvarubeskrivande k¨allkod. Instruktionsupps¨attningen saknar MAC-instruktion och FPU-MAC-instruktioner. En GCC-baserad toolchain och ut-vecklingsmilj¨o i Eclipse finns. I samma Eclipsemilj¨o finns ett verktyg f¨or att konfigurera processorn och ansluta kringenheter. Debuggning av programkod p˚a processorn ¨ar m¨ojligt, men bara p˚a Lattice h˚ardvara. [1]

• Openrisc 1200

En 32-bitars LGPL-licensierad RISC-arkitektur med en femstegs pi-peline skriven i Verilog. Processorn saknar FPU, men instruktions-upps¨attningen st¨odjer FPU-instruktioner. En 32x32-bitars MAC-instruktion med 48-bitars ackumulatorregister och en cykels exekveringstid finns. En toolchain baserad p˚a GCC finns till processorn. Debuggning av pro-gramkod p˚a processorn ¨ar m¨ojligt. Processorn konfigureras med hj¨alp av konfigurationsfiler i k¨allkoden. Kringenheter kan manuellt anslutas till processorns Wishbone-buss. [12]

Utifr˚an diskussioner kring kraven och de egenskaper som processorerna har valdes genom konsensus att projektet skulle g˚a vidare med en utveckling av Mico32.

2.3

Introduktion till Mico32

Mico32 best˚ar av en 32-bitars processork¨arna med ett egenutvecklat RISC-instruktionsset. Processorn har en registerfil med 32 register och tv˚a bussar enligt Wishboneprotokollet f¨or data respektive instruktioner. Minnesmappa-de WishbonebaseraMinnesmappa-de kringenheter kan anslutas till databussen. F¨orutom

(24)

da-tabussen kan kringenheter ocks˚a kommunicera med processorn via 32 exter-na interruptsigexter-naler. Processorn kan konfigureras med valbar minnesm¨angd samt med eller utan data- och instruktionscache. Debugm¨ojligheter f¨or pro-gram i processorn finns via debugport. Processorn kan ocks˚a via ett existe-rande gr¨anssnitt f¨orl¨angas med anv¨andardefinierade instruktioner som im-plementeras i extern logik. [1]

I f¨oljande avsnitt ges en mer ing˚aende beskrivning av de olika delarna i Mico32.

2.3.1

Registerarkitektur

Mico32 har 32 register varav R1-R29 ¨ar generella register1. Register R0 ¨ar reserverat och alltid satt till noll2. Register R29 (ra) anv¨ands av instruktio-nen call f¨or att lagra returadressen, register R30 (ea) anv¨ands f¨or att lagra programr¨aknaren n¨ar ett undantag sker och register R31 (ba) anv¨ands f¨or att lagra programr¨aknaren n¨ar ett breakpoint eller watchpoint utf¨ors. [1]

Ut¨over de generella registrena finns ¨aven ett antal Control and Status

Re-gisters (CSR) som kan l¨asas och skrivas med instruktionerna rcsr respektive wcsr. Tabell 2.1 visar alla ˚atkomliga CSR. EBA kan anv¨andas f¨or att peka om basadressen f¨or undantag fr˚an debugminnet till programminnet och p˚a s˚a s¨att utnyttja egna undantagshanterare. IE, IM och IP anv¨ands f¨or att hantera interrupts. ICC och DCC anv¨ands f¨or att t¨omma cacharna d˚a de ¨ar aktiverade. CC anv¨ands f¨or att r¨akna instruktionscykler om funktionen f¨or cykelr¨akning ¨ar aktiv. I CSR CFG finns processorns konfiguration lagrad s˚a att exekverande program kan utl¨asa vilka funktioner som konfigurerats in i processorn. [1]

2.3.2

Undantagshantering

Det finns ˚atta typer av undantag i Mico32. N¨ar ett undantag intr¨affar i Mico32 sker ett hopp till hanterande rutin. Beroende p˚a om undantaget ¨ar ett debugundantag eller ett normalt undantag sker hoppet relativt antingen basadressen DEBA eller EBA. Basadressen EBA f¨or normala undantag ¨ar st¨allbar via CSR. De v¨arden som EBA och DEBA antar efter reset st¨alls i konfigurationen av processorn. I tabell 2.2 finns samtliga undantag med respektive adresser listade. K¨allkoden till undantagshantering f¨or normala undantag˚aterfinns i filen crt0ram.S. Hantering av debugundantag behandlas mer ing˚aende i avsnitt 2.4.2. [1]

1

Vid C-programmering ¨ar ¨aven R26-R28 reserverade f¨or speciella funktioner.

2

Med vissa restriktioner kan ¨aven R0 anv¨andas som generellt register, s˚a g¨ors exem-pelvis i debugkoden i avsnitt 2.4.2.

(25)

Namn ˚Atkomst Beskrivning

IE R/W Interrupt enable

IM R/W Interrupt mask

IP R Interrupt pending

ICC W Instruction cache control

DCC W Data cache control

CC R Cycle counter

CFG R Configuration

EBA R/W Exception base address

Tabell 2.1: F¨orteckning ¨over CSR

Undantag Adress f¨or hanterare

Reset DEBA + 0

Breakpoint DEBA + 32

Instruction bus error EBA + 64

Watchpoint DEBA + 96

Data bus error EBA + 128

Divide by zero EBA + 160

Interrupt EBA + 192

System call EBA + 224

(26)

2.3.3

Pipelinearkitektur

Instruktionspipelinen i Mico32 har sex steg: Address (A), Fetch (F), Decode (D), Execute (X), Memory (M) och Write (W). I figur 2.1 visas en skiss ¨over pipelinen i Mico32 i f¨orh˚allande till minnen, register och kringenheter. En detaljerad beskrivning av funktionen hos stegen i pipelinen f¨oljer.

Pipelinesteg A

I steg A sker generering av n¨asta v¨arde f¨or programr¨aknaren. Ber¨akning av adressen till n¨asta instruktion sker i signalen pc a, som ¨ar ett 30-bitars adressregister. I figur 2.2 ˚ask˚adligg¨ors beslutsdiagrammet f¨or ber¨akning av pc a.

Om ett hopp sker i M-steget s¨atts adressen till branch target m. Sker ett hopp i X-steget s˚a s¨atts adressen ist¨allet till branch target x.

F¨or korta villkorliga hopp g¨ors en enkel f¨oruts¨agning om utg˚angen. I de

fall hopp f¨oruts¨ags sker det i D-steget och pc a tilldelas branch predict address d. Visar det sig i M-steget att en f¨oruts¨agning i D-steget var fel s˚a r¨attas det till genom att pc a tilldelas pc x.

En n¨armare beskrivning av systemet f¨or f¨oruts¨agning av hopp finns i 2.3.4. I normaltillst˚andet, allts˚a n¨ar inga hopp sker och pipelinen inte ¨ar stoppad, tilldelas pc a adressen ¨over den instruktionen som h¨amtades i f¨orra instruktionscykeln.

Initiellt efter ˚aterst¨allning av processorn tilldelas pc f v¨ardet av EBA mi-nus ett vilket medf¨or att pc a i n¨asta cykel kommer att anta v¨ardet av EBA (registret EBA beskrivs n¨armare i avsnitt 2.3.1).

Pipelinesteg F

I pipelinesteg F h¨amtas instruktionen fr˚an adress pc f i programminnet. Pipelinesteg D

I steg D avkodas instruktionsordet som h¨amtats fr˚an minnet. Instruktionsty-pen avg¨ors utifr˚an de sex mest signifikanta bitarna i instruktionsordet. F¨or varje avkodad instruktion genereras kontrollsignaler till instruktionsenheter-na i steg X. Vilka enheter som finns i processorn beror p˚a hur den konfigure-rats. Tillg¨angliga enheter ¨ar Load-Store (LSU), Adder (AU), Logic-Operation (LOU), Shifter (SU), Multiplier (MU) samt Division (DU). Efter operations-koden i instruktionsordet f¨oljer parametrar som beror p˚a instruktionstypen, tabell 2.3 visar bitf¨ordelningen i de instruktionsformat som processorn han-terar.

(27)
(28)

p c _ a p c _ x b r a n c h _ t a r g e t _ m b r a n c h _ t a r g e t _ x b r a n c h _ p r e d i c t _ a d d r e s s _ d p c _ f p c _ f + 1 b r a n c h _ m i s p r e d i c t _ t a k e n _ m & & ! e x c e p t i o n _ m b r a n c h _ t a k e n _ x b r a n c h _ p r e d i c t _ t a k e n _ d & & v a l i d _ d s t a l l _ f b r a n c h _ t a k e n _ m 1 0 1 0 1 0 1 0 1 0

Figur 2.2: Ber¨akning av n¨asta instruktionsadress, pc a

Register Immediate Format (RI)

Op.kod Reg. 0 Reg. 1 Immediatev¨arde

6 5 5 16

Register Register Format (RR)

Op.kod Reg. 0 Reg. 1 Reg. 2

-6 5 5 5 11

Control Register Format (CR)

Op.kod CSR Reg.

-6 5 5 16

Immediate Format (I)

Op.kod Immediatev¨arde

6 26

(29)

Pipelinesteg X och M

Utifr˚an avkodningen i steg D v¨aljs indata till instruktionen fr˚an registerfilen eller avkodat immediatev¨arde. I de fall som register bypass valts i steg D anv¨ands data direkt ifr˚an f¨oreg˚aende steg X eller M. I de fall instruktionen utnyttjar Wishbonebussen uppeh˚alls pipelinen tills ˚atkomsten genomf¨orts. Pipelinesteg W

Utifr˚an avkodningen i steg D v¨aljs utdataregister f¨or instruktionen och re-sultatet ifr˚an steg X eller steg M skrivs till registerfilen.

2.3.4

Hopp och anrop

Instruktionsupps¨attningen i Mico32 har funktionsanrop samt villkorliga och ovillkorliga hopp. F¨or villkorliga hopp relativt programr¨aknaren sker en enkel f¨oruts¨agning av utg˚angen: hopp med positiv offset f¨oruts¨ags inte tas och de med negativ offset f¨oruts¨ags tas. F¨oruts¨agningen sker i pipelinesteg D, felaktiga f¨oruts¨agningar korrigeras i steg M. I ¨ovriga fall tas villkorliga hopp i steg M. [1] Ovillkorliga hopp tas i steg X3.

2.3.5

Utvecklingsverktyg

Mico32 levereras tillsammans med en upps¨attning verktyg som inneh˚aller de delar som beh¨ovs b˚ade f¨or konfigurering av h˚ardvarusystem med Mico32 och kringkomponenter samt mjukvaruutveckling f¨or s˚adana system. Alla verktyg som anv¨ands sammanf¨ors i ett Eclipse-baserat grafiskt IDE.

Konstruktion av system med Mico32 och kringkomponenter sker i mjuk-varan MSB (Mico System Builder). MSB ¨ar ett grafiskt verktyg som k¨ors i samma Eclipsebaserade milj¨o som ¨ovriga utvecklingsvektyg. Figur 2.3 visar en sk¨armbild fr˚an programmet. I MSB kan man bygga ett system genom att ange parametrar f¨or systemet som helhet och sedan l¨agga till kompo-nenter som ansluts till processorns Wishbonebuss. I rutan uppe till v¨anster i sk¨armbilden (figur 2.3) finns en lista som inneh˚aller Mico32 samt andra kom-ponenter som finns tillg¨angliga att ansluta till processorn. F¨or varje kompo-nent finns ett antal parametrar som t.ex. basadress f¨or minnesmappningen.

Efter att ha definerat upp systemet i MSB s˚a genererar programmet dels de Verilogfiler som beh¨ovs f¨or att bygga systemet och dels st¨odfiler f¨or mjuk-varuutveckling till det genererade systemet.

3

(30)

Figur 2.3: Konfigurationsverktyget MSB

Verilogfilerna best˚ar av system conf.v som inneh˚aller definitioner av de parametrar man valt i MSB samt en toppniv˚afil f¨or systemet som ocks˚a inneh˚aller en arbitrerare f¨or de komponenter som anslutits till Wishbonebus-sen. De h¨ar filerna kopieras tillsammans med koden till de komponenter som ing˚ar i systemet till en valbar plats i filsystemet.

Eftersom processorn i det h¨ar projektet portats till en alternativ FPGA-krets och dessutom har ut¨okats med funktionalitet kr¨avdes mer ing˚aende kon-troll ¨over konfigurationen. Konfigurationen som skrivs ut till system conf.v och toppniv˚afilen har d¨arf¨or modifierats allt eftersom det beh¨ovts.

F¨or mjukvaruutvecklingen skapar MSB l¨ankscript anpassade till den min-neskonfiguration som specificerats. En headerfil system conf.h som inneh˚aller basadresser och andra parametrar f¨or de komponenter som ing˚ar i syste-met skapas. F¨or varje komponent som lagts till i systesyste-met kopieras ocks˚a tillh¨orande drivrutiner in i systemet. Tillsammans kan de h¨ar filerna sedan anv¨andas f¨or att kompilera C- och C++-kod f¨or systemet i utvecklingsmilj¨on. I utvecklingsmilj¨on finns ¨aven verktyg f¨or att debugga koden i en mjuk-varusimulator samt direkt p˚a processorn via JTAG. F¨or det sistn¨amnda al-ternativet kr¨avs att Lattices h˚ardvara anv¨ands.

Utvecklingsverktygen f¨or Mico32 utg¨ors till stor del av bepr¨ovade verktyg med ¨oppen k¨allkod. Den C-kompilator som anv¨ands i utvecklingsverktygen

(31)

Figur 2.4: Utvecklingsplattform f¨or projektet

¨ar GCC v3.4.4. F¨or delar av det h¨ar projektet har ocks˚a utvecklingsversionen GCC v4.4.0 anv¨ants med framg˚ang. F¨orutom GCC ¨ar de delar som anv¨ands f¨or programvaruutveckling: Binutils (assemblerare, l¨ankare, m.m), GDB (de-bugger, simulator) och Newlib (standardbibliotek f¨or C). F¨or de tre senare finns st¨od f¨or Mico32 f¨or senaste versionen i respektive projekts kodbas. Till GCC kr¨avs fortfarande en extern patch.

2.4

Portning

M˚alet med portningen av Mico32 har varit att g¨ora designen tillr¨ackligt allm¨an f¨or att kunna anv¨andas i ASIC eller strukturerad ASIC. Som ett steg p˚a v¨agen gjordes portningen f¨orst mot en existerande h˚ardvaruplattform ba-serad kring FPGA-kretsen Virtex-5, se figur 2.4. Resultatet av det h¨ar arbetet ¨ar allts˚a en l¨osning f¨or den h¨ar h˚ardvaruplattformen. Oundvikligen kommer vissa delar av portningen att bli specifika f¨or m˚alplattformen. Implementa-tionen har gjorts modul¨ar f¨or att s˚adana delar enkelt ska kunna bytas ut mot motsvarande delar f¨or en annan m˚alplattform. En av f¨ordelarna med att anv¨anda Virtex-5 som m˚al f¨or portningen ¨ar att det blir enklare att j¨amf¨ora den nya l¨osningen med den tidigare eftersom h˚ardvaran ¨ar densamma.

I avsnittet som f¨oljer redog¨ors f¨or de ¨andringar som gjorts i Mico32 i syfte att g¨ora processorn portabel enligt projektm˚alen.

(32)

2.4.1

Minnen

I konfigurationsprogrammet MSB l¨aggs program- och dataminne av valbar storlek till som komponenter p˚a processorns Wishbonebussar f¨or instruktio-ner respektive data. S˚a som systemets Wishbonest¨od ¨ar implementerat tar det fyra klockcykler att h¨amta ett dataord fr˚an ett minne p˚a Wishbonebus-sen. Det inneb¨ar att varje g˚ang F-steget h¨amtar ett instruktionsord stoppas pipelinen i tre cykler.

F¨or att snabba upp h¨amtningen av instruktionsord finns ett system med instruktions- och datacache implementerat i Mico32. Ett av ¨onskem˚alen f¨or projektet var att systemet inte skulle anv¨anda sig av cacheminne. De min-nen som finns tillg¨angliga f¨or implementatiomin-nen av Mico32 p˚a m˚alplattformen best˚ar av h˚art implementerade minnesblock i FPGA-kretsen. ˚Atkomsttiden f¨or s˚adana minnen ¨ar kort nog f¨or att processorn ska kunna h¨amta en in-struktion per cykel. Av den h¨ar anledningen finns det ingen anledning att ha ett cachesystem med flera niv˚aer. Samma resonemang g¨aller f¨or n¨asta m˚alplattform.

I Verilogkoden f¨or Mico32 finns ett system f¨or att koppla minne direkt till instruktionspipelinen utan att g˚a v¨agen ¨over Wishbonebussen. Gr¨anssnittet ¨ar en enklare variant av det gr¨anssnitt som anv¨ands f¨or cacheminne. M¨ojligheten att koppla minne direkt till instruktionspipelinen g˚ar inte att aktivera i MSB4 och ¨ar odokumenterad utanf¨or k¨allkoden till processorn.

Eftersom instruktionscache inte var aktuellt f¨or projektet och ett instruk-tionsminne p˚a Wishbonebussen medf¨or en prestandas¨ankning med en faktor fyra s˚a valdes ist¨allet varianten med minne direkt mot instruktionspipelinen. Eftersom funktionen inte st¨ods av Lattices system st¨aller en s˚adan modifika-tion f¨orst˚as krav p˚a f¨orsiktighet och ytterligare testning.

Processorn har en separat Wishbonebuss f¨or instruktionsminne och en f¨or dataminne. I systemet som MSB bygger kopplas d¨aremot alla minnen och kringenheter in p˚a samma buss. Det h¨ar ˚aterspeglas inte i konfigurations-verktyget MSB d¨ar anv¨andaren l¨att f˚ar intrycket av att bussarna ¨ar helt separata, se sk¨armbild 2.6. I dokumentationen s¨ags det dessutom att Mico32 ¨ar av Harvard-arkitektur, vilket inte st¨ammer med den Wishboneimplemen-tation som MSB genererar. D¨aremot st¨ammer det efter modifikationen av minnena. Figur 2.5 visar hur data- och instruktionsminnen ansluts i pipeli-nen efter modifikatiopipeli-nen.

Efter att ha inf¨ort separata instruktions- och dataminne g˚ar de C-program som kompilerats i Lattices utvecklingsmilj¨o inte l¨angre att exekvera. An-ledningen till detta ¨ar att l¨ankskripten lagrar hopptabeller f¨or

konstrukto-4

I MSB:s egna konfigurationsfiler finner man att st¨od f¨or funktionen ¨ar p˚ab¨orjad men utkommenterad.

(33)

R e g i s t e r f i l F e t c h D e c o d e I n s t r . -m i n n e D e b u g -m i n n e E x e c u t e M e m o r y W r i t e b a c k D a t a W B I n s t r . W B R e g i s t e r b y p a s s D a t a -m i n n e B y p a s s , m i n n e U a r t G P I O

Figur 2.5: Mico32:s pipeline efter modifikation av minneskonfigurationen.

(34)

rer5 och destruktorer i instruktionsminnet (kodexempel 2.1, rad 17-26) som nu l¨angre inte ¨ar l¨asbart. L¨ankskriptet genereras av ett perlskript i MSB, mdk msb subs.pm, som kan modifieras s˚a att det genererar l¨ankskript d¨ar hopptabellerna l¨aggs i dataminnet (kodexempel 2.2, rad 25-34). Med den modifikationen genererar l¨ankaren kod som g˚ar att exekvera ¨aven med den nya minneskonfigurationen.

2.4.2

Debugsystem

F¨or att underl¨atta debuggning vid mjukvaruutveckling mot Mico32 finns en portning av debugverktyget GDB tillg¨anglig. Debugverktyget kan antingen anv¨andas med en mjukvarusimulator eller kopplas mot processorn f¨or de-buggning i h˚ardvara. Debuggning mot Mico32 i h˚ardvara sker genom att ett debugundantag genereras i processorn. Den mjukvarurutin som hante-rar debugundantaget agehante-rar sedan server mot en GDB-klient som k¨ors p˚a anv¨andarens dator. Debugservern i Mico32 till˚ater sedan att minnesinneh˚all och registerinneh˚all unders¨oks och modifieras via GDB.

I den ursprungliga konfigurationen av Mico32 finns en implementation av hanterare f¨or debugundantag. Programkoden distribueras enbart i bin¨ar form och˚aterfinns som specifikation av inneh˚allet i debugminnet i lm32 monitor ram.v. Debugservern implementerar ett enkelt protokoll f¨or debuggning av kod p˚a processorn och kommunicerar via JTAG. Protokollet som anv¨ands ¨ar likt det som GDB anv¨ander f¨or debuggning ¨over serieport men inte kompatibelt. F¨or att kunna kommunicera med processorn kr¨avs d¨arf¨or att man anv¨ander ett program som ¨overs¨atter fr˚an Lattices protokoll till GDB:s protokoll. Ett s˚adant program ing˚ar i MSB men kan bara kommunicera med processorn via den JTAG-l¨osning som Lattice anv¨ander sig av.

I det h¨ar projektet har debugkommunikationen via JTAG ersatts av kom-munikation via UART. F¨or att ˚astadkomma det h¨ar har programkoden i debugminnet ersatts. Tv˚a m˚al st¨alldes upp f¨or den nya debugkoden. Min-nesutrymmet ska vara detsamma som f¨or den tidigare l¨osningen. GDB ska kunna anv¨andas direkt f¨or att debugga utan mellanliggande program.

Det ursprungliga debugminnet ¨ar 2048 bytes stort och rymmer d¨armed 512 32-bitars ord. Av dessa ¨ar 256 ord reserverade f¨or hantering av undan-tag. Vid debugundantag m˚aste en komplett kopia av processorns register- och CSR-tillst˚and skapas, till det reserveras 37 ord i debugminnet. Det l¨amnar 219 ord kvar f¨or programkod. Av dessa har tolv ord anv¨ants som stackut-rymme. Kvar blir 207 ord som kan anv¨andas fritt f¨or att implementera

kom-5

Hopptabellen f¨or konstruktorer inneh˚aller ett antal funktionspekare som anropas i ordning f¨ore main() i C-program.

(35)

1 . boot : { ∗ ( . boot ) } > irom 2 . t e x t : 3 { 4 . = ALIGN ( 4 ) ; 5 f t e x t = . ; 6 ∗ ( . t e x t . stub . t e x t . ∗ . gnu . l i n k o n c e . t . ∗ ) 7 ∗ ( . gnu . warning ) 8 KEEP ( ∗ ( . i n i t ) ) 9 KEEP ( ∗ ( . f i n i ) ) 10 11 12 /∗ E xcep t ion h a n d l e r s ∗/ 13 ∗ ( . e h f r a m e h d r ) 14 KEEP ( ∗ ( . e h f r a m e ) ) 15 ∗ ( . g c c e x c e p t t a b l e ) 16 17 /∗ C o n s t r u c t o r s and d e s t r u c t o r s ∗/ 18 KEEP (∗ c r t b e g i n ∗ . o ( . c t o r s ) )

19 KEEP ( ∗ (EXCLUDE FILE (∗ c r t e n d ∗ . o ) . c t o r s ) ) 20 KEEP ( ∗ (SORT( . c t o r s . ∗ ) ) )

21 KEEP ( ∗ ( . c t o r s ) )

22 KEEP (∗ c r t b e g i n ∗ . o ( . d t o r s ) )

23 KEEP ( ∗ (EXCLUDE FILE (∗ c r t e n d ∗ . o ) . d t o r s ) ) 24 KEEP ( ∗ (SORT( . d t o r s . ∗ ) ) ) 25 KEEP ( ∗ ( . d t o r s ) ) 26 KEEP ( ∗ ( . j c r ) ) 27 e t e x t = . ; 28 } > irom =0 29 30 /∗ read−o n l y data ∗/ 31 . r o d a t a : 32 { 33 . = ALIGN ( 4 ) ; 34 f r o d a t a = . ; 35 f r o d a t a r o m = LOADADDR( . r o d a t a ) ; 36 ∗ ( . r o d a t a . r o d a t a . ∗ . gnu . l i n k o n c e . r . ∗ ) 37 ∗ ( . r o d a t a 1 ) 38 e r o d a t a = . ; 39 } > dram 40 } 41 }

(36)

1 . boot : { ∗ ( . boot ) } > irom 2 . t e x t : 3 { 4 . = ALIGN ( 4 ) ; 5 f t e x t = . ; 6 ∗ ( . t e x t . stub . t e x t . ∗ . gnu . l i n k o n c e . t . ∗ ) 7 ∗ ( . gnu . warning ) 8 KEEP ( ∗ ( . i n i t ) ) 9 KEEP ( ∗ ( . f i n i ) ) 10 11 12 /∗ E xcep t ion h a n d l e r s ∗/ 13 ∗ ( . e h f r a m e h d r ) 14 KEEP ( ∗ ( . e h f r a m e ) ) 15 ∗ ( . g c c e x c e p t t a b l e ) 16 17 18 e t e x t = . ; 19 } > irom =0 20 21 /∗ read−o n l y data ∗/ 22 . r o d a t a : 23 { 24 . = ALIGN ( 4 ) ; 25 /∗ C o n s t r u c t o r s and d e s t r u c t o r s ∗/ 26 KEEP (∗ c r t b e g i n ∗ . o ( . c t o r s ) )

27 KEEP ( ∗ (EXCLUDE FILE (∗ c r t e n d ∗ . o ) . c t o r s ) ) 28 KEEP ( ∗ (SORT( . c t o r s . ∗ ) ) )

29 KEEP ( ∗ ( . c t o r s ) )

30 KEEP (∗ c r t b e g i n ∗ . o ( . d t o r s ) )

31 KEEP ( ∗ (EXCLUDE FILE (∗ c r t e n d ∗ . o ) . d t o r s ) ) 32 KEEP ( ∗ (SORT( . d t o r s . ∗ ) ) ) 33 KEEP ( ∗ ( . d t o r s ) ) 34 KEEP ( ∗ ( . j c r ) ) 35 36 f r o d a t a = . ; 37 f r o d a t a r o m = LOADADDR( . r o d a t a ) ; 38 ∗ ( . r o d a t a . r o d a t a . ∗ . gnu . l i n k o n c e . r . ∗ ) 39 ∗ ( . r o d a t a 1 ) 40 e r o d a t a = . ; 41 } > dram 42 }

(37)

Kommando Funktion

g L¨as fr˚an register

G Skriv till register

m L¨as fr˚an minnesposition

M Skriv till minnesposition

c ˚Ateruppta programk¨orning

s Stega fram en instruktion

? L¨as senaste signal

Tabell 2.4: Implementerat subset av GDB:s remote serial protocol munikationsprotokollet mot GDB.

Protokollet f¨or debuggning ¨over serieport med hj¨alp av GDB specifice-ras i GDB:s manual. [15] I protokollet definespecifice-ras ett kommandoformat och en rad kommandon till debugservern samt hur de ska besvaras. En full im-plementation av hela protokollet i den minnesm¨angd som finns tillg¨anglig ¨ar inte m¨ojlig, d¨arf¨or har bara den delm¨angd av protokollet som kr¨avs f¨or full funktionalitet implementerats.

F¨or de kommandon som inte implementerats svarar debugservern enligt specifikation med ett tomt meddelande. Genom att prova sig fram avg¨or kli-enten vilka kommandon som st¨ods av servern och sluter sig till ett gemensamt subset av protokollet som st¨ods av b˚ada ¨andpunkter. Enligt [15] m˚aste kom-mandona g, G, m, M, c och s implementeras. Ut¨over de h¨ar komkom-mandona har ¨aven kommandot ? implementerats6. I tabell 2.4 beskrivs funktionen f¨or respektive kommando.

N˚agot som komplicerar debugfunktionaliteten ¨ar att klienten under en debugsession kan ge kommandon som f¨ors¨oker komma ˚at programminnet. I sj¨alva verket ¨ar det ett vanligt beteende fr˚an GDB-klienten. Ger anv¨andaren exempelvis ett kommando f¨or att disassemblera nuvarande frame s˚a kommer klienten att f¨ors¨oka l¨asa in programdata fr˚an servern och sedan disassem-blera denna. Det sker ¨aven om en lokal bin¨ar specificerats som referensdata. Likas˚a implementeras breakpoints genom att injicera en break-instruktion i programminnet och spara undan den instruktion som lagrades d¨ar innan.

En ˚atkomst till programminnet fr˚an debugservern kommer att generera ett nytt debugundantag med debugminnet som k¨alla och i samband med det skriva ¨over registertillst˚anden fr˚an den ursprungliga k¨allan.

Ett s¨att att hantera problemet skulle vara att i debugservern f¨ore varje minnes˚atkomst kontrollera om minnesadressen ¨ar giltig. En s˚adan kontroll

6

I den version av GDB (v6.5) som anv¨andes gick det inte att koppla upp mot debug-servern om den inte svarade p˚a kommandot ?.

(38)

skulle kr¨ava information om vilka adresser som ¨ar l¨asbara, n˚agot som skiljer sig mellan olika konfigurationer av processorn. Ett annat alternativ skulle vara att modifiera GDB s˚a att inga f¨ors¨ok att komma ˚at programminnet g¨ors.

Ist¨allet f¨or att f¨ors¨oka arbeta runt de h¨ar problemen i GDB eller debug-servern implementerades en Wishbonebrygga mot programminnet. Bryggan till˚ater processorn att skriva och l¨asa mot programminnet vid exekvering av programkod fr˚an debugminnet.

Resultatet fr˚an implementationen ¨ar en fullt fungerande debugserver som kan anv¨andas direkt fr˚an GDB via serieporten p˚a h˚ardvaran. Programkoden f¨or debugservern finns ˚atergiven i bilaga C. Precis som tidigare kan debug-funktionaliteten i processorn v¨aljas bort vid konfigurering f¨or att spara re-surser.

2.4.3

Utvecklingsverktyg

De f¨or¨andringar som gjorts i minneskonfigurationen och debugfunktionalite-ten f¨or med sig vissa problem n¨ar det kommer till utvecklingsverktygen. Verk-tygen ¨ar skrivna som insticksapplikationer till systemet Eclipse. Eftersom k¨allkoden till insticksapplikationerna inte distribueras med utvecklingsverk-tygen g˚ar det inte att anpassa alla delar av dem i takt med att ¨andringar g¨ors i Mico32.

MSB till˚ater bara att minnen ansluts via Wishbonebussarna. Efter modifi-kationen av minneskonfigurationen ¨ar det d¨arf¨or inte l¨angre m¨ojligt att ¨andra minnesstorlekar i MSB. Tillv¨agag˚angss¨attet f¨or att generera system med pro-cessorn fr˚an MSB har ist¨allet varit att skapa en konfiguration helt utan min-nen och sedan justera minnestorleken i den genererade Verilog-koden. Till det ¨ar det n¨odv¨andigt att definera ett nytt identiskt system i MSB med mot-svarande minnen anslutna till Wishbonebussen. Konfigurationsfilerna fr˚an systemdefinitionen kan sedan anv¨andas i mjukvaruutvecklingsverktygen.

F¨or¨andringen av debugporten medf¨or att det grafiska debugverktyg som Lattice distribuerar inte l¨angre g˚ar att anv¨anda. Anledningen ¨ar att gr¨anssnittet mot GDB ¨ar fast inst¨allt f¨or att kopplas upp mot den JTAG-l¨osning som anv¨ands. Den kommandoradsversion av GDB som distribueras med verk-tygskedjan g˚ar d¨aremot att anv¨anda. Vidare har debugfunktionaliteten ocks˚a med framg˚ang testats med version 6.8 av GDB tillsammans med det grafiska gr¨anssnittet DDD.

I en aspekt har integrationen av nya funktioner i utvecklingsverktygen givit b¨attre resultat. MSB till˚ater att nya Wishbonebaserade komponenter l¨aggs till i systemet genom att gr¨anssnitt, drivrutiner och dokumentation placeras i en speciell katalogstruktur och specificeras i en XML-fil. P˚a s˚a

(39)

s¨att kan egenutvecklade kringenheter presenteras p˚a ett enhetligt s¨att till-sammans med de som levereras av Lattice i MSB. Det inneb¨ar ocks˚a att egenutvecklade enheter enkelt kan l¨aggas till och tas bort fr˚an ett system i verktyget. F¨or de Wishbone-enheter som utvecklats under arbetets g˚ang har motsvarande MSB-komponenter skapats.

Som ett alternativ till de utvecklingsverktyg som distribueras av Lattice har en egenkompilerad verktygskedja best˚aende av Binutils, Newlib, GCC och GDB satts samman. Den motsvarar verktygskedjan som distribueras, men anv¨ander nyare versioner av respektive programvara. F¨or verktygskedjan har Make-filer och l¨ankscript skrivits s˚a att mjukvara kan kompileras utan behov av de program som Lattice distribuerar. Genom att anv¨anda sig av den h¨ar verktygskedjan i kombination med en egen toppniv˚amodul f¨or Mico32 ¨ar det m¨ojligt att utveckla system och programvara helt utan de distribuerade verktygen.

(40)
(41)

Utveckling av acceleratorer

(42)
(43)

Flyttalsacceleration

I det h¨ar kapitlet beskrivs hur processorn har kompletterats med en flyttalsac-celerator. En kort introduktion till flyttalsaritmetik ges, d¨arefter beskrivs hur en befintlig flyttalsenhet integrerats med processorn. Slutligen beskrivs hur en ny flyttalsenhet utvecklats och integrerats med processorn och verktygskedjan.

3.1

Flyttalsaritmetik

3.1.1

Flyttal

Flyttal ¨ar ett s¨att att med en begr¨ansad bitl¨angd kombinera ett stort dyna-miskt omr˚ade och en h¨og precision. Ledande standard f¨or flyttal definieras av

IEEE 754, med IEEE 754-2008 som senaste utg˚ava. [3] Flyttal enligt IEEE

754 ¨ar av sign-magnitude-format och delas in i tre delar.

Teckenbit Exponent Signifikand

Teckenbiten S avg¨or talets tecken, d¨ar en etta inneb¨ar ett negativt tal. Talets magnitud best¨ams av exponenten, E och signifikanden, F . Exponenten lagras i ett viktat format s˚a att t.ex. en sjubitars exponent kan anta ett v¨arde fr˚an 2−62till 263. Sammantaget inneb¨ar det ¨ar att ett tal med en exponentvikt p˚a -62 har ett v¨arde motsvarande uttrycket i 3.1. [3]

(−1)S

· F · 2E−62 (3.1)

Beroende p˚a vilka krav som finns p˚a precision och dynamiskt omr˚ade v¨aljs olika bredd p˚a E och F , nedan listas de precisioner som definieras av IEEE 754-standarden. [3]

(44)

1 8 23

Enkel precision, 32 bitar 1 ≥11 ≥31

Ut¨okad enkel precision, ≥43 bitar 1 11 52

Dubbel precision, 64 bitar 1 ≥15 ≥63

Ut¨okad dubbel precision, ≥79 bitar

Specifikationen f¨or flyttalsaccelereringen i det h¨ar arbetet begr¨ansar sig till enkel precision. Vidare ¨ar det underf¨orst˚att att flyttal av enkel precision enligt IEEE 754-standarden avses n¨ar flyttal n¨amns.

Signifikanden lagras p˚a normaliserad form vilket inneb¨ar att exponenten justeras s˚a att den mest signifikanta ettan i signifikanden alltid placeras i den mest signifikanta biten. Eftersom denna bit d˚a alltid ¨ar nollskild lagras den inte utan tolkas implicit till ett. [3]

Subnormala tal

F¨or att kunna hantera tal mellan noll och det minsta representerbara norma-liserade talet finns en alternativ representation, s˚a kallade subnormala1 tal. N¨ar subnormala tal representeras s¨atts exponenten till noll. Signifikanden ska d˚a tolkas som om mest signifikanta biten ¨ar noll och exponenten ska tolkas p˚a samma s¨att som om den vore satt till ett. [3]

Specialtal

Standarden definierar ¨aven ett antal tal med speciell funktion. Inf som repre-senterar ett o¨andligt tal har bitarna i exponenten satta till ett och bitarna i signifikanden till satta noll. NaN som ¨ar resultatet av en operation som inte g˚ar att utf¨ora, t.ex. division med noll. NaN finns i tv˚a varianter, om h¨ogsta biten i signifikanden ¨ar satt s˚a ¨ar talet ett signalling NaN (sNaN) och ska ge ett undantag, om den inte ¨ar satt ¨ar talet ett quiet NaN (qNaN) och ska pro-pagera genom operationer utan att ge ett undantag. Hantering av undantag vid flyttalsber¨akningar ligger utanf¨or omr˚adet i det h¨ar arbetet s˚a qNaN och

sNaN kommer vidare behandlas som ekvivalenta. Specialtalen, liksom talet

noll finns i b˚ade positiv och negativ variant. [3]

1

(45)

Avrundningsalgoritmer

IEEE 754-2008 definerar fem olika typer av avrundningar f¨or flyttalsarit-metik. Tre av dessa ¨ar s˚a kallade riktade avrundningar och avrundar mot +∞, −∞ respektive noll. De andra tv˚a avrundar mot n¨armsta representer-bara flyttal med skillnaden att den ena avrundar mot talet med en nolla i LSB om avst˚andet ¨ar lika l˚angt och den andra avrundningen mot talet med en etta i LSB. [3]

3.1.2

Flyttalsoperationer

Acceleratorn ska hantera addition, subtraktion och multiplikation. F¨or att utf¨ora aritmetiska operationer p˚a flyttal m˚aste talen f¨orst delas upp i tecken-bit, exponent och signifikand. D¨arefter kan ber¨akningar, utf¨orda p˚a varje del separat, sammanst¨allas i ett resulterande flyttal. En f¨orteckning ¨over vilka ber¨akningar som beh¨over g¨oras f¨or att utf¨ora flyttalsoperationerna finns i avsnitt 3.6.2.

3.2

Val av flyttalsenhet

F¨or acceleration av flyttalsber¨akningar p˚a Mico32 togs f¨oljande flyttalsenhe-ter i beaktning.

• “FPU100” Implementation av en enkelprecisions pipelinad FPU i VHDL enligt IEEE 754. Licensieras under BSD-liknande licens. Ex-ekverar addition/subtraktion p˚a sju klockcykler, multiplikation p˚a tolv klockcykler. [16]

• “Floating Point Unit” Implementation av en enkelprecisions pipe-linad FPU i Verilog enligt IEEE 754. Licensieras under BSD-liknande licens. Alla operationer exekverar p˚a fyra klockcykler. [17]

Ut¨over de h¨ar tv˚a s˚a togs ¨aven flyttalsenheten fr˚an ett projekt vid namn

Opensparc i beaktning, men valdes bort eftersom licensen g¨or att den inte

kan integreras i ett system med f¨or¨ovrigt st¨angd k¨allkod.

F¨or att f˚a en uppfattning om hur mycket resurser varje enhet tar i an-spr˚ak samt i vilken hastighet den g˚ar att klocka implementerades varje enhet p˚a m˚alplattformen. Eftersom kravet p˚a flyttalsenheten ¨ar att den ska kunna utf¨ora addition, subtraktion och multiplikation togs funktionalitet f¨or divi-sion bort innan syntiseringen. I tabell 3.2 redovisas resultatet av implemen-tationen.

(46)

Enhet Slice LUTs Maxfrekvens

FPU100 6399 45MHz

Floating Point Unit 2238 37MHz

Tabell 3.1: Initiell syntisering av flyttalsenheter.

Utifr˚an de h¨ar resultaten valdes till att b¨orja med “Floating Point Unit” p˚a grund av att den tar mindre resurser i anspr˚ak och har en h¨ogre prestan-da. Eftersom gr¨anssnitten till respektive flyttalsenhet ¨ar snarlika designades gr¨anssnittet mellan processorn och flyttalsenheten allm¨ant nog f¨or att enkelt kunna byta mellan flyttalsenheterna i ett senare skede.

3.3

Minnesmappad flyttalsacceleration

F¨or att kunna utnyttja flyttalsfunktionerna i flyttalsenheten fr˚an program som k¨ors p˚a processorn beh¨ovs n˚agot s¨att att flytta data fr˚an processorns pipeline till flyttalsenheten och tillbaks. Ett enkelt s¨att att ˚astadkomma det h¨ar ¨ar att skapa en slavenhet p˚a Wishbonebussen som kan flytta data mellan bussen och flyttalsenheten. P˚a s˚a vis kan man komma ˚at flyttalsfunktionerna genom att skriva och l¨asa till och fr˚an speciella positioner i processorns min-nesrymd. Varje ing˚ang p˚a flyttalsenheten representeras av en adress i minnet till vilken program kan skriva v¨arden. P˚a samma s¨att representeras utg˚angen fr˚an flyttalsenheten av en minnesposition d¨ar program kan l¨asa ut resultatet av en flyttalsber¨akning.

I figur 3.1 visas ett diagram ¨over hur tillst˚andsmaskinen f¨or Wishbone-interfacet fungerar. Eftersom den aktuella flyttalsenheten inte gick att klocka h¨ogre ¨an ungef¨ar en tredjedel av den klockhastighet som processorn klockats med s˚a ¨agnas en del av kontrollogiken ˚at en handskakningsmekanism.

Skrivningar till de register som driver ing˚angarna p˚a flyttalsenheten be-kr¨aftas i samma klockcykel som f¨orfr˚agningen g¨ors. L¨asningar fr˚an utg˚angen p˚a flyttalsenheten f¨ordr¨ojs tills den senaste skrivningen g˚att genom pipeli-nen. En utl¨asning av resultatet fr˚an flyttalsenheten kan allts˚a ta upp till tolv klockcykler.

I kodexempel 3.1 demonstreras med assemblerkod hur man anv¨ander flyt-talsenheten i den minnesmappade modellen. Kodexempel 3.2 visar C-kod som motsvarar assemblerkoden i exempel 3.1. Anropsmetoden i exemplet ¨ar om-st¨andig och tar fokus fr˚an uppgiften som programmet utf¨or. Ist¨allet ¨ar det ¨onskv¨art att kunna g¨ora flyttalsber¨akningar med hj¨alp av de inbyggda flyt-talstyper som finns i C. Exempel 3.3 motsvarar programkoden i kodexempel 3.2, men nu med C:s inbyggda flyttalstyper.

(47)

I N I T P I P E L I N E 1 P I P E L I N E 2 P I P E L I N E 3 R E A D Y C o u n t e r r e s e t r e q / C o u n t e r r e s e t a c k K l o c k d o m ä n , F P U K l o c k d o m ä n , C P U W A I T W R I T E R E A D W B w r i t e r e q / C o u n t e r r e s e t r e q , R e g i s t e r w r i t e , W B a c k W B r e a d r e q & F P U i n s t a t e R E A D Y / W B d a t a o u t , W B a c k C o u n t e r r e s e t r e q , C o u n t e r r e s e t a c k , F P U s t a t e

Figur 3.1: FSM f¨or kontroll av flyttalsenhet p˚a Wishbonebussen.

1 mvhi r1 , 0 x8000 2 o r i r1 , r1 , 0 x0100 3 sw ( r 1 +12) , r 0 4 sw ( r 1 +16) , r 3 5 sw ( r 1 +20) , r 4 6 lw r2 , ( r 1 +0)

(48)

1 f l o a t a , b , c ;

2 unsigned int ∗ fpu = ∗(0 x80000100 ) ; 3

4 /∗ . . . ∗/ 5

6 fpu [ 3 ] = 0 ;

7 fpu [ 4 ] = ∗ ( ( unsigned int ∗) &a ) ; 8 fpu [ 5 ] = ∗ ( ( unsigned int ∗) &b ) ; 9 c = ∗ ( ( f l o a t ∗) fpu [ 0 ] ) ;

Kodexempel 3.2: C-kod f¨or flyttalsoperation utan C-spr˚akets inbyggda typer. 1 f l o a t a , b , c ;

2

3 /∗ . . . ∗/ 4

5 c = a + b ;

Kodexempel 3.3: C-kod f¨or flyttalsoperation med hj¨alp av C-spr˚akets inbygg-da typer.

F¨or att kunna anv¨anda flyttalstyperna i C beh¨over kompilatorn instrueras att ¨overs¨atta ber¨akningar med flyttalstyper till assemblerkod motsvarande den i de tidigare exemplen. P˚a samma s¨att fungerar hantering av flyttals-ber¨akningar d˚a processorn inte har n˚agon flyttalsaccelerator. N¨ar kompila-torn exempelvis st¨oter p˚a uttrycket c = a + b i exempel 3.3 ers¨atts det med programkod motsvarande c = addsf(a, b);. Funktionen addsf implemen-terar en addition mellan tv˚a flyttal med enkel precision i mjukvara. Mot-svarande anrop finns f¨or andra kombinationer av operationer och operand-precisioner. I den version av GCC som anv¨ands f¨or Mico32 implementeras funktionerna f¨or flyttalsber¨akningar i ett bibliotek vid namn SoftFloat.

En enkel metod f¨or att ¨overs¨atta flyttalsber¨akningar med inbyggda flyt-talstyper till ber¨akningar i den minnesmappade flyttalsacceleratorn ¨ar att bara ers¨atta anropen till SoftFloats rutiner med anrop till rutiner liknan-de exempel 3.2. F¨or att slippa modifiera GCC eller SoftFloat g¨ors liknan-detta genom att deklarera om de ber¨orda funktionerna vid kompileringstillf¨allet. Omdeklareringen gjordes genom att inf¨ora nya funktioner med samma an-ropssignatur2 som de hos SoftFloat. F¨or att de nya funktionerna ska ers¨atta

2

Samma anropssignatur inneb¨ar att den nya funktionen har samma namn, samma antal anropsparametrar och samma typer p˚a alla anrops- och returparametrar som den tidigare

(49)

SoftFloats rutiner finns tv˚a kriterier vid kompileringen. Dels m˚aste v¨axeln --allow-multiple-definitionges till kompilatorn, dels m˚aste de nya funk-tionerna l¨ankas in f¨ore funkfunk-tionerna i SoftFloat.

I kodexempel 3.5 visas de funktioner som anv¨ands f¨or att ers¨atta Soft-Floats rutiner med accelererade varianter. N¨ar C-kod som anv¨ander pro-gramspr˚akets inbyggda flyttalstyper l¨ankas tillsammans med de h¨ar funk-tionerna blir resultatet att ber¨akningarna utf¨ors av flyttalsenheten ist¨allet f¨or att ber¨aknas i mjukvara. I kodexempel 3.4 har resulterande objektkod fr˚an kompileringen av exempel 3.3 disassemblerats. Den ber¨akning med flyt-tal som gjordes har h¨ar ersatts med ett anrop till funktionen addsf3. I listningen syns ocks˚a funktionen som ers¨atter den tidigare mjukvaruflyttals-ber¨akningen.

En analys av kodexempel 3.4 visar nackdelar med metoden. Vid flyt-talsber¨akningar enligt den h¨ar modellen sker alltid ett funktionsanrop. F¨or normala funktionsanrop i C kan man med hj¨alp av attributet inline f˚a ope-rationerna i funktionen att kopieras in p˚a funktionsanropets plats ist¨allet f¨or att ett anrop utf¨ors. P˚a s˚a s¨att kan operationen utf¨oras utan det overhead som funktionsanropet utg¨or. Eftersom de ursprungliga flyttalsfunktionerna i Soft-Float inte ¨ar deklarerade med det h¨ar attributet g˚ar det inte att ˚astadkomma utan att modifiera verktygskedjan.

Fr˚an exemplet 3.4 framg˚ar att f¨or varje flyttalsoperation m˚aste ˚atta in-struktioner utf¨oras. I tabell 3.2 redovisas tids˚atg˚angen f¨or varje instruktion. Speciellt intressant f¨or den h¨ar rutinen ¨ar tids˚atg˚angen f¨or minnes˚atkomsterna. I figur 3.1 kan man se att bekr¨aftelsen f¨or en skrivning ges p˚a b˚agen mellan WAIT och WRITE direkt vid skrivf¨orfr˚agningen. Bekr¨aftelsen f¨or l¨asning p˚a b˚agen mellan WAIT och READ ges d¨aremot inte f¨orr¨an flyttalsaccelera-torn st˚ar i l¨age READY eftersom resultatet fr˚an ber¨akningen m˚aste v¨antas in. Som mest tar det tolv cykler fr˚an det att sista skrivningen till ett av flyttalsacceleratorns register gjorts. Eftersom instruktionen f¨or utl¨asning av resultatet sker direkt efter sista skrivningen f¨ordr¨ojs den tolv cykler. Det g¨or att den totala tids˚atg˚angen f¨or en flyttalsoperation ¨ar 20 cykler, varav tolv ¨agnas ˚at sj¨alva flyttalsber¨akningen i flyttalsenheten. Det motsvarar en overhead p˚a ungef¨ar 67%.

Viss del av denna overhead kommer fr˚an integrationen med flyttalstyper-na i C. F¨or att unders¨oka om det ¨ar l¨ont att g¨ora om kompilatorn s˚a att ber¨akningarna sker med l¨agre overhead kan man titta p˚a vad som kan skalas bort. Uppenbarligen kan funktionsanropet skippas. Kvar blir 17 cykler, ett overhead p˚a ungef¨ar 29%. Utf¨or man m˚anga instruktioner p˚a en g˚ang eller om man dedikerar ett register till flyttalsenhetens basadress s˚a g˚ar overhead mot

(50)

Instruktion Tids˚atg˚ang [cykler] calli 1 mvhi 1 ori 1 sw 1 sw 1 sw 1 lw 12 mv 1 ret 1

Tabell 3.2: Tids˚atg˚ang f¨or minnesmappad flyttalsaddition.

25% och en tids˚atg˚ang p˚a 15 cykler f¨or en flyttalsoperation. F¨or flyttalsopera-tioner av samma typ eller med samma indata sjunker tids˚atg˚angen ytterliga-re, men f¨oruts¨atter man godtyckliga operationer blir minimala tids˚atg˚angen 15 cykler. I j¨amf¨orelse med flyttalsber¨akningar i MicroBlaze som exekverar en flyttalsoperation var fj¨arde cykel ¨ar tids˚atg˚angen allts˚a i b¨asta fall n¨astan fyra g˚anger s˚a h¨og.

1 f l o a t a d d s f 3 ( f l o a t A, f l o a t B) 2 { 3 f l o a t r e t ; 4 asm v o l a t i l e ( 5 ”mvhi r3 , 0 x8000 \n\ t ” 6 ” o r i r3 , r3 , 0 x0100 \n\ t ” 7 ”sw ( r 3 +12) , r 0 \n\ t ” 8 ”sw ( r 3 +16) ,%1\n\ t ” 9 ”sw ( r 3 +20) ,%2\n\ t ” 10 ” lw %0 ,( r 3 +0)” 11 : ”=r ” ( ∗ ( ( f l o a t ∗) &r e t ) )

12 : ” r ” ( ∗ ( ( unsigned int ∗) &A) ) , 13 ” r ” ( ∗ ( ( unsigned int ∗) &B) ) 14 : ” r 3 ” ) ;

15 return r e t ; 16 }

(51)

1 00010244 < a d d s f 3 >: 2 1 0 2 4 4 : 78 03 80 00 mvhi r3 , 0 x8000 3 1 0 2 4 8 : 38 63 01 00 o r i r3 , r3 , 0 x100 4 1024 c : 58 60 00 0 c sw ( r 3 +12) , r 0 5 1 0 2 5 0 : 58 61 00 10 sw ( r 3 +16) , r 1 6 1 0 2 5 4 : 58 62 00 14 sw ( r 3 +20) , r 2 7 1 0 2 5 8 : 28 64 00 00 lw r4 , ( r 3 +0) 8 1025 c : b8 80 08 00 mv r1 , r 4 9 1 0 2 6 0 : c3 a0 00 00 r e t 10 . . . 11 1049 c : 2b 62 f f f 8 lw r2 , ( f p +−8) 12 104 a0 : 2b 61 f f f c lw r1 , ( f p +−4) 13 104 a4 : f b f f f f 68 c a l l i 10244 < a d d s f 3 > 14 104 a8 : 5b 61 00 00 sw ( f p +0) , r 1

Kodexempel 3.4: Disassemblering av kodexempel 3.3 efter inf¨orandet av funk-tionerna i kodexempel 3.5.

3.4

Instruktionsgr¨

anssnitt

Den st¨orsta anledningen till att den minnesmappade implementationen av flyttalsaccelerering presterar d˚aligt ¨ar att all in- och utdata m˚aste flyttas mellan processorns register och flyttalsacceleratorn f¨or varje ber¨akning. En b¨attre l¨osning skulle vara att flyttalsacceleratorn l¨aser och skriver indata direkt mot processorns register. Det g˚ar att ˚astadkomma genom att anv¨anda

user-gr¨anssnittet hos processorn.

Instruktionsarkitekturen hos Mico32 definierar instruktionen user med ett register som utargument, tv˚a register och en elvabitars operationskod som inargument, ett exempel ges i kodexempel 3.6. N¨ar userinstruktionen ex-ekverar l¨aggs data fr˚an inargumenten ut p˚a en port hos processorn samtidigt som utsignalen user valid g˚ar h¨og. Pipelinen i processorn stoppas sedan tills insignalen user ready detekteras. D¨arefter flyttas data fr˚an inporten user resultin i det register som angavs som utargument f¨or instruktionen. Genom att implementera ett gr¨ansnitt mellan flyttalsacceleratorn och user-funktionaliteten i processorn kan flyttalsacceleratorn anv¨andas utan att flytta flyttalsdata fram och tillbaks. I figur 3.2 visas var user-gr¨anssnittet f¨or flyttalsenheten passar in i processorns pipeline. Det gr¨anssnittet g¨or ¨ar att synkronisera in- och utdata mellan flyttalsenheten och processorns klock-dom¨aner samt generera user ready-signalen n¨ar ber¨akningen ¨ar klar.

(52)

R e g i s t e r f i l F e t c h D e c o d e I n s t r . -m i n n e D e b u g -m i n n e E x e c u t e M e m o r y W r i t e b a c k D a t a W B I n s t r . W B R e g i s t e r b y p a s s D a t a -m i n n e B y p a s s , m i n n e U a r t G P I O F P U

Figur 3.2: Mico32:s pipeline efter inf¨orandet av flyttalsacceleratorn via user-gr¨anssnit.

(53)

1 u s e r r3 , r1 , r2 , 0

Kodexempel 3.6: Assemblerkod f¨or addition med flyttalsinstruktion.

1 00010244 < a d d s f 3 >: 2 1 0 2 4 4 : c c 22 18 00 u s e r r3 , r1 , r2 , 0 x0 3 1 0 2 4 8 : b8 60 08 00 mv r1 , r 3 4 1024 c : c3 a0 00 00 r e t 5 . . . 6 1049 c : 2b 62 f f f 8 lw r2 , ( f p +−8) 7 104 a0 : 2b 61 f f f c lw r1 , ( f p +−4) 8 104 a4 : f b f f f f 68 c a l l i 10244 < a d d s f 3 > 9 104 a8 : 5b 61 00 00 sw ( f p +0) , r 1

Kodexempel 3.7: Disassemblering av kodexempel 3.3 efter kompilering med accelererade funktioner enligt exempel 3.8.

ser ut i assembler. Nu beh¨over operanderna inte flyttas till flyttalsenhetens register innan operationen utf¨ors. P˚a samma s¨att som tidigare kan man in-tegrera den h¨ar l¨osningen med C-spr˚akets flyttalstyper genom att byta ut anropen till mjukvaruber¨akningarna. I listningen 3.7 har resulterande ma-skinkod disassemblerats. Ut¨over instruktionen som utf¨or flyttalsber¨akningen ¨ar det nu bara sj¨alva funktionsanropet som utg¨or overhead.

1 f l o a t a d d s f 3 ( f l o a t A, f l o a t B) 2 {

3 f l o a t r e t ;

4 asm v o l a t i l e ( ” u s e r %0,%1,%2,0”

5 : ”=r ” ( ∗ ( ( f l o a t ∗) &r e t ) )

6 : ” r ” ( ∗ ( ( unsigned int ∗) &A) ) ,

7 ” r ” ( ∗ ( ( unsigned int ∗) &B) ) ) ;

8 return r e t ; 9 }

(54)

3.5

Kompilatorst¨

od

Genom introduktionen av usergr¨anssnittet i avsnitt 3.4 kan accelererade talsber¨akningar utf¨oras med en enda assemblerinstruktion. Hittills har flyt-talsber¨akningar i C implementerats genom att ers¨atta anropen till SoftFloats rutiner. Det inneb¨ar ocks˚a att f¨or varje flyttalsber¨akning finns ett on¨odigt overhead i form av ett funktionsanrop. En b¨attre l¨osning ¨ar ist¨allet att l˚ata kompilatorn ¨overs¨atta aritmetik med inbyggda flyttalstyper i C till motsva-rande user-instruktioner. Det inneb¨ar att kompilatorn beh¨over kompletteras med st¨od f¨or flyttalsinstruktioner i form av user-instruktionerna. F¨or att f¨orst˚a hur det g˚ar till ges h¨ar f¨orst en kort ¨oversikt ¨over hur kompilatorn genererar maskinkod fr˚an C-kod. GCC behandlar programkod i f¨oljande tre ¨overgripande steg:

• Parsning av k¨allkod i front end • Optimering i middle end

• Generering av maskinkod i back end

F¨or varje programmeringsspr˚ak som kompilatorn st¨odjer finns ett front

end och f¨or varje instruktionsarkitektur ett back end. Delarna i GCC som h¨or

till Mico32-porten ˚aterfinns t.ex. i ett back end ben¨amnt lm32.

Parsning av k¨allkod sker med hj¨alp av ett antal olika front ends som ¨overs¨atter respektive programspr˚ak till AST-format (abstract syntax tree), det h¨ar formatet ¨overs¨atts sedan till generic-formatet som ¨ar det gemensam-ma representationsforgemensam-mat som alla front end genererar.

Efter att en generic-representation har genererats sker optimering av pro-gramkoden, f¨orst via den interna representationen GIMPLE och sedan via ¨annu en intern representation vid namn SSA. Efter att optimeringar p˚a SSA-niv˚a genomf¨orts s˚a konverteras koden ˚ater igen till GIMPLE.

Efter det genereras fr˚an den slutgiltiga GIMPLE-representationen med hj¨alp av back end en RTL-representation. RTL ¨ar sedan det representations-formatet som anv¨ands av back end f¨or att generera assemblerkod f¨or den aktuella processortypen. Det ¨ar i det h¨ar steget; ¨overs¨attningen fr˚an RTL till assemblerkod, som komplettering kr¨avs f¨or att generera flyttalsinstruktioner. I GCC finns ett speciellt spr˚ak f¨or beskrivning av processorns instruk-tionsupps¨attning, olika delenheter och pipelinestruktur. S˚adana h¨ar beskriv-ningar ges f¨or respektive plattform i MD-filer (machine description) som utg¨or en del av back end f¨or en port av GCC.

RTL-representationen har redan information om n¨ar en flyttalsoperation utf¨ors s˚a det som beh¨over l¨aggas till ¨ar en definition av hur en flyttalsopera-tion fr˚an RTL-representationen ska matchas mot en flyttalsinstruktion. Finns

(55)

det ingen s˚adan mappning kommer flyttalsoperationen att ers¨attas med ett anrop till l¨amplig mjukvarurutin fr˚an biblioteket SoftFloat.

I kodexempel 3.9 finns ett exempel p˚a en tillagd definition som genererar en user-instruktion. H¨ar definieras en flyttalsaddition med enkel precision d¨ar b˚ada operanderna samt resultatet ¨ar av enkel precision. Bivillkoren ¨ar att m˚aloperanden ska vara ett generellt register (rad 2), k¨alloperanderna skall vara antingen tv˚a generella register eller ett generellt register och v¨ardet noll (rad 3-6). Om en operand har v¨ardet noll kommer den att bytas ut mot registret r0 som alltid inneh˚aller v¨ardet noll. Assemblerinstruktionen som matas ut f˚ar en user-operationskod som motsvarar operationskoden f¨or addition i flyttalsenheten (rad 8).

1 ( d e f i n e i n s n ” a d d s f 3 ” 2 [ ( s e t ( match operand : SF 0 ” r e g i s t e r o p e r a n d ” ”=r ” ) 3 ( p l u s : SF ( match operand : SF 1 4 ” r e g i s t e r o r z e r o o p e r a n d ” ”%rJ ” ) 5 ( match operand : SF 2 6 ” r e g i s t e r o p e r a n d ” ” r ” ) ) ) ]

7 ”TARGET HARD FLOAT”

8 ” u s e r %0, %z1 , %2, 0” 9 [ ( s e t a t t r ” type ” ” f l o a t ” ) ] 10 )

Kodexempel 3.9: Definition av flyttalsinstruktion i MD-fil.

I kodexempel 3.9 finns ytterligare ett bivillkor (rad 7), n¨amligen att TARGET HARD FLOATskall vara satt f¨or att instruktionen ska genereras. Detta g¨or att man vid kompileringstillf¨allet kan sl˚a av och p˚a generering av flyttals-instruktioner med ett argument till kompilatorn (-mhard-float). F¨or att f˚a den funktionaliteten kr¨avdes ocks˚a ett par triviala ¨andringar i ¨ovriga delar av back end samt i assembleraren GAS i Binutils.

I kodexempel 3.10 finns ett exempel p˚a resulterande assemblerkod n¨ar kodexempel 3.3 kompilerats med den modifierade versionen av GCC. Sj¨alva flyttalsber¨akningen utf¨ors nu p˚a rad 4 utan overhead fr˚an funktionsanrop. Tids˚atg˚angen f¨or flyttalsoperationen utg¨ors nu enbart av den tid det tar f¨or acceleratorn att utf¨ora ber¨akningen.

References

Related documents

Det enklaste t¨ ankbara s¨ attet att h¨ arleda hela kapaciteten skulle vara att anta att alla N atomer i en kristall har samma vibrationsfrekvens, och sedan helt enkelt

Resonemang, inf¨ orda beteck- ningar och utr¨ akningar f˚ ar inte vara s˚ a knapph¨ andigt presenterade att de blir sv˚ ara att f¨ olja.. ¨ Aven endast delvis l¨ osta problem kan

L˚ at y(t) vara andelen av populationen som ¨ar smittad efter tiden t dygn, r¨aknad fr˚ an uppt¨ack- ten... Observera att ¨amnets koncentration ¨ar samma som m¨angden av

I Fortran 90 ¨ar det inte n¨ odv¨andigt att anv¨anda en DO-variabel, emedan det ocks˚ a finns ett annat s¨att att konstruera en DO-slinga, d¨ar en ny sats, EXIT, anv¨ands f¨ or

Rutinen som anv¨ands f¨ or att definiera operatorn, kan ha antingen ett eller tv˚ a argument, men eftersom funktionen normalt definieras i samma modul som inneh˚

Detta g¨aller alla tal vars dyadiska utveckling ¨ar ¨andlig; man beh¨over inte kasta fler kast ¨an vad som anges av den position d¨ar sista ettan finns i utvecklingen.. Det betyder

Till exempel fick jag inte med n˚ agot Ljus- och Optikland i f¨ orsta f¨ ors¨ oket, och pilen mot Kosmologi, som ligger utanf¨ or den h¨ ar kartan, borde peka mer upp˚ at,

Om vi j¨ amf¨ or detta resultat med tidigare d˚ a vi simulerade f¨ or linj¨ ar regression ser vi att n¨ ar bootstrap anv¨ ands beh¨ over vi en urvalsgrupp om 20 observationer f¨