Dat1E K1-1 - En pipelinet mikroarkitektur. Espen Højsgaard Rune Højsgaard Christian Iversen



Relaterede dokumenter
DATALOGI MASKINARKITEKTUR Blok 2 samt Reeksamination i DATALOGI MASKINARKITEKTUR Blok 1 og arkitekturdelen af DATALOGI 1E

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

Dat1E G2 - En enkelt/dobbelt-cyklus mikroarkitektur. Espen Højsgaard Rune Højsgaard Christian Iversen

MIPS, registerallokering og MARS

DATALOGI 1E. Skriftlig eksamen mandag den 23. juni 2003

Allan C. Malmberg. Terningkast

DM536. Rapport og debug

Fig. 1 Billede af de 60 terninger på mit skrivebord

Routeren. - og lag 3 switchen! Netteknik 1

BRUGERUNDERSØGELSE BORGERENS MØDE MED REHABILITERINGSTEAMET LEJRE KOMMUNE 2014

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

Lyskryds. Thomas Olsson Søren Guldbrand Pedersen. Og der blev lys!

Er trafikanterne tilfredse med ITS på motorveje?

1-1 Usability evaluering af den simple udgave

UNDERVISNING I PROBLEMLØSNING

SSOG Scandinavian School of Gemology

Evaluering af sygedagpengemodtageres oplevelse af ansøgningsprocessen

Projekt - Valgfrit Tema

Faglig læsning i matematik

Rygtespredning: Et logistisk eksperiment

PRINCE2 Foundation Eksamensvejledning til kursister. 1 Din profil på eksamensportalen. 2 Eksamensformål. 3 Eksamensopbygning

Tietgenskolen - Nørrehus. Data warehouse. Database for udviklere. Thor Harloff Lynggaard DM08125

Indholdsfortegnelse resultat- & kritikprogrammet.

Her ser i hvorledes man nemt kan installere en række nyttige programmer, uden at få andet end selv programmet installeret. på

Trafikantadfærd i 2-sporede rundkørsler

METODESAMLING TIL ELEVER

Athena DIMENSION Varmeanlæg 4

Studieretningsprojektet i 3.g 2007

CCS Formål Produktblad December 2015

T A L K U N N E N. Datasæt i samspil. Krydstabeller Grafer Mærketal. INFA Matematik Allan C

FLIPPED CLASSROOM MULIGHEDER OG BARRIERER

Det Rene Videnregnskab

PEST analyse. Den lille lette... Indføring i Erhvervsøkonomi på HD studiet. S i d e 1 11

Undersøgelse af undervisningsmiljøet på Flemming Efterskole 2013

Dokumentation af programmering i Python 2.75

Eksempler på elevbesvarelser af gådedelen:

Applikationen Klip (dansk)

Højmesse/afskedsgudstjeneste i Emmersbæk, søndag den 12. juli kl

Om opbygningen af de nationale læsetest. Hvordan og hvorfor?

Om at løse problemer En opgave-workshop Beregnelighed og kompleksitet

Kommunal Rottebekæmpelse tal og tendenser

SIKKER CYKLIST digitalt undervisningsmateriale

Notat vedrørende projektet EFP06 Lavfrekvent støj fra store vindmøller Kvantificering af støjen og vurdering af genevirkningen

Teknisk Notat. Støj fra vindmøller ved andre vindhastigheder end 6 og 8 m/s. Udført for Miljøstyrelsen. TC Sagsnr.: T Side 1 af 15

Handleplan for elever, hvor der er iværksat særlige indsatser eller støtte

F-Secure Mobile Security for S60

JavaScript. nedarvning.

BETJENINGSVEJLEDNING. Cod. Q Rev. A 10/06

Mundtlig prøve i Matematik

IFC Egenskaber. Mohammad Hussain Parsianfar s BYG DTU

Tredje kapitel i serien om, hvad man kan få ud af sin håndflash, hvis bare man bruger fantasien

Brugervejledning for Senge- og dørvagt PIR2003

Et udtryk på formena n kaldes en potens med grundtal a og eksponent n. Vi vil kun betragte potenser hvor grundtallet er positivt, altså a>0.

Indholdsfortegnelse :

Kapitel 9. Selvvurderet helbred, trivsel og sociale relationer

Appendiks 3 Beregneren - progression i de nationale matematiktest - Vejledning til brug af beregner af progression i matematik

En ny vej - Statusrapport juli 2013

Ældre- og Handicapforvaltningen, Aalborg Kommune Aalborg på Forkant Innovativ udvikling i sundhed og velfærd. Forundersøgelse. Aalborg på Forkant

Egenskaber ved Krydsproduktet

HVORDAN KAN REFERENCEARKITEKTUR IMPLEMENTERES I EN STANDARDISERET DOKUMENTATION?

DC-Motor Controller. Brugermanual

Hjælp til jobsøgningen

IT Support Guide. Installation af netværksprinter (direkte IP print)

Mundtlig prøve i Matematik

Sådan giver vi vejledning i verdensklasse Ca. 2 timer

Anvendt Statistik Lektion 6. Kontingenstabeller χ 2 -test [ki-i-anden-test]

Der er derfor, for at alle kan sende, kun tilladt, at sende intermitterende. Altså korte pakker. ( Dette skal dog verificeres!!)

Transkript:

Dat1E K1-1 - En pipelinet mikroarkitektur Espen Højsgaard Rune Højsgaard Christian Iversen 1

Indhold Indhold 2 1 Sammenfatning 5 1.1 Ambitioner................................... 5 1.2 Resultat..................................... 5 1.3 Forløb...................................... 5 2 Overordnet design 6 2.1 Målsætninger for designet........................... 6 2.2 Udvidelse af datastien............................. 6 2.3 Kontrol..................................... 7 2.4 Forwarding................................... 7 2.4.1 Hvorhen?................................ 7 2.4.2 Forwarding fra LW........................... 7 2.4.3 Detektering............................... 8 2.5 Hazards..................................... 8 2.5.1 Misprediction detection unit...................... 8 2.5.2 Hazard detection unit......................... 9 2.5.3 Kontrol af flow............................. 10 3 Design af hopforudsiger 12 3.1 Statisk og dynamisk forudsigelse........................ 12 3.2 Tilgængelig information............................ 12 3.3 Hoptabellen................................... 12 3.4 Model 1: Den naive hopforudsiger....................... 13 3.5 Model 2: Hopforudsiger med dynamisk indlæring............... 13 3.6 Model 3: Hopforudsiger med 2-bit hophistorie................ 14 3.7 Teoretisk ydelse................................. 14 3.7.1 Model 1: Den naive hopforudsiger................... 14 3.7.2 Model 2: Hopforudsiger med dynamisk indlæring.......... 15 3.7.3 Model 3: Hopforudsiger med 2-bit hophistorie............ 15 3.8 Det valgte design................................ 15 4 Implementation 16 4.1 Kildekode.................................... 16 5 Analyse af ydelse 17 5.1 Benchmarks................................... 17 5.1.1 Hopforudsiger-benchmarks....................... 17 5.1.2 Obligatoriske benchmarks....................... 18 5.1.3 Bemærkninger om CPI......................... 18 2

5.2 Kritisk vej.................................... 19 6 Afprøvning 21 6.1 Strategi..................................... 21 6.1.1 Intern afprøvning............................ 21 6.1.2 De enkelte instruktioner........................ 21 6.1.3 Forwarding............................... 23 6.1.4 Hazards................................. 23 6.1.5 Beskyttelse af register $0........................ 24 6.2 Resultater.................................... 24 7 Litteratur 25 A Diagrammer 26 A.1 Pipeline..................................... 26 A.2 Hopforudsiger.................................. 27 A.3 Styrelogik til hopforudsiger........................... 28 A.4 Hopcache-register................................ 29 B Delayed branching 29 C Afprøvning 31 C.1 test.asm..................................... 31 C.2 Afvikling af afprøvning............................. 37 C.3 Udskrift af kørsel................................ 37 C.4 pipelined-miss.k................................. 39 D Hopforudsigelsespræcision 45 E Kodeeksempler til hopforudsigeren 45 F Benchmarks 45 F.1 AsmBsort.................................... 45 F.1.1 statistik................................. 55 F.2 AsmCopy.................................... 64 F.2.1 statistik................................. 65 F.3 AsmFib..................................... 66 F.3.1 statistik................................. 67 F.4 AsmQsort.................................... 67 F.4.1 statistik................................. 68 F.5 AsmScatter................................... 70 F.5.1 statistik................................. 71 F.6 fac1....................................... 72 F.6.1 statistik................................. 72 3

F.7 fib1........................................ 75 F.7.1 statistik................................. 76 F.8 mergesort1.................................... 77 F.8.1 statistik................................. 77 F.9 primes1..................................... 86 F.9.1 statistik................................. 87 G Kontrol 90 H Kildekode 90 H.1 alu.k....................................... 90 H.2 BranchCache.k................................. 91 H.3 BranchController.k............................... 91 H.4 BranchHash.k.................................. 92 H.5 BranchPLA.k.................................. 92 H.6 BranchPred.k.................................. 93 H.7 control.k..................................... 93 H.8 forwarddetectionunit.k............................. 95 H.9 hazarddetection-unit.k............................. 97 H.10 misprediction-unit.k............................... 98 H.11 pipelined.k.................................... 101 H.12 stall-and-nop-control.k............................. 106 4

1 Sammenfatning Dette er en besvarelse af første del af den karaktergivende opgave på kurset Datalogi 1E 2003, Københavns Universitet [6]. Læseren forventes at have læst opgaveformuleringen samt - som minimum - at have samme forudsætninger som en elev, der har fulgt kurset. Formålet med opgaven var at implementere en pipelinet mikroarkitektur, der kunne udføre en delmængde af MIPS-instruktionssættet. 1.1 Ambitioner Det var vores mål at lave en korrekt og effektiv arkitektur, der var modulær og overskuelig. Dette skulle opnås ved at anvende teknikkerne i [3] til at udvide det deri gennemgåede design, således at det kunne håndtere de ekstra instruktioner opgaven krævede. 1.2 Resultat Resultatet lever op til vores mål omend clockfrekvensen ikke er blandt de højeste. Ydelsen af arkitekturen er relativt høj ift. clockfrekvensen, når vi sammenligner med de benchmarks, der er blevet offentliggjort på fagets nyhedsgruppe 1. 1.3 Forløb Vi er overordnet tilfredse med forløbet af opgaven. Dog har fejl i Kreds og SimSys 2 taget en del tid, hvorfor vi ikke har haft tid til at iterere over designet samt implementere de i afsnit 5.2 gennemgåede optimeringer. Det skal dog retfærdigvis siges, at vedligholderne af programmerne har været hurtige til at rette fejlene når de blev rapporteret. 1 diku.dat1e 2 se nyhedsgruppen og http:www.diku.dk/undervisning/2003e/dat1e/kreds/kreds.html 5

2 Overordnet design I denne opgave skal vi som sagt designe en pipelinet mikroarkitektur. Vi har - som opgaveteksten [6] anbefaler - valgt at tage udgangspunkt i arkitekturen fra [3, kap. 6]. Læseren forventes at have læst dette kapitel, hvorfor vi i denne opgave kun vil fokusere på tilføjelser/forskelle fra det deri beskrevne design. I dette afsnit vil vi diskutere designet med undtagelse af hopforudsigeren, der behandles i afsnit 3. Et overblik over vores design kan fås ved at se på diagrammerne i appendiks A.1. Vi vil ikke beskrive designet på transistor-niveau, men i stedet på et abstraktionsniveau, hvor det er trivielt at anvende teknikkerne fra [3] til at opnå det ønskede. 2.1 Målsætninger for designet Vores overordnede målsætning for designet var, at mikroarkitekturen skulle være korrekt og effektiv. Korrekthed opnås ved at de enkelte instruktioner udføres korrekt og at samspillet mellem dem, i form af hazards og forwarding, fungerer. Desuden skal mikroarkitekturen kunne håndtere interaktionen med hukommelsessystemet på en måde, som lever op til specifikationerne af MemIOSys [4, pp 64]. Effektivitet opnås ved en optimeret vægtning af CPI og clockfrekvens. Da vi først kender clockfrekvensen, når arkitekturen er implementeret, vil denne vægtning bero på et kvalificeret skøn baseret på vores erfaringer fra implementationen af enkelt-/dobbeltcyklus arkitektur (løsning af [5]). Desuden har vi haft nøgleprincipperne på s. 187-188 i [3] i tankerne under designet - specielt good design demands good compromises og make the common case fast. De to instruktionsmix på figur 3.38 s. 189 i [3] har været grundlag for anvendelsen af sidstnævnte princip. 2.2 Udvidelse af datastien Arkitekturen i [3] understøtter ikke alle de i opgaven krævede instruktioner. Vi vil her kort gennemgå de udvidelser af datastien, der har været nødvendige for at overkomme denne begrænsning. BNE Kræver ikke ændringer af datastien, da BEQ allerede er understøttet. I-type For at understøtte I-type instruktionerne, er det nødvendigt at den fortegnsforlængede konstant kan føres ind i ALU en. Desuden bruger de logiske instruktioner (ANDI og ORI) nul-forlængelse (jf. [3, A-55,A-57]), hvilket fortegnsforlængeren ændres til at kunne håndtere. JAL Understøttelse af JAL medfører at konstanten 31 skal føres ind i den mux, der vælger destinationsregister. Desuden skal adressen på den efterfølgende instruktion (PC+4) kunne skrives til registrene i WB-fasen. JR Læst data fra registrene skal kunne skrives til PC. 6

2.3 Kontrol Vi bruger hovedsageligt samme kontrolsignaler som i [3]. Dog har vi valgt at fjerne den separate ALU-kontrol pga. I-type-instruktionerne, der - i modsætning til R-type - ikke specificerer regneoperationen i de seks mindst betydende bit. Derved forsvinder fordelen ved at separere kontrollen af ALU en ud fra hovedkontrollen. Udvidelserne af datastien har desuden tilføjet nogle kontrolsignaler: BNE, JumpReg og Link. Disse bruges henholdsvis af instruktionerne BNE, JR og JAL. Vi har placeret en tabel over kontrolsignalerne i appendiks G. 2.4 Forwarding Som i [3] har vi lavet en enhed til at håndtere forwarding: forwarding detection unit (FDU). Forwarding er et af de steder, hvor vi har forsøgt at vægte CPI og clockfrekvens. Spørgsmålet er hvor i pipelinen, der skal forwardes til. 2.4.1 Hvorhen? Vi havde en forventning om at ALU en ville være tæt på at være på den kritiske vej. Derfor ville vi så vidt mulig undgå at sætte andre komponenter i serie med denne, for ikke at forlænge signalvejen i EX-fasen. Ift. til clockfrekvens ville det derfor være ønskeligt, om vi kunne undgå at forwarde til EX-fasen, da dette kræver to muxer foran ALU en. Problemet ville så være, at der skulle forwardes til ID-fasen. Forwarding direkte fra ALU en ville ikke være en løsning, da vi dermed alligevel ville forlænge den (potentielt) kritiske vej. I stedet ville vi være nødt til at indsætte en bobbel mellem instruktionerne i ID- og EX-faserne, hvis der skulle forwardes. Da vi formoder at instruktioner ofte bruger udregningen fra den foregående instruktion, ville denne løsning øge CPI betragteligt. Vi har derfor valgt at holde CPI nede ved at forwarde fra de to foregående instruktioner til EX-fasen mod til gengæld at øge den potentielt kritiske vej, ved at sætte muxer foran ALU en. Uden om registrene De registre, som Kreds stiller til rådighed (RegisterFile [4, p 85]), muliggør ikke at man skriver til og læser fra det samme register i samme cyklus - dvs. det er muligt, men man får ikke den just skrevne værdi. Dette problem løses ved at lade det data, der bliver skrevet til registrene, erstatte den læste værdi. Altså forwarding fra WB-fasen til ID-fasen. 2.4.2 Forwarding fra LW Instruktionen LW er speciel ift. til de andre instruktioner, der skriver til registre. Det data den skriver kommer fra hukommelsen og er derfor først tilgængeligt i slutningen af MEM-fasen. Hvis dette data skulle forwardes direkte fra MEM- til EX-fasen, ville hukommelsessystemet komme til at sidde i serie med ALU en, hvilket ville give en meget lang signalvej. 7

Derfor vægter vi i det tilfælde, hvor der skal forwardes fra en LW-instruktion til instruktionen lige efter, clockfrekvensen frem for CPI. Vi indsætter en bobbel mellem de to instruktioner, således at data fra LW-instruktioner kun kan forwardes fra WB-fasen. 2.4.3 Detektering Kontrolsignalerne til muxerne har betydning for, hvor lang signalvejen gennem ALU en bliver. For at de skal være tilgængelige hurtigst muligt, har vi valgt at detektere evt. forwarding i ID-fasen, således at kontrolsignalerne til muxerne før ALU en blot skal forstærkes i EX-fasen. Dette giver ikke anledning til problemer, da destinationsregistrene for de foregående instruktioner er til rådighed i ID-fasen. 2.5 Hazards Vi har opdelt hazards i to grupper: fejlforudsigelser og resten. Fejlforudsigelser er den gruppe af hazards, der opstår når hop-forudsigeren gætter forkert. Den anden gruppe består kun af ovenfor beskrevne hazard ifm. LW samt et problem med selvmodificerende kode, der er kommet ind i pipelinen. Første gruppe håndteres af en enhed vi har navngivet misprediction detection unit (MDU) og anden gruppe af hazard detection unit (HDU). 2.5.1 Misprediction detection unit MDU en håndterer som nævnt fejlforudsigelser. Da hop-forudsigeren jf. opgaveteksten [6, p 2] kun må bero sit gæt på adressen af instruktionen og ikke typen, skal MDU en derfor undersøge om alle instruktioner er blevet efterfulgt af instruktionen fra den rigtige adresse. Hvis det ikke er tilfældet, skal pipelinen ryddes fra den forkerte instruktion til og med IF-fasen og den korrekte adresse skal skrives til PC. Det vil desuden være oplagt at give hop-forudsigeren respons på dens gæt, når vi ved om det var korrekt eller ej. Hop og forgreninger håndteres som en delmængde af fejlforudsigelser og i det følgende vil vi gennemgå hvilke faser af pipelinen, MDU en skal behandle de forskellige typer instruktioner. BEQ/BNE Forgreninger kan først undersøges når deres betingelse er undersøgt, dvs. efter ALU en. Da vi som tidligere nævnt helst vil undgå at forlænge den signalvej ALU en er en del af, har vi valgt først at undersøge udfaldet i MEM-fasen. Alternativt kunne vi vælge at træffe beslutningen allerede i ID-fasen. Det ville forudsætte at vi indsatte noget sammenligningslogik i ID-fasen samt at vi indsatte bobler før forgreningsinstruktioner, da vi ellers ville skulle forwarde fra ALU en. Forgreningsinstruktioner, der brugte resultatet fra den foregående instruktion og som var blevet forudsagt korrekt ville have en CPI på 2, mens de forkert forudsagte ville have en CPI på 3. Med vores løsning er de tilsvarende tal henholdsvis 1 og 4. 8

Hvilket valg, der er det bedste, afhænger af hop-forudsigerens effektivitet. Hvis vi forudsætter at forgreninger altid bruger resultatet fra den foregående instruktion, så skal den procentdel af hop-forudsigerens gæt, der er korrekte (betegnet x), mindst være x 1 + (1 x) 4 < x 2 + (1 x) 3 4 3x < 3 x 1 2 < x for at vores løsning er bedst. Forudsætningen er ikke nødvendigvis sand, hvorfor effektiviteten af hop-forudsigeren skal være bedre end ovenfor beregnet, da CPI for løsningen i ID-fasen ville være lavere. Vi antager at vores hop-forudsiger bliver tilstrækkelig effektiv til at det kan betale sig først at foretage forgreningen i MEM-fasen. Forsinket forgrening I [3] s. 350 og 444 nævnes det at MIPS bruger delayed branching. Vi har spurgt opgavestilleren, Martin Zachariasen, og fået at vide at dette er forældet og ikke bruges på kurset (korrespondancen kan ses i appendiks B). Vi vil derfor undlade at bruge delayed branching. JR Vi ville helst have håndteret JR i EX-fasen, da dette ville give lavere omkostninger ved fejlgæt. Men for ikke at skulle forstærke signalerne for meget i EX-fasen - og måske forlænge den kritiske vej - valgte vi at håndtere JR i MEM-fasen i stedet. Alternativt kunne vi have valgt ID-fasen, men det ville kræve, at der blev indsat bobler, hvis der skulle forwardes. Desuden var vi bange for at signalvejen ville blive kritisk, hvis den skulle igennem registrene, FDU og MDU. J/JAL Disse to instruktioner er ikke afhængige af de foregående instruktioner og det kan derfor allerede i ID-fasen verificeres om den efterfølgende instruktion er rigtig. andre Da hop-forudsigeren ikke kender instruktionens type, er vi nødt til at undersøge om alle ikke-hop-instruktioner er blevet efterfulgt af instruktionen fra den efterfølgende adresse. Det vil dog formentlig være et meget sjældent forekommende problem, da vi - som omtalt i afsnit 3 - kun gemmer information om hop-instruktioner. For ikke at trække for meget på PC i ID-fasen, har vi valgt at undersøge forudsigelsen i EX-fasen i stedet, hvor PC er mindre brugt. 2.5.2 Hazard detection unit Udover de hazards som MDU en detekterer, er der som sagt to andre. Den ene følger af at vi ikke vil forwarde data læst fra hukommelsen direkte fra MEM-fasen - den er behandlet i afsnit 2.4.2. Den anden følger af at en SW i MEM-fasen kan skrive til adressen, hvor en anden instruktion i pipelinen er hentet fra (selvmodificerende kode). I det sidste tilfælde skal pipelinen ryddes fra den ændrede instruktion til og med IFfasen og adressen på den ændrede instruktion skal skrives til PC. 9

2.5.3 Kontrol af flow Til at koordinere styringen af pipelinen har vi indført en enhed: stall and NOP control (SANC). Denne enhed skal styre flowet igennem pipelinen og indsætte bobler ud fra det input den får fra MDU en, HDU en og hukommelsen. Før vi diskuterer, hvordan koordineringen skal foregår, vil vi først kigge på, hvordan arkitekturen skal reagere, når hukommelsen ikke kan følge med. holdandwait Hvis hukommelsen ikke kan levere data i den nuværende cyklus markerer den det ved at sætte signalet holdandwait højt. Denne markering viser os ikke om det er dataporten og/eller instruktionsporten, der ikke er klar, men vi kan udelukke det første, hvis der ikke enten er en LW- eller en SWinstruktion i MEM-fasen. I det tilfælde er det derfor muligt at lade pipelinen fra ID-fasen til WB-fasen fortsætte uhindret, hvorved vi bruger ventetiden på at løse evt. hazards i pipelinen og mellem den instruktion vi venter på og instruktionen i ID-fasen. Hvis instruktionen i MEM-fasen bruger data-porten til hukommelsen er vi nødt til at fastholde instruktionerne i IF- og MEM-fasen, da vi ikke ved hvilken af dem vi venter på. Der er ingen grund til at gøre noget ved instruktionen i WB-fasen, da den ikke spærrer for flowet og fordi det ikke gør nogen skade at den skriver den samme værdi til det samme register flere cykluser i træk. Hvis instruktionen i EX-fasen derimod ikke behøver at komme videre i pipelinen (f.eks. en NOP-instruktion), så kan instruktionen i ID-fasen passere til EX-fasen. Vi vil dog kun foretage dette skift i tilfælde af at det er en SW-instruktion der er i MEM-fasen, da vi ellers kan skabe en LW-hazard (se afsnit 2.4.2). Indsættelse af bobler Tidligere har vi omtalt indsættelse af bobler og fjernelse af instruktioner fra pipelinen, men vi har ikke defineret, hvordan det skulle foregå. Det råder vi bod på i dette afsnit. En bobbel er en instruktion, hvor alle kontrolsignalerne er lave, hvilket medfører at den ikke påvirker hverken registre eller hukommelse. Så hvis vi vil indsætte en bobbel i f.eks. EX-fasen betyder det at vi skriver nuller for alle kontrolsignalerne, der går ind i ID/EX-grænsen. Hvis vi skal fjerne en instruktion i, så er der to tilfælde: instruktionen b i fasen bagefter skal blive hvor den er eller den skal passere videre/fjernes. I det første tilfælde skal vi indsætte en bobbel i den fase hvor instruktion i er. I det andet skal vi indsætte en bobbel i den fase, hvor instruktion b er. På den måde er det kun instruktion i, der bliver fjernet uden at påvirke instruktionerne før og efter. SANC en sørger for at kategorisere informationen fra HDU en, MDU en og hukommelsen i en af ovenstående grupper. Ud fra dette nulstiller den de kontrolsignaler, der går ind i de rigtige grænser og sætter skriv-flagene til grænserne samt PC. Bevar instruktionsadressen Når vi indsætter bobler er det vigtigt at adressen på instruktionen får lov at passere videre. På den måde kan MDU en altid regne med, at fasen, 10

før den instruktion den undersøger, indeholder adressen på den efterfølgende instruktion - selvom den reelt ikke befinder sig i den pågældende fase. 11

3 Design af hopforudsiger En pipelinet mikroarkitektur har en lang række klare fordele over et enkelt- eller flercyklusdesign, men introducerer også nye problemstillinger. Blandt disse må forudsigelse af hop betragtes som et af de mest væsentlige[2, 2.12]. Hvis pipelinen skal tømmes for derefter at fyldes igen, opstår en lang pause. Hvis dette problem ikke løses effektivt, vil ydeevnen af den færdige processor være i fare. Vi vil derfor i dette afsnit gennemgå designet af hopforudsigeren, grundlaget for at have en sådan, og tre forskellige modeller for dennes implementation. 3.1 Statisk og dynamisk forudsigelse Hopforudsigere kan deles ind i to grupper. En statisk hopforudsiger er tilstandsfri og betragter kun den øjeblikkelige situation, hvorimod en dynamisk forudsiger bruger en mænge hukommelse til at huske tidligere hop, og deres udfald. Moderne processorer bruger dynamisk hopforudsigelse[1], da disse gætter rigtigt relativt flere gange end de statiske [2, 2.12][1, 2.10]. 3.2 Tilgængelig information Det er et krav i opgaveteksten[6, p 2] at valg vedrørende hop skal tages i IF-fasen, for at minimere forsinkelsen ved hop. Da instruktionskoden på dette tidspunkt ikke er kendt, må forudsigelsen alene bero på instruktionsadressen. Andre processorer deler ikke dette design, og kan således basere gættet på instruktionskoden [1][2], hvis hoppen ikke tidligere har været igennem hopforudsigeren, og derfor er ukendt. Typisk gættes der på at hoppet tages hvis der hoppes bagud, og at det ikke tages hvis der hoppes fremad[2]. Oversættere kan bruge denne viden til at lave programmer der har færre fejlgæt. Vi nyder ikke denne fordel, og alle hop vil derfor blive gættet forkert første gang de gennemløbes. Da vi kun kan basere et gæt på instruktionsadressen, kan vi ikke lave en statisk forudsiger. Vi vil derfor se på tre løsningsmodeller der benytter dynamisk forudsigelse. 3.3 Hoptabellen Enhver dynamisk hopforudsiger har en tabel over n tidligere hop. Tabellen gemmer som minimum (iadr,hop) instruktionsadresse og hop-bitten. Alt efter hvilken model der vælges, kan det være nødvendigt med ekstra information. Vi har valgt ikke kun at gemme hop, men hele hop-adressen da vi så kan førsøge at forudsige alle typer hop, i modsætning til kun at forudsige betingede hop. Størrelsen af hopcachen er begrænset, da et signal der skal trække mange komponenter bruger længere tid på at stabilisere sig [4, p 32]. Når data skal udvælges fra hopcachen, skal der bruges en mux. Denne mux vil blive en af de begrænsende faktorer, da alle registre skal forbindes til den. Det er således vigtigt at udnytte cachen effektivt, da en udvidelse ud over 12

Figur 1: En adresse indlæres igen en hvis grænse vil forårsage en forøget klokcyklustid. Omvendt vil det ikke være nyttigt at lave en meget effektiv udnyttelse, hvis denne kræver så store mængder kontrollogik at cyklustiden må forøges. På denne baggrund søger vi at implementere en art prioriteret liste, der ikke husker de nyeste hop, men de mest brugte. Af de n registre i tabellen, kaldes det øverste den primære hopcache (PHC). De resterende registre kaldes sekundær hopcache (SHC) 1, 2,...n 1. Den primære hopcache indeholder det nyeste hop, og de sekundære registre indeholder ældre hop. Når et nyt hop læres, sker det ved at alle registre gøres en position ældre, hvorefter den nye adresse placeres i PHC. Når et allerede kendt hop - gemt i SHC n - mødes igen, byttes SHC n ud med PHC. Denne metode giver ikke fuldt ud en prioriteret liste, da PHC kan byttes ud med en af de laveste SHC er (vist i figur 2), hvis man rammer et hop der ikke har været behandlet igennem længere tid. Denne ulempe opvejes dog af designets simplicitet. Enhver SHC kan kun skrives til fra to kilder - den foregående SHC (PHC en for SHC 1 ), eller PHC. Ligeledes kan PHC en kun skrives til fra to kilder - den indgående hopinformation, eller den SBC der indeholder gammel information om hoppet. Dette, at løsningen kræver mindre kontrollogik end en fuld prioriteret liste, gør den lettere at implementere, og tillader flere SHC er. Findes en adresse ikke i cachen, gættes der på den næste instruktion. 3.4 Model 1: Den naive hopforudsiger Den naive hopforudsiger har lidet at tilføje til hopcachen som den ser ud. Denne type forudsiger gætter på at et hop har samme udfald som sidste gang det blev taget. Det er ikke vanskeligt at implementere denne model, men den har et antal problemer (se afsnit 3.7.1). 3.5 Model 2: Hopforudsiger med dynamisk indlæring Denne model adskiller sig fra den foregående, ved ikke blindt at vælge samme udfald som sidst. I stedet bruges informationen fra MDU en (afsnit 2.5.1) til at begrænse indlæringen til de rigtige gæt. Dette forbedrer de situationer hvor et hop er tæt på at være altid-taget eller aldrig-taget. 13

Figur 2: Alderskorruption 3.6 Model 3: Hopforudsiger med 2-bit hophistorie Det ville være ønskeligt om forudsigeren kunne tilpasse sig hvert hop, og lære både af forkerte og rigtige gæt. En 2-bit hopforudsiger har disse egenskaber [3, p 442-444,496-502]. Ved at benytte en historie over de to sidste hop, er det muligt først at ændre på gættet for et givet hop når der er foretaget to forkerte gæt (dette er vist i figur 3). Ligesom den dynamiske forudsiger, har denne model forøget gætsikkerhed på hop der er tæt på at være altid-taget eller aldrig-taget, men i modsætning til den dynamiske fremgangsmåde, kan der her læres at et hop i en periode tages, så i en periode ikke tages, for så at tages igen, o.s.v. Figur 3: 2-bit-forudsiger 3.7 Teoretisk ydelse 3.7.1 Model 1: Den naive hopforudsiger Den naive forudsiger har den svaghed at den lærer på de forkerte tidspunkter. Dette gør at den kan være dårligere end altid at gætte på næste instruktion. Da forudsigeren altid lærer af sidste resultat, vil en løkke hvor et betinget hop der tages hver anden gang (se eksempel 1, figur 4) have 0 korrekte gæt! I en løkke der gennemløbes 10 gange (eksempel 2, figur 5), vil bne-instruktionen gættes forkert første gang, da hoppet ikke er kendt. Desuden vil den gætte forkert sidste gang, da hoppet her skiller sig ud fra sidste gennemløb. Denne effekt forværres når løkken indlejres i en anden løkke. Hvis vi betragter en dobbelt-løkke der udføres 10 10 gange (eksempel 3, figur 6), vil den ydre løkke have 8 gæt rigtige ud af 14

10, eller 80% træfsikkerhed. Den indre løkke vil have samme antal rigtige per gennemløb. Den totale træfsikkerhed er derfor 8 + 10 8 = 88 ud af 10 + 10 10 = 110 mulige (80%). 3.7.2 Model 2: Hopforudsiger med dynamisk indlæring Da denne model ikke lærer af fejl, vil den i eksempel 1 have 50% rigtige, hvilket er lige så godt som at gætte på næste instruktion hver gang. Et en altid skiftende situation som denne, kan man dårligt forvente mere af en forudsiger. I eksempel 2 vil den gætte hoppet forkert sidste gang, men vil i modsætning til den naive forudsiger ikke huske dette!. Derfor vil de 9 sidste gennemløb af den indre løkke i eksempel 3 kun have 1 fejl, da hoppet første gang forudsiges som taget, hvorfor træfsikkerheden er 8 + 8 + 9 9 = 97 ud af 110 mulige (88%). 3.7.3 Model 3: Hopforudsiger med 2-bit hophistorie Denne model er i de givne eksempler lige så effektiv som den dynamiske forudsiger, da der på intet tidspunkt er et hop der ikke tages, to gange i træk. I eksempel 3 vil den inderste BNE blive nedgraderet til 10, for derefter at blive opgraderet til 11 igen (som vist på figur 3). En 2-bit hopforudsiger opfører sig derfor på samme måde som den dynamiske, dog af en anden grund. Denne model kan endvidere lære at et hop der tidligere har været taget, ikke længere skal tages. Det formår den dynamiske ikke, men den er til gengæld mere stædig, hvilket kan være en fordel. 3.8 Det valgte design Da det ikke er fuldkommen klart om en dynamisk eller 2-bit forudsiger er den mest effektive, har vi implementeret begge, og målt på dem med de benchmarks der er udleveret. Resultatet heraf kan ses i afsnit 5.1.1 15

4 Implementation Dette afsnit har til hensigt at give et overblik over vores implementation, således at læseren ved hvor i kildekoden implementationsdetaljer skal findes. Desuden vil vi kort gennemgå vores konventioner samt de programmer og versioner af samme, som kildekoden er rettet imod. 4.1 Kildekode Kildekoden er skrevet i Kreds v. 2.0.8. Komponenter er i videst muligt omfang blevet kaldt det samme som i foregående afsnit, [3] og på diagrammerne (se appendiks A). Kommentarer er regelmæssige og på dansk, hvilket kombineret med Kreds nærmest symbolske syntaks, gør koden selvforklarende. Implementationen af vores mikroarkitektur er opdelt i filer - en for hver af de større enheder, der også lægger navn til filerne. Alle filerne kan findes i appendiks H samt på elektronisk form i di030298/k11. 16

5 Analyse af ydelse Vi vil i dette afsnit undersøge ydelsen af vores arkitektur. Dette vil vi gøre ved at se på, hvor hurtigt den afvikler en række programmer (benchmarks). Desuden vil vi se på den kritiske vej og om denne kan afkortes, således at clockfrekvensen bliver højere. 5.1 Benchmarks Før vi måler ydelsen af den endelige arkitektur, vil vi først undersøge effektiviteten af de diskuterede hopforudsigere, således at den optimale kan vælges. 5.1.1 Hopforudsiger-benchmarks For at bestemme hvilken hopforudsiger, der er mest effektiv, har vi kørt de udleverede benchmarks på en version, hvor hopforudsigeren har dynamisk indlæring, en version med 2-bit hophistorie og en arkitektur hvor hopforudsigeren er fjernet. Vi har derefter udregnet træfsikkerheden for forgreningsinstruktioner (BEQ, BNE), da disse instruktioner er de eneste interessante. Ved J og JAL er adressen kendt efter første besøg, og den ændres ikke medmindre der er tale om selvmodificerende kode, hvilket under alle omstændigheder er dårligt for ydelsen på en moderne arkitektur [2, 2.36]. Ved JR har man kun en ringe chance for at gætte rigtigt, da den samme stump kode typisk kaldes fra flere forskellige steder. Hyppigheden af BNE og BEQ er desuden højere end for de resterende hop-instruktioner tilsammen! Resultatet af kørslen ses i appendix D. Der er et antal interessante ting at bemærke om resultaterne. Begge hopforudsigere er virkelig effektive (> 99%) i AsmBsort og AsmCopy. Disse benchmarks indeholder en håndfuld hopinstruktioner der tages gang på gang. Der ses en forbedring på en faktor 20 eller mere, i forhold til ikke at bruge en hopforudsiger. Ved to benchmarks - fib1 og AsmFib, er der ingen forskel på hvorvidt der bruges hopforudsiger eller ej. Dette skyldes sandsynligvis at disse programmer indeholder hop der tages hver anden gang, eller i et tilfældigt mønster. Enhver hopforudsiger vil have svært ved den situation. Kun i ét tilfælde var det tydeligt ugunstigt at bruge en hopforudsiger. Benchmarket AsmScatter er lavet med henblik på at stresse cachen til hukommelsen 3, men det viser sig at den også stresser hopforudsigeren. Der er ingen nævneværdig forskel på den dynamiske- og 2-bits forudsigeren i gennemsnit, eller i bedste benchmark. Til gengæld kan 2-bit forudsigeren ikke klare Asm- Scatter hvor den scorer 2%, hvilket ca. er en faktor 30 ringere end ikke at forudsige hop. Alene af denne grund udpeges den dynamiske hopforudsiger som vinder. På denne baggrund benyttes den dynamiske hopforudsiger i vores løsning. 3 Ifølge den tilhørende README-fil 17

5.1.2 Obligatoriske benchmarks Kørslerne af de obligatoriske benchmarks er opsummeret i følgende tabel. Udskrifter er placeret i appendiks F, hvor også udskrifter fra programmet mips kan findes. Sidstnævnte indeholder bla. opgørelser over hvor mange gange hver instruktion er blevet udført. Program Simuleret køretid Antal clockcykler Antal instruktioner CPI AsmBsort 1.013,87µs 808.680 797.553 1,014 AsmCopy 205,907µs 164.234 76.453 2,148 AsmFib 400,876µs 319.744 218.908 1,461 AsmQsort 466,489µs 372.078 244.189 1,524 AsmScatter 314,261µs 250.659 144.183 1,738 fac1 15,5276µs 12.385 9.034 1,371 fib1 605,657µs 483.080 394.047 1,226 mergesort1 1120,34µs 893.597 388.929 2,298 primes1 955,915µs 762.451 150.533 5,065 Vi har ikke mulighed for at kommentere de simulerede køretider, da vi ikke har et sammenligningsgrundlag. Derimod er det interessant at bemærke variationen i CPI-værdierne. 5.1.3 Bemærkninger om CPI Eftersom de aritmetiske og logiske operationer har en CPI på én - hvis man tillægger bobler forårsaget af LW-hazards (se afs. 2.4.2) til LW - er det kun hop-instruktioner og hukommelsessystemet, der kan bringe CPI over én. Vi vil kommentere de to ekstremer samt et middeltilfælde. AsmBsort Det lave CPI for dette program vidner om at de relativt mange LW-instruktioner (33%) ikke stresser hukommelsessystemet. Dette er naturligt, eftersom der er tale om bubble-sort, der sammenligner data fra naboadresser, hvorved det udnyttes til fulde, at cachen er optimeret ift. spatial placering. Desuden er hopforudsigerens effektivitet for programmet tydelig, eftersom hop-instruktioner udgør 33%, uden at det bringer CPI væsentligt over én. AsmScatter Fra afsnit 5.1.1 ved vi at forgreningsforudsigelsen for dette program er dårlig (33,44% korrekte). CPI-bidraget fra BEQ og BNE er således (7620 + 15162) (1 33, 44% + 4 (100% 33, 44%)) 144183 = 0, 4735 De dårlige gæt kan altså ikke alene få CPI op på 1,738, hvilket stemmer overens med beskrivelsen af programmet 4 : Tilgang til lagerområder organiseret så de stresser 4 taget fra /usr/local/del1/dat1e/k1/benchmarks/readme på DIKU s system 18

cachens associativitet. Dvs. at det formentlig hovedsageligt er de 26,29% LW- og SW-instruktioner, der bringer CPI en op. primes1 Programmet stresser hukommelsessystemet i det ekstreme. Hvis vi udregner CPIbidraget fra de instruktioner, der ikke bruger hukommelsessystemet (vi ser bort fra den påvirkning hentning af instruktioner har) fås: 6755 4 + (9058 + 1998) (1 81, 77% + 4 (100% 81, 77%)) + 98755 150533 = 0, 9491 Her har vi brugt hopforudsiger-præcisionen fra afsnit 5.1.1 samt antaget at alle JRinstruktioner gættes forkert og at alle J/JAL-instruktioner gættes rigtigt. Sidstnævnte antagelser er ikke væsentlige for pointen, da instruktionerne udgør 16% af instruktionerne. Resten af CPI-værdien (5,065-0,9491=4,1159) kan kun komme fra hukommelsessystemet. Dvs. vi kan konkludere at programmet ikke udnytter cachens optimering ifm. spatial og temporal placering. 5.2 Kritisk vej Vi har undersøgt slack-diagrammet for vores arkitektur for at finde de steder, hvor en optimering vil have størst effekt på clockfrekvensen. Den kritiske vej i vores arkitektur er vejen fra PC til skriv-signalerne for grænserne ID/EX og EX/MEM. Denne vej går igennem hukommelsessystemet og SANC en. Da vi kan se, at der på en række af signalerne er en stor forsinkelse i udbredelsen, er vi nået frem til følgende steder, hvor signalvejen kan forkortes: PC Eftersom PC bliver brugt i flere forskellige signalveje, kan vi øge udbredelseshastigheden ved at dele PC en op. Denne optimering er implementeret i kredsløbet og vi har - ved at bruge en separat PC til hukommelsessystemet og en anden til resten af IF-fasen - opnået en forbedring på ca. 3MHz i clockfrekvensen. Grænserne Hvis vi kunne gøre grænserne mindre, dvs. føre færre linjer ind i dem, ville skriv-signalerne til dem opnå en højere udbredelseshastighed, da færre flip-flops skulle styres. Desværre er der ikke umiddelbart nogen signaler vi kan undvære i faserne, så her kan vi ikke optimere. Cachen holdandwait-flaget fra hukommelsessystemet er kritisk. Eftersom dette flag markerer, at det efterspurgte data ikke befinder sig i cachen, vil en hurtigere cache gøre dette signal tilgængeligt tidligere. For at gøre cachen hurtigere kan vi f.eks. give den en lavere associativitet, hvorved der skal vælges mellem data fra færre cache-banker. Endvidere er det muligt at de enkelte cache-banker kan gøres hurtigere ved en optimeret vægtning af blok-størrelse kontra antal bit i blok-mærkerne. 19

Hvis ovenstående optimeringer har en betydelig effekt, vil de ikke alene bringe clockfrekvensen voldsomt op, da signalvejen gennem ALU en er tæt på at være kritisk. Vores ALU er ikke specielt hurtig og der vil formentlig være en væsentlig gevinst ved at bruge noget af vores rigelige transistorbudget på at optimere den. En mulig forbedring kunne være at implementere et carry-select-skema i stedet for blot at bruge adder-komponenten fra Kreds. 20

6 Afprøvning Vi vil i dette afsnit diskutere, hvordan vores mikroarkitektur kan afprøves, så det overbevisende sandsynliggøres, at den er korrekt. 6.1 Strategi Vores afprøvning består af to dele: en intern og en ekstern. Den interne tager udgangspunkt i arkitekturen og de overvejelser vi har gjort os i forbindelse med designet og skal vise at problemstillingerne er løst korrekt. Den eksterne test skal vise at reelle programmer, som vi ikke har konstrueret, kan afvikles korrekt. Der er i opgaveteksten [6, p 3] refereret til en række testprogrammer, som vi vil lade udgøre den eksterne test. I resten af afsnittet vil vi derfor kun gennemgå den interne test. 6.1.1 Intern afprøvning I de følgende afsnit vil vi gennemgå de ting, der skal afprøves og opstille ækvivalensklasser. Det er ikke et krav i opgaveformuleringen, at arkitekturen skal kunne håndtere instruktioner, der er ugyldige eller ikke ligger i den mængde arkitekturen understøtter. Vi vil derfor ikke teste med sådanne instruktioner. Da vi således kun vil teste med instruktioner, som arkitekturen understøtter og da vi ikke forventer nogen fejlsituationer, vil vi samle alle tests i et program. Korrektheden af mikroarkitekturen afprøves ved hjælp af testprogrammet samt programmet mips 5. mips kan generere en sporfil (mips <program> 3 <sporfil>) ved kørslen af et program. Sporfilen indeholder information om hvilke data, der bliver skrevet til hvilke registre og adresser i hukommelsen og i hvilken rækkefølge det sker. Denne sporfil kan så sammenholdes med udførelsen af det pågældende program på vores arkitektur, ved at bruge parameteren -trace<sporfil>. I tilfælde af uoverensstemmelser mellem de to kørsler, vil simulationen komme med en fejlmeddelelse. 6.1.2 De enkelte instruktioner Som det første vil vi undersøge de enkelte instruktioner for sig. Det falder nok ikke direkte ind under en intern test, men vi mener det er berettiget, da de eksterne testprogrammer ikke nødvendigvis bruger alle instruktionerne. Ækvivalensklasser for tal Da alle I- og R-type instruktioner opererer på tal, vil vi først opdele de mulige tal i ækvivalensklasser og finde grænsetilfælde. Da indlejrede konstanter skal fortegns-forlænges for de aritmetiske operationer samt BEQ og BNE, men nul-forlænges for de logiske, skal der testes med både negative og positive indlejrede konstanter. 5 programmet findes på DIKU s system: dat1e/simsys/bin/i686-linux-redhat7.3/mips 21

De værdier, der kan være i registrene, vil vi ligeledes teste med både positive og negative tal. Vi har altså fire ækvivalensklasser for tal: positive/negative indlejrede konstanter og positive/negative tal fra registre. Grænsetilfælde indenfor disse klasser er henholdsvis: 0 og 32.767 (2 15 1), 1 og 32.768 ( 2 15 ), 0 og 2.147.483.647 (2 31 1), 1 og 2.147.483.648 ( 2 31 ). I-format (undtaget BEQ og BNE) I-type instruktioner udfører en operation på indholdet af et register og en indlejret konstant. Resultatet gemmes i et register. Vi antager at udførelsen af instruktionen ikke påvirkes af, hvilke registre der læses fra/skrives til (register $0 undtaget - det testes 6.1.5). Det er derfor blot interessant at vælge det data, som operationen udføres på. Hver af instruktionerne testes derfor på de 16 mulige kombinationer af de grænsetilfælde for tal, der er nævnt i foregående afsnit. For at kunne lave de meget store tal uden at skulle skrive flere tusinde linjer, bruges R-type instruktionen add inden den er testet. Fejl i denne kan gøre testen af I-type instruktionerne ikke testes korrekt, men vi forventer så at evt. fejl i add fanges i den specifikke afprøvning af add. R-format (undtaget JR) R-type instruktioner udfører en operation på indholdet af to registre og gemmer resultatet i et register. Vi tester på de 16 mulige kombinationer af grænsetilfælde for tal i registre på hver instruktion. Hop-instruktioner Hop-instruktioner kan ikke testes direkte vha. tracefilen, da deres funktion ikke er at ændre på registre/hukommelse (JAL undtaget). I stedet placeres instruktioner, der skriver til registre, de steder, hvor det kan forventes at hop-instruktionen fører hen. En forkert implementeret hop-instruktion må forventes at kunne føre til en hvilken som helst adresse, hvilket vi ikke kan teste. I stedet indsætter vi to forskellige registerpåvirkende instruktioner: lige efter hop-instruktionen og der hvor hop-instruktionen peger hen. For at kunne skelne er det vigtigt at hop-instruktionen ikke peger på den efterfølgende instruktion. Mindre oplagte fejl, der fører til andre steder i koden, vil med stor sandsynlighed ikke forårsage det samme spor som en korrekt afvikling og fejlen vil så blive opdaget. Det vil dog være svært at se hvilken instruktion, der forårsagede fejlen, men eftersom vi ikke forventer fejl i den endelige udgave, er det underordnet. BEQ/BNE Da BEQ og BNE læser fra to registre, tester vi med de i alt 16 muligheder for kombinationer af grænsetilfældene. J/JAL Disse instruktioner læser ikke fra nogen registre og vi vil derfor kun teste hver af dem med en værdi, jf. ovenstående generelle overvejelser om hop. 22

JR Ved at teste JAL før JR kan vi bruge JAL i testen af JR, hvilket gør det nemmere at indsætte en meningsfuld adresse i det register, som JR skal hoppe til. Det kan tænkes at arkitekturen kun understøtter hop til adresser i register $31, da dette er den oplagte anvendelse (ifm. JAL). Da instruktionen muliggør hop til adresser fra alle registre, testes - udover register $31 - også et vilkårligt af de andre registre. LW og SW Disse instruktioner kan - som de andre instruktioner, der bruger adresser - ikke testes med alle grænsetilfælde. Der testes derfor med adresser sammensat af det nedre grænsetilfælde (nul) for både indlejret konstant og registerværdi samt med vilkårlige ikkenul-værdier. Data kan testes med begge grænseværdier, 0 og 2 32. Samlet er det otte test af hver af de to instruktioner. 6.1.3 Forwarding Det skal testes at der forwardes korrekt mellem de forskellige faser. Hvordan testes forwarding Pga. hukommelsessystemet kan vi ikke være sikre på at instruktioner, der står lige efter hinanden i koden, kommer ind i pipelinen lige efter hinanden. For at opnå dette, udføres test-sekvenserne i løkker, således at instruktionerne bliver hentet til cachen. I det sidste gennemløb (måske før) vil instruktionerne i test-sekvensen komme ind i pipelinen lige efter hinanden og forwardingen vil blive testet. Hvilke ting skal testes Det skal testes at der kan forwardes både en, to og tre instruktioner frem. Desuden skal det testes at der ikke forwardes fra register $0. Vi antager at det ikke har betydning, hvilken instruktion der er tale om og tester derfor blot vilkårlige instruktioner. 6.1.4 Hazards Der er som nævnt i afsnit 2.5 to slags hazards i vores design: fejlforudsigelser og resten. Fejlforudsigelser testes ved en separat test-kørsel, hvor hop-forudsigeren altid foreslår adresse FFFFFFFF 16. Test af LW-hazarden forudsætter at instruktionerne kommer ind i pipelinen lige efter hinanden, hvorfor vi udfører dem i løkker - jf. diskussionen om test af hop-instruktioner. SW-hazarden testes ligeledes i en løkke. Ved hvert gennemløb skrives en ændret instruktion til den samme adresse inden i løkken, hvorved vi i (de) sidste gennemløb vil få testet SW-hazarden. Vi forventer ikke at det har nogen betydning, hvilken type instruktion, der ændres - den skal blot have en effekt på enten hukommelsen eller et register, så den kan spores. Da det er nemmest at ændre en I-format instruktion i en løkke (læg en lille konstant til) bruger vi addi. 23

6.1.5 Beskyttelse af register $0 Det skal testes at det ikke er muligt at skrive til register $0. Hvilken instruktion, der er tale om og hvilket data, der forsøges skrevet er ikke interessant. Vi prøver derfor med en addi-instruktion. 6.2 Resultater Vi har konstrueret et assemblerprogram ud fra ovenstående kriterier. Programmet kan ses i appendiks C.1 og rækkefølgen af tests følger ovenstående afsnit. Fejlforudsigelser er testet med samme program, men i en udgave af mikroarkitekturen, hvor mikroarkitekturen som sagt er ændret til at foreslå FFFFFFFF 16 hele tiden. Den modificerede udgave af pipelined.k (pipelined-miss.k) kan ses i appendiks C.4. Udskrifter fra afviklingen af såvel den interne som de eksterne tests, kan ses i appendiks C. Alle tests afvikledes korrekt. 24

7 Litteratur [1] Intel Corporation. IA-32 Intel Architecture Software Developers Manual, 1997-2002. [2] Intel Corporation. Intel Pentium 4 and Intel Xeon Processor Optimization Reference Manual, 2001. [3] David A. Patterson and John L. Hennessy. Computer organization and design : the hardware/software interface. Morgan Kaufmann Publishers, Inc., second edition, 1997. [4] Signe Reuss and Martin Zachariasen. Datalogi 1E, kursusbog 2003: Kreds. Number 3 in 4. HCØ Tryk, 2003. [5] Martin Zachariasen. En enkelt/dobbelt-cyklus mikroarkitektur. Dat1E godkendelsesopgave 2, oktober 2003. [6] Martin Zachariasen. En pipelinet mikroarkitektur. Dat1E karakteropgave 1-1, november 2003. 25

A Diagrammer A.1 Pipeline 26

A.2 Hopforudsiger 27

A.3 Styrelogik til hopforudsiger 28

A.4 Hopcache-register B Delayed branching From: "Martin Zachariasen" <martinz@diku.dk> To: "Rune Højsgaard" <rune@hojsgaard.dk> Sent: Monday, November 10, 2003 9:02 AM Subject: Re: Delayed branch Hej Rune Det var kun nogle ældre versioner af MIPS som benyttede delay branching. Det bliver slet ikke benyttet i vores simulatorer - og iøvrigt på dette kursus. Mvh. Martin On Sat, 8 Nov 2003, Rune Højsgaard wrote: > Hej, > > Vi undrede os over at COD på s. 350 nævner at MIPS bruger delayed > branching, da dette ikke er nævnt i hverken G2 eller K11. Det viser sig > at mips-programmet [1] på DIKU s system ikke lever op til dette, hvilket > følgende kørsel viser: > > syn G2$ mips /usr/local/del1/dat1e/g2/logtst.hex 2 > > 00000000 : 20018080 ADDI $1,$0,8080 $1 <- FFFF8080 > 00000004 : 34210808 ORI $1,$1,808 $1 <- FFFF8888 > 00000008 : 30218800 ANDI $1,$1,8800 $1 <- 00008800 29

> 0000000C : 20218800 ADDI $1,$1,8800 $1 <- 00001000 > 00000010 : 10010002 BEQ $0,$1,2 > 00000014 : 3021EFFF ANDI $1,$1,EFFF $1 <- 00000000 > 00000018 : 10010003 BEQ $0,$1,3 PC <- 00000028 > --- > 00000028 : 20210001 ADDI $1,$1,1 $1 <- 00000001 > 0000002C : AC01FFF4 SW $1,FFF4($0) OUT[FFFFFFF4] : 000000011 > 00000030 : AC01FFFC SW $1,FFFC($0) OUT[FFFFFFFC] : 00000001 > > 00000034 : FC000000 STOP > > [...] > > BEQ-instruktionen ved adresse 0x18 efterfølges af en SW-instruktion, der burde blive udført. > Men nej - er det en fejl eller en feature (og skal vi eftergøre det)? > > [1] /usr/local/del1/dat1e/simsys/bin/i686-linux-redhat7.3/mips > > MVH Espen, Rune & Christian > > > --- > Outgoing mail is certified Virus Free. > Checked by AVG anti-virus system (http:www.grisoft.com). > Version: 6.0.536 / Virus Database: 331 - Release Date: 03-11-2003 30

C Afprøvning Herunder følger afprøvningsprogrammet samt udskrifter fra kørslerne af testprogrammerne. Filerne kan findes i mappen di030298/k11 på DIKU s system. C.1 test.asm Følgende er programmet til intern test: ; Tilføj / fjen _ ikke _ instruktioner FØR testen ; af selmodificerende kode! ; Addressen på instruktionen som skal ændres ; er hard - codet. ; De store tal 2. 147. 483. 647 og -2. 147. 483.648, der ; ikke kan skrives direkte, gemmes i henholdsvis ; register $11 og $10 addi $10, $0, 32767 addi $10, $10, 1 ; 2^15 add $10, $10, $10 ; 2^16 add $10, $10, $10 ; 2^17 add $10, $10, $10 ; 2^18 add $10, $10, $10 ; 2^19 add $10, $10, $10 ; 2^20 add $10, $10, $10 ; 2^21 add $10, $10, $10 ; 2^22 add $10, $10, $10 ; 2^23 add $10, $10, $10 ; 2^24 add $10, $10, $10 ; 2^25 add $10, $10, $10 ; 2^26 add $10, $10, $10 ; 2^27 add $10, $10, $10 ; 2^28 add $10, $10, $10 ; 2^29 add $10, $10, $10 ; 2^30 add $10, $10, $10 ; -2^31 = -2. 147. 483. 648 addi $11, $10, -1 ; 2^31-1 = 2. 147. 483. 647 ; Værdien -1 gemmes i register $12 addi $12, $0, -1 ; ---------------------------------------- ; Afprøvning af de enkelte instruktioner ;; I- format addi $1, $0, 0 ; Registerværdi = 0 addi $1, $0, -1 addi $1, $0, -32768 addi $1, $0, 32767 addi $1, $11, 0 ; Registerværdi = 2. 147. 483. 647 addi $1, $11, -1 addi $1, $11, -32768 addi $1, $11, 32767 addi $1, $12, 0 ; Registerværdi = -1 addi $1, $12, -1 addi $1, $12, -32768 addi $1, $12, 32767 addi $1, $10, 0 ; Registerværdi = -2. 147. 483. 648 addi $1, $10, -1 addi $1, $10, -32768 addi $1, $10, 32767 slti $1, $0, 0 ; Registerværdi = 0 slti $1, $0, -1 slti $1, $0, -32768 31

slti $1, $0, 32767 slti $1, $11, 0 ; Registerværdi = 2. 147. 483. 647 slti $1, $11, -1 slti $1, $11, -32768 slti $1, $11, 32767 slti $1, $12, 0 ; Registerværdi = -1 slti $1, $12, -1 slti $1, $12, -32768 slti $1, $12, 32767 slti $1, $10, 0 ; Registerværdi = -2. 147. 483. 648 slti $1, $10, -1 slti $1, $10, -32768 slti $1, $10, 32767 andi $1, $0, 0 ; Registerværdi = 0 andi $1, $0, -1 andi $1, $0, -32768 andi $1, $0, 32767 andi $1, $11, 0 ; Registerværdi = 2. 147. 483. 647 andi $1, $11, -1 andi $1, $11, -32768 andi $1, $11, 32767 andi $1, $12, 0 ; Registerværdi = -1 andi $1, $12, -1 andi $1, $12, -32768 andi $1, $12, 32767 andi $1, $10, 0 ; Registerværdi = -2. 147. 483. 648 andi $1, $10, -1 andi $1, $10, -32768 andi $1, $10, 32767 ori $1, $0, 0 ; Registerværdi = 0 ori $1, $0, -1 ori $1, $0, -32768 ori $1, $0, 32767 ori $1, $11, 0 ; Registerværdi = 2. 147. 483. 647 ori $1, $11, -1 ori $1, $11, -32768 ori $1, $11, 32767 ori $1, $12, 0 ; Registerværdi = -1 ori $1, $12, -1 ori $1, $12, -32768 ori $1, $12, 32767 ori $1, $10, 0 ; Registerværdi = -2. 147. 483. 648 ori $1, $10, -1 ori $1, $10, -32768 ori $1, $10, 32767 ;; R- format register 1: register 2: add $1, $0, $0 ; 0 0 add $1, $0, $11 ; 0 2. 147. 483. 647 add $1, $0, $12 ; 0-1 add $1, $0, $10 ; 0-2. 147. 483. 648 add $1, $11, $0 ; 2. 147. 483. 647 0 add $1, $11, $11 ; 2. 147. 483. 647 2. 147. 483. 647 add $1, $11, $12 ; 2. 147. 483. 647-1 add $1, $11, $10 ; 2. 147. 483. 647-2. 147. 483. 648 add $1, $12, $0 ; -1 0 add $1, $12, $11 ; -1 2. 147. 483. 647 add $1, $12, $12 ; -1-1 add $1, $12, $10 ; -1-2. 147. 483. 648 add $1, $10, $0 ; -2. 147. 483. 648 0 add $1, $10, $11 ; -2. 147. 483. 648 2. 147. 483. 647 add $1, $10, $12 ; -2. 147. 483. 648-1 add $1, $10, $10 ; -2. 147. 483. 648-2. 147. 483. 648 sub $1, $0, $0 ; 0 0 sub $1, $0, $11 ; 0 2. 147. 483. 647 32

sub $1, $0, $12 ; 0-1 sub $1, $0, $10 ; 0-2. 147. 483. 648 sub $1, $11, $0 ; 2. 147. 483. 647 0 sub $1, $11, $11 ; 2. 147. 483. 647 2. 147. 483. 647 sub $1, $11, $12 ; 2. 147. 483. 647-1 sub $1, $11, $10 ; 2. 147. 483. 647-2. 147. 483. 648 sub $1, $12, $0 ; -1 0 sub $1, $12, $11 ; -1 2. 147. 483. 647 sub $1, $12, $12 ; -1-1 sub $1, $12, $10 ; -1-2. 147. 483. 648 sub $1, $10, $0 ; -2. 147. 483. 648 0 sub $1, $10, $11 ; -2. 147. 483. 648 2. 147. 483. 647 sub $1, $10, $12 ; -2. 147. 483. 648-1 sub $1, $10, $10 ; -2. 147. 483. 648-2. 147. 483. 648 slt $1, $0, $0 ; 0 0 slt $1, $0, $11 ; 0 2. 147. 483. 647 slt $1, $0, $12 ; 0-1 slt $1, $0, $10 ; 0-2. 147. 483. 648 slt $1, $11, $0 ; 2. 147. 483. 647 0 slt $1, $11, $11 ; 2. 147. 483. 647 2. 147. 483. 647 slt $1, $11, $12 ; 2. 147. 483. 647-1 slt $1, $11, $10 ; 2. 147. 483. 647-2. 147. 483. 648 slt $1, $12, $0 ; -1 0 slt $1, $12, $11 ; -1 2. 147. 483. 647 slt $1, $12, $12 ; -1-1 slt $1, $12, $10 ; -1-2. 147. 483. 648 slt $1, $10, $0 ; -2. 147. 483. 648 0 slt $1, $10, $11 ; -2. 147. 483. 648 2. 147. 483. 647 slt $1, $10, $12 ; -2. 147. 483. 648-1 slt $1, $10, $10 ; -2. 147. 483. 648-2. 147. 483. 648 and $1, $0, $0 ; 0 0 and $1, $0, $11 ; 0 2. 147. 483. 647 and $1, $0, $12 ; 0-1 and $1, $0, $10 ; 0-2. 147. 483. 648 and $1, $11, $0 ; 2. 147. 483. 647 0 and $1, $11, $11 ; 2. 147. 483. 647 2. 147. 483. 647 and $1, $11, $12 ; 2. 147. 483. 647-1 and $1, $11, $10 ; 2. 147. 483. 647-2. 147. 483. 648 and $1, $12, $0 ; -1 0 and $1, $12, $11 ; -1 2. 147. 483. 647 and $1, $12, $12 ; -1-1 and $1, $12, $10 ; -1-2. 147. 483. 648 and $1, $10, $0 ; -2. 147. 483. 648 0 and $1, $10, $11 ; -2. 147. 483. 648 2. 147. 483. 647 and $1, $10, $12 ; -2. 147. 483. 648-1 and $1, $10, $10 ; -2. 147. 483. 648-2. 147. 483. 648 or $1, $0, $0 ; 0 0 or $1, $0, $11 ; 0 2. 147. 483. 647 or $1, $0, $12 ; 0-1 or $1, $0, $10 ; 0-2. 147. 483. 648 or $1, $11, $0 ; 2. 147. 483. 647 0 or $1, $11, $11 ; 2. 147. 483. 647 2. 147. 483. 647 or $1, $11, $12 ; 2. 147. 483. 647-1 or $1, $11, $10 ; 2. 147. 483. 647-2. 147. 483. 648 or $1, $12, $0 ; -1 0 or $1, $12, $11 ; -1 2. 147. 483. 647 or $1, $12, $12 ; -1-1 or $1, $12, $10 ; -1-2. 147. 483. 648 or $1, $10, $0 ; -2. 147. 483. 648 0 or $1, $10, $11 ; -2. 147. 483. 648 2. 147. 483. 647 or $1, $10, $12 ; -2. 147. 483. 648-1 or $1, $10, $10 ; -2. 147. 483. 648-2. 147. 483. 648 ;; BEQ 33

beq $0, $0, BEQ1 ; 0 0 addi $1, $0, 1 BEQ1 : addi $1, $0, 2 beq $0, $11, BEQ2 ; 0 2. 147. 483. 647 addi $1, $0, 3 BEQ2 : addi $1, $0, 4 beq $0, $12, BEQ3 ; 0-1 addi $1, $0, 5 BEQ3 : addi $1, $0, 6 beq $0, $10, BEQ4 ; 0-2. 147. 483. 648 addi $1, $0, 7 BEQ4 : addi $1, $0, 8 beq $11, $0, BEQ5 ; 2. 147. 483. 647 0 addi $1, $0, 9 BEQ5 : addi $1, $0, 10 beq $11, $11, BEQ6 ; 2. 147. 483. 647 2. 147. 483. 647 addi $1, $0, 11 BEQ6 : addi $1, $0, 12 beq $11, $12, BEQ7 ; 2. 147. 483. 647-1 addi $1, $0, 13 BEQ7 : addi $1, $0, 14 beq $11, $10, BEQ8 ; 2. 147. 483. 647-2. 147. 483. 648 addi $1, $0, 15 BEQ8 : addi $1, $0, 16 beq $12, $0, BEQ9 ; -1 0 addi $1, $0, 17 BEQ9 : addi $1, $0, 18 beq $12, $11, BEQ10 ; -1 2. 147. 483. 647 addi $1, $0, 19 BEQ10 : addi $1, $0, 20 beq $12, $12, BEQ11 ; -1-1 addi $1, $0, 21 BEQ11 : addi $1, $0, 22 beq $12, $10, BEQ12 ; -1-2. 147. 483. 648 addi $1, $0, 23 BEQ12 : addi $1, $0, 24 beq $10, $0, BEQ13 ; -2. 147. 483. 648 0 addi $1, $0, 25 BEQ13 : addi $1, $0, 26 beq $10, $11, BEQ14 ; -2. 147. 483. 648 2. 147. 483. 647 addi $1, $0, 27 BEQ14 : addi $1, $0, 28 beq $10, $12, BEQ15 ; -2. 147. 483. 648-1 addi $1, $0, 29 BEQ15 : addi $1, $0, 30 beq $10, $10, BEQ16 ; -2. 147. 483. 648-2. 147. 483. 648 addi $1, $0, 31 BEQ16 : addi $1, $0, 32 ;; BNE bne $0, $0, BNE1 ; 0 0 addi $1, $0, 1 BNE1 : addi $1, $0, 2 bne $0, $11, BNE2 ; 0 2. 147. 483. 647 addi $1, $0, 3 BNE2 : addi $1, $0, 4 bne $0, $12, BNE3 ; 0-1 addi $1, $0, 5 BNE3 : addi $1, $0, 6 bne $0, $10, BNE4 ; 0-2. 147. 483. 648 addi $1, $0, 7 BNE4 : addi $1, $0, 8 bne $11, $0, BNE5 ; 2. 147. 483. 647 0 addi $1, $0, 9 34

BNE5 : addi $1, $0, 10 bne $11, $11, BNE6 ; 2. 147. 483. 647 2. 147. 483. 647 addi $1, $0, 11 BNE6 : addi $1, $0, 12 bne $11, $12, BNE7 ; 2. 147. 483. 647-1 addi $1, $0, 13 BNE7 : addi $1, $0, 14 bne $11, $10, BNE8 ; 2. 147. 483. 647-2. 147. 483. 648 addi $1, $0, 15 BNE8 : addi $1, $0, 16 bne $12, $0, BNE9 ; -1 0 addi $1, $0, 17 BNE9 : addi $1, $0, 18 bne $12, $11, BNE10 ; -1 2. 147. 483. 647 addi $1, $0, 19 BNE10 : addi $1, $0, 20 bne $12, $12, BNE11 ; -1-1 addi $1, $0, 21 BNE11 : addi $1, $0, 22 bne $12, $10, BNE12 ; -1-2. 147. 483. 648 addi $1, $0, 23 BNE12 : addi $1, $0, 24 bne $10, $0, BNE13 ; -2. 147. 483. 648 0 addi $1, $0, 25 BNE13 : addi $1, $0, 26 bne $10, $11, BNE14 ; -2. 147. 483. 648 2. 147. 483. 647 addi $1, $0, 27 BNE14 : addi $1, $0, 28 bne $10, $12, BNE15 ; -2. 147. 483. 648-1 addi $1, $0, 29 BNE15 : addi $1, $0, 30 bne $10, $10, BNE16 ; -2. 147. 483. 648-2. 147. 483. 648 addi $1, $0, 31 BNE16 : addi $1, $0, 32 ;; J j J1 addi $1, $0, 1 J1: addi $1, $0, 2 ;; JAL jal JAL1 addi $1, $0, 1 JAL1 : addi $1, $0, 2 ;; JR jal JR1 addi $1, $0, 1 j JR2 JR1 : jr $31 ; register $31 addi $1, $0, 2 JR2 : addi $1, $0, 3 jal JR3 addi $1, $0, 4 j JR4 JR3 : addi $1, $31, 0 jr $1 ; register $1 addi $1, $0, 5 JR4 : addi $1, $0, 6 ;; SW data konstant register sw $0, 0( $0) ; 0 0 0 sw $12, 0( $0) ; 2^{ 32} 0 0 sw $0, 4( $0) ; 0 4 0 sw $12, 12( $0) ; 2^{ 32} 12 0 35

addi $1, $0, 4 sw $0, 0( $1) ; 0 0 4 addi $1, $0, 12 sw $12, 0( $1) ; 2^{ 32} 0 12 addi $1, $0, 20 sw $0, 4( $1) ; 0 4 20 addi $1, $0, 32 sw $12, 12( $1) ; 2^{ 32} 12 32 ;; LW data konstant register sw $0, 0( $0) lw $1, 0( $0) ; 0 0 0 sw $12, 0( $0) lw $1, 0( $0) ; 2^{ 32} 0 0 sw $0, 4( $0) lw $1, 4( $0) ; 0 4 0 sw $12, 12( $0) lw $1, 12( $0) ; 2^{ 32} 12 0 addi $1, $0, 4 sw $0, 0( $1) lw $1, 0( $1) ; 0 0 4 addi $1, $0, 12 sw $12, 0( $1) lw $1, 0( $1) ; 2^{ 32} 0 12 addi $1, $0, 20 sw $0, 4( $1) lw $1, 4( $1) ; 0 4 20 addi $1, $0, 32 sw $12, 12( $1) lw $1, 12( $1) ; 2^{ 32} 12 32 ;; Forwarding ;; register $0 addi $2, $0, 25 ; i=25 LOOP1 : addi $0, $1, 5 slti $0, $1, 6 ori $0, $1, 7 add $1, $0, $0 addi $2, $2, -1 ; i-- bne $2, $0, LOOP1 ; while i >0 ;; register $20 addi $2, $0, 25 ; i=25 LOOP2 : add $20, $1, $2 sub $20, $1, $2 slt $20, $1, $2 add $1, $20, $20 addi $2, $2, -1 ; i-- bne $2, $0, LOOP2 ; while i >0 ;; Hazards ;; LW addi $2, $0, 100 ; i= 100 LOOP3 : LW $1, 0( $2) add $3, $1, $1 addi $2, $2, -4 ; i- =4 bne $2, $0, LOOP3 ; while i >0 ;; SW addi $4, $0, 25 ; i=25 addi $3, $0, 0 x53c ; adressen på addi - instruktionen lw $2, 0( $3) ; $2 <- addi $1, $0, 0 LOOP4 : addi $2, $2, 1 ; øg konstanten med 1 sw $2, 0( $3) ; skriv den nye instruktion addi $1, $0, 0 ; udgangspunktet 36

addi $4, $4, -1 ; i-- bne $4, $0, LOOP4 ; while i >0 ;; Beskyttelse af register $0 addi $0, $0, 5 stop C.2 Afvikling af afprøvning Afprøvningen er afviklet med følgende shell-script (afproev.sh): #!/ bin / bash PATH =/ usr / local / del1 / dat1e / SimSys / bin /i686 - linux - redhat7.3:${ PATH } cd ~ di030298 / K11 masm test. asm mips test. hex 3 test. trc./ pipelined -bp - memfile test. hex - tracetest. trc ln -s ~ dat1e /G2/fib. hex fib. hex ln -s ~ dat1e /G2/fib. trc fib. trc./ pipelined -bp - memfile fib. hex - tracefib. trc ln -s ~ dat1e /G2/ logtst. hex logtst. hex ln -s ~ dat1e /G2/ logtst. trc logtst. trc./ pipelined -bp - memfile logtst. hex - tracelogtst. trc ln -s ~ dat1e /G2/ scatter. hex scatter. hex ln -s ~ dat1e /G2/ scatter. trc scatter. trc./ pipelined -bp - memfile scatter. hex - tracescatter. trc ln -s ~ dat1e /G2/ slttest. hex slttest. hex ln -s ~ dat1e /G2/ slttest. trc slttest. trc./ pipelined -bp - memfile slttest. hex - traceslttest. trc ln -s ~ dat1e /G2/ sort. hex sort. hex ln -s ~ dat1e /G2/ sort. trc sort. trc ln -s ~ dat1e /G2/ sort.in sort.in./ pipelined -bp - memfile sort. hex - tracesort. trc <sort.in./ pipelined - miss - memfile test. hex - tracetest. trc C.3 Udskrift af kørsel Følgende er outputtet fra kørslen af ovenstående shell-script: Assembly finished, 0 errors Total passes = 2 Program size = 0 x154 words. hex file = " test. hex ". lst file = " test. lst " (6 pages ) This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. 37

Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 2. 73441 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 1. 08699 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 0. 252002 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 7. 69169 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 0. 580482 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. 38

--------- SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 1. 00174 micro - seconds. --------- This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- SimSys : Estimating resource usage : 31730 transistors @ 797. 614 MHz --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : Elapsed time ( simulated ): 4. 10349 micro - seconds. --------- C.4 pipelined-miss.k Implementation a f p i p e l i n e d m i k r o a r k i t e k t u r. Argumentet " p r e d i c t o r " a n g i v e r om p r e d i c t o r e n s k a l s l å s t i l. t r u e => a r k i t e k t u r e n f o r s ø g e r at gætte næste i n s t r u k t i o n f a l s e => a r k i t e k t u r e n " gætter " a l t i d på FFFFFFFF main ( predictor ) Diagrammet implementeres f r a v e n s t r e mod højre, s t a r t e n d e ved IF f a s e n IF f a s e n Der l æ s e s a l t i d i n s t r u k t i o n e r : PC1 { WrEnFlipFlop 32 0} >> [ iaddrin ] mem { MemIOSys 7 5 5 100 3 0}; 1{1} >> [ ird ] mem ; Send data t i l hazard og m i s p r e d i c t i o n enhederne PC{ WrEnFlipFlop 32 0} >> [ IF_PC ] HDU { HazardDetectionUnit }, [ IF_PC ] MDU { MispredictionUnit }; PC+4 PC 4{32} 0{1} >> PCPlus4 { Adder 32}[ cout ] >> _ {1}; Med/uden f o r u d s i g e l s e if predictor then BranchController {16 8}; PC >> [ PC] BranchController ; PCPlus4 [ sum ] >> [ PC4 ] BranchController ; MDU [ JumpData_Valid ] >> [ JumpData_Valid ] BranchController ; MDU [ JumpData_Correct ] >> [ JumpData_Correct ] BranchController ; MDU [ JumpData_Addr ] >> [ JumpData_Addr ] BranchController ; MDU [ JumpData_Follow ] >> [ JumpData_Follow ] BranchController ; MDU [ JumpRegData_Valid ] >> [ JumpRegData_Valid ] BranchController ; MDU [ JumpRegData_Correct ] >> [ JumpRegData_Correct ] BranchController ; MDU [ JumpRegData_Addr ] >> [ JumpRegData_Addr ] BranchController ; MDU [ JumpRegData_Follow ] >> [ JumpRegData_Follow ] BranchController ; MDU [ BranchData_Valid ] >> [ BranchData_Valid ] BranchController ; MDU [ BranchData_Correct ] >> [ BranchData_Correct ] BranchController ; 39

MDU [ BranchData_Addr ] >> [ BranchData_Addr ] BranchController ; MDU [ BranchData_Follow ] >> [ BranchData_Follow ] BranchController ; BranchController >> [ in :191..160] PCMux ; else Før den s t ø r s t mulige a d r e s s e ind som gæt 65535{16} 65535{16} >> [ in :191..160] PCMux ; Drain feedback l i n j e r n e MDU [ JumpData_Valid ] MDU [ JumpData_Correct ] MDU [ JumpData_Addr ] MDU [ JumpData_Follow ] MDU [ JumpRegData_Valid ] MDU [ JumpRegData_Correct ] MDU [ JumpRegData_Addr ] MDU [ JumpRegData_Follow ] MDU [ BranchData_Valid ] MDU [ BranchData_Correct ] MDU [ BranchData_Addr ] MDU [ BranchData_Follow ] >> _ {198}; end ; / MDU[ JumpData_Correct ] MDU[ JumpRegData_Correct ] MDU[ BranchData_Correct ] MDU[ JumpData_Valid ] MDU[ JumpRegData_Valid ] MDU[ BranchData_Valid ] / 1{1} Misses (( MDU [ JumpData_Correct ] >> #{ Not }) MDU [ JumpData_Valid ] >> #{ And 2}) (( MDU [ JumpRegData_Correct ] >> #{ Not }) MDU [ JumpRegData_Valid ] >> #{ And 2}) (( MDU [ BranchData_Correct ] >> #{ Not }) MDU [ BranchData_Valid ] >> #{ And 2}) Hits ( MDU [ JumpData_Correct ] MDU [ JumpData_Valid ] >> #{ And 2}) ( MDU [ JumpRegData_Correct ] MDU [ JumpRegData_Valid ] >> #{ And 2}) ( MDU [ BranchData_Correct ] MDU [ BranchData_Valid ] >> #{ And 2}) >> [ count ] SimSysCtrl {7}; Før l i n j e r ind i IF/ID grænsen PC >> [ PC] IF_ID { PipeStageBoundary SANC [ IF_ID_Write ]}; PCPlus4 [ sum ] >> [ PCPlus4 ] IF_ID ; mem [ idataout ] >> zif_id { ZapBoundary SANC [ IF_ID_Zap ]} >> [ inst ] IF_ID ; Stop s i m u l a t i o n e n når i n s t r u k t i o n e n FC000000 når MEM f a s e n mem [ idataout :31..26] >> #{ And 6} >> zif_id2 { ZapBoundary SANC [ IF_ID_Zap ]} >> {1} >> [ stop ] IF_ID ; IF_ID [ stop ] >> {1} >> zid_ex11 { ZapBoundary SANC [ ID_EX_Zap ]} >> {1} >> [ stop ] ID_EX ; ID_EX [ stop ] >> {1} >> zex_mem9 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ stop ] EX_MEM ; EX_MEM [ stop ] >> [ stop ] SimSysCtrl ; ID f a s e n Send data t i l HDU en og MDU en IF_ID [PC] >> ( [ ID_PC ]HDU, [ ID_PC ] MDU ); IF_ID [ inst :31..26] >> [ ID_Opcode ] HDU ; IF_ID [ inst :5..0] >> [ ID_Func ] HDU ; Lav c o n t r o l s i g n a l e r n e IF_ID [ inst :31..26] IF_ID [ inst :5..0] >> ID_Control ; Sæt r e g i s t r e n e op Læs data IF_ID [ inst :25..21] 40

>> [ rdselect :4..0] regs { RegFile 1 2 5 32}[ rddata :31..0] >> [ Reg_ReadData1 ] FDU { ForwardDetectionUnit }; IF_ID [ inst :20..16] >> [ rdselect :9..5] regs [ rddata :63..32] >> [ Reg_ReadData2 ] FDU ; S k r i v Data MEM_WB [ destreg ] >> [ wrselect ]regs, [ idxin ]vw{ ValidateWrite 1 5 32 "r "}; Flag t i l b e s k y t t e l s e a f r e g i s t e r $0 MEM_WB [ destreg ] >> RegZapWrite { Or 5}; RegZapWrite >> [0] regwrite { And 2}; MEM_WB [ RegWrite ] >> [1] regwrite ; regwrite >> [ wrenable ]regs, [ wrenable ]vw; Muxen, der vælger mellem l æ s t data og PC+4/ALURes RegWriteMux { Mux 1 32} >> ( [ wrdata ]regs, [ Reg_WriteData ]FDU, [ datain ]vw ); Opsæt f o r warding d e t e c t i o n enheden Ind data IF_ID [ inst :25..16] >> [ ID_readReg1 ] FDU [ ID_readReg2 ] FDU ; ID_Control [ ALUSrc ] >> [ ID_ALUSrc ] FDU ; ID_EX [ destreg ] >> [ EX_destReg ] FDU ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] FDU ; ID_EX [ Link ] >> [ EX_Link ] FDU ; EX_MEM [ destreg ] >> [ MEM_destReg ] FDU ; EX_MEM [ RegWrite ] >> [ MEM_RegWrite ] FDU ; EX_MEM [ MemtoReg ] >> [ MEM_MemtoReg ] FDU ; MEM_WB [ destreg ] >> [ WB_destReg ] FDU ; MEM_WB [ RegWrite ] >> [ WB_RegWrite ] FDU ; Data t i l hazard d e t e c t i o n enheden FDU [ HDU_Reg1EXCompare ] FDU [ HDU_Reg2EXCompare ] >> [ Reg1Compare ] HDU [ Reg2Compare ] HDU ; Opsæt muxen, der vælger d e s t i n a t i o n s r e g i s t r e t 100 = l i n k 010 = i e l l e r lw i n s t r u k t i o n 001 = r e s t e n : ) ( ID_Control [ Link ] ID_Control [ RegDst ] )*2 >> {2} #{ Or 2} >> {2} #{ Not } >> [ select ] ID_destReg { FastMux 3 5}; 31{5} IF_ID [ inst :20..11] >> [ in] ID_destReg ; Sammensæt jump a d r e s s e og f ø r den ind i MDU en og PC muxen IF_ID [ PCPlus4 :31..28] IF_ID [ inst :25..0] 0{2} >> ( [ ID_JumpAddr ]MDU, [in :159..128] PCMux ); ID_Control [ Jump ] >> [ ID_Jump ] MDU ; Beregn branch a d r e s s e n IF_ID [ inst :15] ID_Control [ SignExt ] IF_ID [ inst :15..0] IF_ID [ PCPlus4 ] >> (#{ And 2})*14 {16} 0{2} {32} 0{1} >> ID_BranchAddr { Adder 32}[ cout ] >> _ {1}; Før den udvidede konstant ind i ID/EX grænsen IF_ID [ inst :15] ID_Control [ SignExt ] IF_ID [ inst :15..0] >> (#{ And 2})*16 {16} >> [ extimm ] ID_EX { PipeStageBoundary SANC [ ID_EX_Write ]}; Før r e s t e n a f l i n j e r n e ind i ID/EX grænsen IF_ID [ PC] >> {32} >> [ PC] ID_EX ; IF_ID [ PCPlus4 ] >> {32} >> [ PCPlus4 ] ID_EX ; ID_BranchAddr [ sum ] >> [ BranchAddr ] ID_EX ; ID_destReg >> [ destreg ] ID_EX ; FDU [ ALUMUXaSelect ] >> [ ALUMUXaSelect ] ID_EX ; 41

FDU [ ALUMUXbSelect ] >> [ ALUMUXbSelect ] ID_EX ; FDU [ SWMuxSelect ] >> [ SWMuxSelect ] ID_EX ; FDU [ regdata1 ] >> [ regdata1 ] ID_EX ; FDU [ regdata2 ] >> [ regdata2 ] ID_EX ; K o n t r o l l i n j e r n e s k a l kunne zappes ID_Control [ ALUOp ] >> zid_ex1 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ ALUOp ] ID_EX ; ID_Control [ Jump ] >> zid_ex2 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ Jump ] ID_EX ; ID_Control [ JumpReg ] >> zid_ex3 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ JumpReg ] ID_EX ; ID_Control [ BNE ] >> zid_ex4 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ BNE ] ID_EX ; ID_Control [ BEQ ] >> zid_ex5 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ BEQ ] ID_EX ; ID_Control [ MemWrite ] >> zid_ex6 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemWrite ] ID_EX ; ID_Control [ MemRead ] >> zid_ex7 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemRead ] ID_EX ; ID_Control [ Link ] >> zid_ex8 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ Link ] ID_EX ; ID_Control [ RegWrite ] >> zid_ex9 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ RegWrite ] ID_EX ; ID_Control [ MemtoReg ] >> zid_ex10 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemtoReg ] ID_EX ; EX f a s e n Send data t i l HDU en og MDU en ID_EX [ MemRead ] >> [ EX_MemRead ] HDU ; ID_EX [PC] >> ( [ EX_PC ]HDU, [ EX_PC ] MDU ); ID_EX [ PCPlus4 ] >> [ EX_PCPlus4 ] MDU ; ID_EX [ BEQ ] >> [ EX_BEQ ] MDU ; ID_EX [ BNE ] >> [ EX_BNE ] MDU ; ID_EX [ Jump ] >> [ EX_Jump ] MDU ; ID_EX [ JumpReg ] >> [ EX_JumpReg ] MDU ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] MDU ; ID_EX [ MemWrite ] >> [ EX_MemWrite ] MDU ; Sæt ALU en op ALUMUXa ALUMUXb ID_EX [ ALUOp ] >> alu ; Før l i n j e r n e ind i EX/MEM grænsen ID_EX [ PC] >> {32} >> [ PC] EX_MEM { PipeStageBoundary SANC [ EX_MEM_Write ]}; ID_EX [ PCPlus4 ] >> {32} >> [ PCPlus4 ] EX_MEM ; ID_EX [ BranchAddr ] >> {32} >> [ BranchAddr ] EX_MEM ; SWMux >> [ WriteData ] EX_MEM ; ID_EX [ destreg ] >> {5} >> [ destreg ] EX_MEM ; alu [ Res ] >> [ ALURes ] EX_MEM ; alu [ Zero ] >> [ ALUZero ] EX_MEM ; K o n t r o l l i n j e r n e s k a l kunne zappes ID_EX [ BNE ] >> {1} >> zex_mem1 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ BNE ] EX_MEM ; 42

ID_EX [ BEQ ] >> {1} >> zex_mem2 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ BEQ ] EX_MEM ; ID_EX [ MemWrite ] >> {1} >> zex_mem3 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemWrite ] EX_MEM ; ID_EX [ MemRead ] >> {1} >> zex_mem4 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemRead ] EX_MEM ; ID_EX [ Link ] >> {1} >> zex_mem5 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ Link ] EX_MEM ; ID_EX [ RegWrite ] >> {1} >> zex_mem6 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ RegWrite ] EX_MEM ; ID_EX [ MemtoReg ] >> {1} >> zex_mem7 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemtoReg ] EX_MEM ; ID_EX [ JumpReg ] >> {1} >> zex_mem8 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ JumpReg ] EX_MEM ; MEM f a s e n Send data t i l HDU en og MDU EX_MEM [ ALURes ] >> [ MEM_ALURes ] HDU ; EX_MEM [ MemWrite ] >> [ MEM_MemWrite ] HDU ; EX_MEM [PC] >> [ MEM_PC ] MDU ; EX_MEM [ ALURes ] >> [ MEM_ALURes ] MDU ; EX_MEM [ PCPlus4 ] >> [ MEM_PCPlus4 ] MDU ; EX_MEM [ BranchAddr ] >> [ MEM_BranchAddr ] MDU ; EX_MEM [ JumpReg ] >> [ MEM_JumpReg ] MDU ; EX_MEM [ BEQ ] >> [ MEM_BEQ ] MDU ; EX_MEM [ BNE ] >> [ MEM_BNE ] MDU ; EX_MEM [ ALUZero ] >> [ MEM_ALUZero ] MDU ; Opsæt hukommelsestilgangen EX_MEM [ MemRead ] >> [ drd ] mem ; EX_MEM [ MemWrite ] >> [ dwr ] mem ; EX_MEM [ ALURes ] >> [ daddrin ] mem ; EX_MEM [ WriteData ] >> [ ddatain ] mem ; Opsæt muxen, der vælger mellem PC+4 og ALURes EX_MEM [ Link ] >> [ select ] PCp4orALUMux { Mux 1 32}; EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] >> [ in] PCp4orALUMux ; Før l i n j e r n e ind i MEM/WB grænsen PCp4orALUMux >> [ PCp4orALU ] MEM_WB { PipeStageBoundary SANC [ MEM_WB_Write ]}; mem [ ddataout ] >> [ readdata ] MEM_WB ; EX_MEM [ destreg ] >> {5} >> [ destreg ] MEM_WB ; EX_MEM [ RegWrite ] >> {1} >> [ RegWrite ] MEM_WB ; EX_MEM [ MemtoReg ] >> {1} >> [ MemtoReg ] MEM_WB ; WB f a s e n Send data t i l muxen f ø r r e g i s t r e n e MEM_WB [ MemtoReg ] >> [ select ] RegWriteMux ; MEM_WB [ readdata ] MEM_WB [ PCp4orALU ] >> [ in] RegWriteMux ; OBS! F l y t t e t f r a EX f a s e n pga. Kreds manglende evner Sæt muxerne f ø r ALU en op ID_EX [ ALUMUXaSelect ] >> [ select ] ALUMUXa { FastMux 5 32}; ID_EX [ regdata1 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] 43

MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] ALUMUXa ; ID_EX [ ALUMUXbSelect ] >> [ select ] ALUMUXb { FastMux 6 32}; ID_EX [ extimm ] ID_EX [ regdata2 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] ALUMUXb ; Sæt SW muxen op ID_EX [ SWMuxSelect ] >> [ select ] SWMux { FastMux 5 32}; ID_EX [ regdata2 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] SWMux ; Opsætning a f s t a l l and NOP c o n t r o l mem [ holdandwait ] >> [ holdandwait ] SANC { StallAndNOPControl }; ID_EX [ destreg ] >> [ EX_destReg ] SANC ; ID_EX [ BEQ ] >> [ EX_BEQ ] SANC ; ID_EX [ BNE ] >> [ EX_BNE ] SANC ; ID_EX [ JumpReg ] >> [ EX_JumpReg ] SANC ; ID_EX [ MemWrite ] >> [ EX_MemWrite ] SANC ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] SANC ; ID_EX [ stop ] >> [ EX_stop ] SANC ; EX_MEM [ MemRead ] >> [ MEM_MemRead ] SANC ; EX_MEM [ MemWrite ] >> [ MEM_MemWrite ] SANC ; HDU [ STALL_IFandID ] >> [ HDU_STALL_IFandID ] SANC ; HDU [ NOP_IF ] >> [ HDU_NOP_IF ] SANC ; HDU [ NOP_ID ] >> [ HDU_NOP_ID ] SANC ; HDU [ NOP_EX ] >> [ HDU_NOP_EX ] SANC ; MDU [ NOP_IF ] >> [ MDU_NOP_IF ] SANC ; MDU [ NOP_ID ] >> [ MDU_NOP_ID ] SANC ; MDU [ NOP_EX ] >> [ MDU_NOP_EX ] SANC ; PCWrite f l a g e t SANC [ PCWrite ] >> [ wrenable ]PC; SANC [ PCWrite ] >> [ wrenable ] PC1 ; Opsætning a f muxerne f ø r PC PCMux ( normalt f l o w ) MDU [ PCMux_Select ] >> [ select ] PCMux { FastMux 6 32}; ID_EX [ PCPlus4 ] EX_MEM [ ALURes ] EX_MEM [ BranchAddr ] EX_MEM [ PCPlus4 ] >> [in :127..0] PCMux ; OverrideMux ( s e l v m o d i f i c e r e n d e kode ) HDU [ OverridePC ] >> [ select ] OverrideMux { Mux 1 32}; EX_MEM [ ALURes ] PCMux >> [ in] OverrideMux ; OverrideMux >> ( [in]pc, [in]pc1 ); end 44

D Hopforudsigelsespræcision! " # $ % & ' ( E F Kodeeksempler til hopforudsigeren Benchmarks Herunder følger udskrifterne fra kørslerne af de obligatoriske benchmarks i alfabetisk rækkefølge. Efter hvert benchmark kommer en udskrift fra mips med argumentet 1 (statistik). F.1 AsmBsort This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. 45

Figur 4: Løkke, hvor et betinget hop tages hver anden gang addi $1, $0, 0 ; $1 = 0 addi $2, $0, 10 ; $2 = 10 addi $4, $0, 0 ; $4 = 0 Loop : andi $3, $1, 1 ; $3 = $1 and 0 x01 beq $3, $0, Skip ; if ( $3 == 0) goto Skip addi $4, $4, 1 ; $4 = $4 +1 Skip : addi $1, $1, 1 ; $1 = $1 +1 bne $1, $2, Loop ; if ( $1!= $2) goto Loop stop ; Afslut Figur 5: Løkke der gennemløbes 10 gange addi $1, $0, 0 ; $1 = 0 addi $2, $0, 10 ; $2 = 10 Loop : addi $1, $1, 1 ; $1 = $1 +1 bne $1, $2, Loop ; if ( $1!= $2) goto Loop stop Figur 6: Løkke der gennemløbes 10 10 gange addi $1, $0, 0 ; $1 = 0 addi $2, $0, 10 ; $2 = 10 L1: addi $3, $0, 0 ; $3 = 0 addi $4, $0, 10 ; $4 = 10 L2: addi $3, $3, 1 ; $3 = $3 +1 bne $3, $4, L2 ; if ( $3!= $4) goto L2 addi $1, $1, 1 ; $1 = $1 +1 bne $1, $2, L1 ; if ( $1!= $2) goto L1 stop ; Afslut 46

--------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. 0 769087 894408 1079721 1937921 2106396 2116118 2818282 3140553 3375856 3431689 3638869 4168805 4268015 5067550 5774645 5812510 5830419 6941637 6983895 7109514 7118316 7253070 8168565 8783635 9049946 9979873 10584854 11198260 11265887 11320728 12555651 12898109 12940062 13084306 13270566 13377649 14039339 14690464 16153405 16284237 16369242 47

19411655 19718159 20032880 20135103 20315848 20401935 21091886 21577328 21737285 23881121 24228324 24297583 25165983 25439344 25619604 25678639 26205788 26539774 27970217 28072114 28678436 28879698 29023298 29509163 29803218 29882785 30007831 30260435 30684759 31172873 31604904 32335482 32957635 33138145 34700612 34828656 35034681 36358116 36390443 36499465 36617086 36969222 37102593 38285272 38472380 38624135 38819989 38837653 38842958 39120252 39321511 40019071 40038582 40217173 40600112 40619231 41052091 41277082 41298399 41788750 42456549 42609644 43625335 44943101 45123178 48

45297309 45360217 45685055 48213966 48660657 50027254 50096912 50100262 51021744 51174750 51465315 52206949 52359580 52430206 52952027 53947575 54229112 54620270 55774379 56099752 56224240 56572877 57263889 57273621 57319356 57332586 57445788 57522370 57897852 58793444 60474687 61205148 62317286 62618244 62731714 62885198 63642435 63955575 64233289 64704398 66847550 67767850 68283716 70463927 70760705 70829185 71473747 71704728 71906392 72692659 72830981 73615306 73951606 74053061 75322081 75898600 76270840 76559671 76836099 78134438 78944578 79604338 79691769 80424705 80647156 49

80865604 81397972 81523261 81665465 82948884 83011693 84568739 85375921 85513176 85816700 85907176 87189206 87209182 88116765 88785768 89401895 89799300 90745178 90755167 90968138 91293861 91413123 91790276 92295818 93880333 94604219 96082809 96813111 97197132 97499985 97734134 98553481 99088824 99219348 99394491 99578591 99720078 100644349 102652414 103446808 103502641 103795127 103913909 104235137 104711678 105846252 106610654 106901810 106981836 107150055 107313065 107882090 109160704 109385571 109604589 109895048 110006487 110234224 110901730 111513953 111850216 112133199 112285641 112913529 113461349 50

115060267 115575595 115700858 117294060 119073571 119211679 120029740 120093810 120461661 120519071 120561950 121240695 121338908 121484835 121682207 121756468 121829929 121988499 123473404 124399356 125397955 126250337 126352526 126632425 126706884 127268809 127428867 127919875 128110383 129189504 129771263 129953109 130249994 131365513 131398820 132147170 132480684 132501444 132706072 133059625 135464125 135825722 136193950 137713745 137976287 138196294 139488047 140138146 140174594 140528768 141422103 141460865 141602930 142079520 144316924 144385685 145225561 145925630 146156905 146703421 148029186 148573759 148794804 149002175 150167172 51

150691273 151577851 151642451 152252304 153017527 153696437 154613140 154998857 155293296 156667537 157061842 157597992 157802949 157985210 159127684 159477225 160123556 160528570 162809062 162930651 163771192 163938647 164182074 164717495 164872122 165381352 165522178 166258823 166406844 167433542 168909221 170386674 170581978 171538946 171556631 171669792 171873895 173250637 173471872 174572785 175689668 176300974 177604589 178043245 179270237 179377799 180998327 181593652 181895253 182858073 182908928 183524501 183573436 183585431 185040098 185779523 186192162 186358950 187398323 188373723 189239998 190724226 190732875 191469285 191579662 52

191650541 191808086 192636985 192769498 193514860 193891488 194990448 195129140 195543168 195620728 196130996 196414064 196708045 196718148 196987904 197387457 198207689 198828354 198882054 199666890 199810857 200194460 200498221 200854780 202820511 203084293 203450406 205689709 206181317 206271345 206285210 206342254 206442626 206718913 206742866 207420031 208289396 209678431 210176054 211367050 211368553 211578661 212983189 213154676 214108009 214210095 214336796 216629353 216716046 216984398 217310207 218127359 218512525 220379217 220505420 220952845 221009238 221948772 222085708 222135232 222254595 223266839 223538349 224275466 224912952 53

225171992 225237479 225362503 225834377 225981602 226616788 226990215 227372988 227477571 227742263 228880295 229356395 229681371 230865769 231819243 232311417 232776563 232852122 233591428 235843469 235989163 237006531 237211712 237796258 237844411 238684093 239976082 240020675 240236897 240315014 240464039 240851758 240984653 241706322 244294600 244389266 244731053 244936987 245568644 245581526 245873410 246106454 247838580 248073841 248412301 248566688 248581554 248663465 248922891 248936813 249247030 250192767 251785224 252436275 252481876 252638740 253042181 253117589 253515237 254024380 254158360 254286382 255358143 255478490 256046166 54

256678460 256972663 256978910 257271589 258225233 258676353 259376779 259834064 261324738 261395356 263118642 266411476 266912418 267161386 268347739 Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 398482339 evaluations in 808680 simulated cycles. That s 492 pr. cycle. On average 32% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 1013. 87 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 70 writes : 0 MemIOSys : Off - chip transfers : 2240 bytes. MemIOSys : Off - chip bandwidth : 2. 107 Mbytes / sec. MemIOSys : Held & waited 1325 cycles MemIOSys : On - chip inst. fetches : 807355 MemIOSys : On - chip data - reads : 264192 MemIOsys : On - chip data - writes : 2049 MemIOSys : On - chip data memory bandwidth : 1001. 73 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 3037. 67 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.1.1 statistik 0 769087 894408 1079721 1937921 2106396 2116118 2818282 3140553 3375856 3431689 3638869 4168805 4268015 5067550 5774645 5812510 5830419 6941637 6983895 7109514 7118316 7253070 8168565 8783635 9049946 55

9979873 10584854 11198260 11265887 11320728 12555651 12898109 12940062 13084306 13270566 13377649 14039339 14690464 16153405 16284237 16369242 19411655 19718159 20032880 20135103 20315848 20401935 21091886 21577328 21737285 23881121 24228324 24297583 25165983 25439344 25619604 25678639 26205788 26539774 27970217 28072114 28678436 28879698 29023298 29509163 29803218 29882785 30007831 30260435 30684759 31172873 31604904 32335482 32957635 33138145 34700612 34828656 35034681 36358116 36390443 36499465 36617086 36969222 37102593 38285272 38472380 38624135 38819989 38837653 38842958 56

39120252 39321511 40019071 40038582 40217173 40600112 40619231 41052091 41277082 41298399 41788750 42456549 42609644 43625335 44943101 45123178 45297309 45360217 45685055 48213966 48660657 50027254 50096912 50100262 51021744 51174750 51465315 52206949 52359580 52430206 52952027 53947575 54229112 54620270 55774379 56099752 56224240 56572877 57263889 57273621 57319356 57332586 57445788 57522370 57897852 58793444 60474687 61205148 62317286 62618244 62731714 62885198 63642435 63955575 64233289 64704398 66847550 67767850 68283716 70463927 70760705 70829185 71473747 71704728 71906392 57

72692659 72830981 73615306 73951606 74053061 75322081 75898600 76270840 76559671 76836099 78134438 78944578 79604338 79691769 80424705 80647156 80865604 81397972 81523261 81665465 82948884 83011693 84568739 85375921 85513176 85816700 85907176 87189206 87209182 88116765 88785768 89401895 89799300 90745178 90755167 90968138 91293861 91413123 91790276 92295818 93880333 94604219 96082809 96813111 97197132 97499985 97734134 98553481 99088824 99219348 99394491 99578591 99720078 100644349 102652414 103446808 103502641 103795127 103913909 104235137 104711678 105846252 106610654 106901810 106981836 58

107150055 107313065 107882090 109160704 109385571 109604589 109895048 110006487 110234224 110901730 111513953 111850216 112133199 112285641 112913529 113461349 115060267 115575595 115700858 117294060 119073571 119211679 120029740 120093810 120461661 120519071 120561950 121240695 121338908 121484835 121682207 121756468 121829929 121988499 123473404 124399356 125397955 126250337 126352526 126632425 126706884 127268809 127428867 127919875 128110383 129189504 129771263 129953109 130249994 131365513 131398820 132147170 132480684 132501444 132706072 133059625 135464125 135825722 136193950 137713745 137976287 138196294 139488047 140138146 140174594 59

140528768 141422103 141460865 141602930 142079520 144316924 144385685 145225561 145925630 146156905 146703421 148029186 148573759 148794804 149002175 150167172 150691273 151577851 151642451 152252304 153017527 153696437 154613140 154998857 155293296 156667537 157061842 157597992 157802949 157985210 159127684 159477225 160123556 160528570 162809062 162930651 163771192 163938647 164182074 164717495 164872122 165381352 165522178 166258823 166406844 167433542 168909221 170386674 170581978 171538946 171556631 171669792 171873895 173250637 173471872 174572785 175689668 176300974 177604589 178043245 179270237 179377799 180998327 181593652 181895253 60

182858073 182908928 183524501 183573436 183585431 185040098 185779523 186192162 186358950 187398323 188373723 189239998 190724226 190732875 191469285 191579662 191650541 191808086 192636985 192769498 193514860 193891488 194990448 195129140 195543168 195620728 196130996 196414064 196708045 196718148 196987904 197387457 198207689 198828354 198882054 199666890 199810857 200194460 200498221 200854780 202820511 203084293 203450406 205689709 206181317 206271345 206285210 206342254 206442626 206718913 206742866 207420031 208289396 209678431 210176054 211367050 211368553 211578661 212983189 213154676 214108009 214210095 214336796 216629353 216716046 61

216984398 217310207 218127359 218512525 220379217 220505420 220952845 221009238 221948772 222085708 222135232 222254595 223266839 223538349 224275466 224912952 225171992 225237479 225362503 225834377 225981602 226616788 226990215 227372988 227477571 227742263 228880295 229356395 229681371 230865769 231819243 232311417 232776563 232852122 233591428 235843469 235989163 237006531 237211712 237796258 237844411 238684093 239976082 240020675 240236897 240315014 240464039 240851758 240984653 241706322 244294600 244389266 244731053 244936987 245568644 245581526 245873410 246106454 247838580 248073841 248412301 248566688 248581554 248663465 248922891 62

248936813 249247030 250192767 251785224 252436275 252481876 252638740 253042181 253117589 253515237 254024380 254158360 254286382 255358143 255478490 256046166 256678460 256972663 256978910 257271589 258225233 258676353 259376779 259834064 261324738 261395356 263118642 266411476 266912418 267161386 268347739 profile : 1 00000000 : 20010070 ADDI $1, $0,70 1 00000004 : 20020870 ADDI $2, $0,870 1 00000008 : 20230000 ADDI $3, $1,0 513 0000000 c : 1043000 F BEQ $2, $3, F 1 taken 512 00000010 : 20650000 ADDI $5, $3,0 512 00000014 : 20640000 ADDI $4, $3,0 131328 00000018 : 8 CA60000 LW $6,0000( $5) 131328 0000001 c : 8 C870000 LW $7,0000( $4) 131328 00000020 : 20 A50004 ADDI $5, $5,4 131328 00000024 : 00 C7302A SLT $6, $6, $7 131328 00000028 : 10060001 BEQ $0, $6,1 128919 taken 2409 0000002 c : 20 A4FFFC ADDI $4, $5, FFFC 131328 00000030 : 1445 FFF9 BNE $2, $5, FFF9 130816 taken 512 00000034 : 8 C660000 LW $6,0000( $3) 512 00000038 : 8 C870000 LW $7,0000( $4) 512 0000003 c : AC670000 SW $7,0000( $3) 512 00000040 : AC860000 SW $6,0000( $4) 512 00000044 : 20630004 ADDI $3, $3,4 512 00000048 : 08000003 J 0000003 1 0000004 c : 20010070 ADDI $1, $0,70 1 00000050 : 20020870 ADDI $2, $0,870 512 00000054 : 8 C230000 LW $3,0000( $1) 63

512 00000058 : AC03FFF4 SW $3, FFF4 ( $0) 512 0000005 c : AC00FFFC SW $0, FFFC ( $0) 512 00000060 : 20210004 ADDI $1, $1,4 512 00000064 : 1441 FFFB BNE $2, $1, FFFB 511 taken 1 00000068 : AC00FFFC SW $0, FFFC ( $0) 1 0000006 c : FC000000 STOP Instruction : Occurences : JR 0 ADD 0 SUB 0 AND 0 OR 0 XOR 0 SLT 131328 J 512 JAL 0 BEQ 131841 128920 taken BNE 131840 131327 taken ADDI 135790 SLTI 0 ANDI 0 ORI 0 XORI 0 LUI 0 LW 264192 SW 2049 STOP 1 Total : 797553 F.2 AsmCopy This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 49920590 evaluations 64

in 164234 simulated cycles. That s 303 pr. cycle. On average 19% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 205. 907 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 2243 writes : 1557 MemIOSys : Off - chip transfers : 121600 bytes. MemIOSys : Off - chip bandwidth : 563. 201 Mbytes / sec. MemIOSys : Held & waited 74274 cycles MemIOSys : On - chip inst. fetches : 89960 MemIOSys : On - chip data - reads : 12907 MemIOsys : On - chip data - writes : 12310 MemIOSys : On - chip data memory bandwidth : 467. 179 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 1666. 63 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.2.1 statistik profile : 1 00000000 : 341 E00FC ORI $30, $0, FC 1 00000004 : 0 C00003F JAL 000003 F 1 00000008 : FC000000 STOP 1 000000 fc : 23 DEFFFC ADDI $30, $30, FFFC 1 00000100 : AFDF0000 SW $31,0000( $30 ) 1 00000104 : 340100 C8 ORI $1, $0, C8 1 00000108 : 34020140 ORI $2, $0,140 200 0000010 c : 2021 FFFF ADDI $1, $1, FFFF 200 00000110 : 10010008 BEQ $0, $1,8 1 taken 199 00000114 : 8 C430000 LW $3,0000( $2) 199 00000118 : 20420004 ADDI $2, $2,4 199 0000011 c : 8 C440000 LW $4,0000( $2) 199 00000120 : 20420004 ADDI $2, $2,4 199 00000124 : 8 C450000 LW $5,0000( $2) 199 00000128 : 20420004 ADDI $2, $2,4 199 0000012 c : 0 C0002A8 JAL 00002 A8 199 00000130 : 08000043 J 0000043 1 00000134 : 8 FDF0000 LW $31,0000( $30 ) 1 00000138 : 23 DE0004 ADDI $30, $30,4 1 0000013 c : 03 E00008 JR $31 199 00000 aa0 : 080002 AE J 00002 AE 12309 00000 aa4 : 20 A5FFFF ADDI $5, $5, FFFF 12309 00000 aa8 : 8 C660000 LW $6,0000( $3) 12309 00000 aac : AC860000 SW $6,0000( $4) 12309 00000 ab0 : 20630004 ADDI $3, $3,4 12309 00000 ab4 : 20840004 ADDI $4, $4,4 12508 00000 ab8 : 1405 FFFA BNE $0, $5, FFFA 12309 taken 199 00000 abc : 03 E00008 JR $31 Instruction : Occurences : JR 200 ADD 0 SUB 0 65

AND 0 OR 0 XOR 0 SLT 0 J 398 JAL 200 BEQ 200 1 taken BNE 12508 12309 taken ADDI 37726 SLTI 0 ANDI 0 ORI 3 XORI 0 LUI 0 LW 12907 SW 12310 STOP 1 Total : 76453 F.3 AsmFib This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 166894281 evaluations in 319744 simulated cycles. That s 521 pr. cycle. On average 34% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 400. 876 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 12 writes : 0 MemIOSys : Off - chip transfers : 384 bytes. MemIOSys : Off - chip bandwidth : 0. 913527 Mbytes / sec. MemIOSys : Held & waited 740 cycles MemIOSys : On - chip inst. fetches : 319004 MemIOSys : On - chip data - reads : 32835 MemIOsys : On - chip data - writes : 32835 66

MemIOSys : On - chip data memory bandwidth : 624. 91 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 3035. 61 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.3.1 statistik profile : 1 00000000 : 341 E01A0 ORI $30, $0,1 A0 1 00000004 : 34010014 ORI $1, $0,14 1 00000008 : 0 C000068 JAL 0000068 1 0000000 c : FC000000 STOP 21891 000001 a0 : 282 A0002 SLTI $10, $1,2 21891 000001 a4 : 100 A0002 BEQ $0, $10,2 10945 taken 10946 000001 a8 : 341 D0001 ORI $29, $0,1 10946 000001 ac : 03 E00008 JR $31 10945 000001 b0 : 23 DEFFF4 ADDI $30, $30, FFF4 10945 000001 b4 : AFC10004 SW $1,0004( $30 ) 10945 000001 b8 : 2021 FFFF ADDI $1, $1, FFFF 10945 000001 bc : AFDF0000 SW $31,0000( $30 ) 10945 000001 c0 : 0 C000068 JAL 0000068 10945 000001 c4 : 8 FC10004 LW $1,0004( $30 ) 10945 000001 c8 : 2021 FFFE ADDI $1, $1, FFFE 10945 000001 cc : AFDD0008 SW $29,0008( $30 ) 10945 000001 d0 : 0 C000068 JAL 0000068 10945 000001 d4 : 8 FC10008 LW $1,0008( $30 ) 10945 000001 d8 : 03 A1E820 ADD $29, $29, $1 10945 000001 dc : 8 FDF0000 LW $31,0000( $30 ) 10945 000001 e0 : 23 DE000C ADDI $30, $30, C 10945 000001 e4 : 03 E00008 JR $31 Instruction : Occurences : JR 21891 ADD 10945 SUB 0 AND 0 OR 0 XOR 0 SLT 0 J 0 JAL 21891 BEQ 21891 10945 taken BNE 0 0 taken ADDI 43780 SLTI 21891 ANDI 0 ORI 10948 XORI 0 LUI 0 LW 32835 SW 32835 STOP 1 Total : 218908 F.4 AsmQsort 67

This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 188924248 evaluations in 372078 simulated cycles. That s 507 pr. cycle. On average 33% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 466. 489 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 783 writes : 140 MemIOSys : Off - chip transfers : 29536 bytes. MemIOSys : Off - chip bandwidth : 60. 3824 Mbytes / sec. MemIOSys : Held & waited 12627 cycles MemIOSys : On - chip inst. fetches : 359451 MemIOSys : On - chip data - reads : 48288 MemIOsys : On - chip data - writes : 14827 MemIOSys : On - chip data memory bandwidth : 516. 121 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 2939. 4 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.4.1 statistik profile : 1 00000000 : 34010800 ORI $1, $0,800 1 00000004 : 00210820 ADD $1, $1, $1 1 00000008 : 00210820 ADD $1, $1, $1 1 0000000 c : 00210820 ADD $1, $1, $1 1 00000010 : 20210148 ADDI $1, $1,148 1 00000014 : 340200 E4 ORI $2, $0, E4 1 00000018 : 34030004 ORI $3, $0,4 1 0000001 c : 34040800 ORI $4, $0,800 1 00000020 : 00842020 ADD $4, $4, $4 1 00000024 : 00842020 ADD $4, $4, $4 1 00000028 : 0 C00000C JAL 000000 C 68

1 0000002 c : FC000000 STOP 2735 00000030 : 0064502 A SLT $10, $3, $4 2735 00000034 : 100 A002A BEQ $0, $10,2A 1368 taken 1367 00000038 : 34650000 ORI $5, $3,0 1367 0000003 c : 20860004 ADDI $6, $4,4 1367 00000040 : 00435820 ADD $11, $2, $3 1367 00000044 : 8 D670000 LW $7,0000( $11 ) 15204 00000048 : 20 A50004 ADDI $5, $5,4 15204 0000004 c : 00 A25020 ADD $10, $5, $2 15204 00000050 : 8 D5E0000 LW $30,0000( $10 ) 15204 00000054 : 03 C7582A SLT $11, $30, $7 15204 00000058 : 140 BFFFB BNE $0, $11, FFFB 9841 taken 16890 0000005 c : 20 C6FFFC ADDI $6, $6, FFFC 16890 00000060 : 00465020 ADD $10, $2, $6 16890 00000064 : 8 D5E0000 LW $30,0000( $10 ) 16890 00000068 : 00 FE582A SLT $11, $7, $30 16890 0000006 c : 140 BFFFB BNE $0, $11, FFFB 11527 taken 5363 00000070 : 00 A6502A SLT $10, $5, $6 5363 00000074 : 100 A0006 BEQ $0, $10,6 1367 taken 3996 00000078 : 00465820 ADD $11, $2, $6 3996 0000007 c : 8 D7E0000 LW $30,0000( $11 ) 3996 00000080 : 00456020 ADD $12, $2, $5 3996 00000084 : 8 D9D0000 LW $29,0000( $12 ) 3996 00000088 : AD7D0000 SW $29,0000( $11 ) 3996 0000008 c : AD9E0000 SW $30,0000( $12 ) 5363 00000090 : 00 A6502A SLT $10, $5, $6 5363 00000094 : 140 AFFEC BNE $0, $10, FFEC 3996 taken 1367 00000098 : 00435820 ADD $11, $2, $3 1367 0000009 c : 8 D7C0000 LW $28,0000( $11 ) 1367 000000 a0 : 00466020 ADD $12, $2, $6 1367 000000 a4 : 8 D9B0000 LW $27,0000( $12 ) 1367 000000 a8 : AD7B0000 SW $27,0000( $11 ) 1367 000000 ac : AD9C0000 SW $28,0000( $12 ) 1367 000000 b0 : 2021 FFF4 ADDI $1, $1, FFF4 1367 000000 b4 : AC240008 SW $4,0008( $1) 1367 000000 b8 : AC260004 SW $6,0004( $1) 1367 000000 bc : AC3F0000 SW $31,0000( $1) 1367 000000 c0 : 20 C4FFFC ADDI $4, $6, FFFC 1367 000000 c4 : 0 C00000C JAL 000000 C 1367 000000 c8 : 8 C230004 LW $3,0004( $1) 1367 000000 cc : 8 C240008 LW $4,0008( $1) 1367 000000 d0 : 20630004 ADDI $3, $3,4 1367 000000 d4 : 0 C00000C JAL 000000 C 1367 000000 d8 : 8 C3F0000 LW $31,0000( $1) 1367 000000 dc : 2021000 C ADDI $1, $1, C 2735 000000 e0 : 03 E00008 JR $31 Instruction : Occurences : JR 2735 ADD 44192 SUB 0 AND 0 OR 0 XOR 0 69

SLT 45555 J 0 JAL 2735 BEQ 8098 2735 taken BNE 37457 25364 taken ADDI 38930 SLTI 0 ANDI 0 ORI 1371 XORI 0 LUI 0 LW 48288 SW 14827 STOP 1 Total : 244189 F.5 AsmScatter This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 111094528 evaluations in 250659 simulated cycles. That s 443 pr. cycle. On average 28% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 314. 261 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 1373 writes : 235 MemIOSys : Off - chip transfers : 51456 bytes. MemIOSys : Off - chip bandwidth : 156. 151 Mbytes / sec. MemIOSys : Held & waited 53396 cycles MemIOSys : On - chip inst. fetches : 197263 MemIOSys : On - chip data - reads : 30325 MemIOsys : On - chip data - writes : 7582 MemIOSys : On - chip data memory bandwidth : 460. 139 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 2394. 5 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen 70

F.5.1 statistik profile : 1 00000000 : 341 E00FC ORI $30, $0, FC 1 00000004 : 0 C00003F JAL 000003 F 1 00000008 : FC000000 STOP 1 000000 fc : 23 DEFFFC ADDI $30, $30, FFFC 1 00000100 : AFDF0000 SW $31,0000( $30 ) 1 00000104 : 340 A0014 ORI $10, $0,14 20 00000108 : 214 AFFFF ADDI $10, $10, FFFF 20 0000010 c : 100 A000D BEQ $0, $10, D 1 taken 19 00000110 : 34010190 ORI $1, $0,190 19 00000114 : 34020150 ORI $2, $0,150 7600 00000118 : 2021 FFFF ADDI $1, $1, FFFF 7600 0000011 c : 10010008 BEQ $0, $1,8 19 taken 7581 00000120 : 8 C430000 LW $3,0000( $2) 7581 00000124 : 20420004 ADDI $2, $2,4 7581 00000128 : 8 C440000 LW $4,0000( $2) 7581 0000012 c : 20420004 ADDI $2, $2,4 7581 00000130 : 8 C450000 LW $5,0000( $2) 7581 00000134 : 20420004 ADDI $2, $2,4 7581 00000138 : 0 C00068D JAL 000068 D 7581 0000013 c : 08000046 J 0000046 19 00000140 : 08000042 J 0000042 1 00000144 : 8 FDF0000 LW $31,0000( $30 ) 1 00000148 : 23 DE0004 ADDI $30, $30,4 1 0000014 c : 03 E00008 JR $31 7581 00001 a34 : 08000693 J 0000693 7581 00001 a38 : 20 A5FFFF ADDI $5, $5, FFFF 7581 00001 a3c : 8 C660000 LW $6,0000( $3) 7581 00001 a40 : AC860000 SW $6,0000( $4) 7581 00001 a44 : 20630004 ADDI $3, $3,4 7581 00001 a48 : 20840004 ADDI $4, $4,4 15162 00001 a4c : 1405 FFFA BNE $0, $5, FFFA 7581 taken 7581 00001 a50 : 03 E00008 JR $31 Instruction : Occurences : JR 7582 ADD 0 SUB 0 AND 0 OR 0 XOR 0 SLT 0 J 15181 JAL 7582 BEQ 7620 20 taken BNE 15162 7581 taken ADDI 53108 71

SLTI 0 ANDI 0 ORI 40 XORI 0 LUI 0 LW 30325 SW 7582 STOP 1 Total : 144183 F.6 fac1 This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. 442386619 Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 5535442 evaluations in 12385 simulated cycles. That s 446 pr. cycle. On average 29% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 15. 5276 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 25 writes : 0 MemIOSys : Off - chip transfers : 800 bytes. MemIOSys : Off - chip bandwidth : 49. 1345 Mbytes / sec. MemIOSys : Held & waited 1418 cycles MemIOSys : On - chip inst. fetches : 10967 MemIOSys : On - chip data - reads : 1077 MemIOsys : On - chip data - writes : 1078 MemIOSys : On - chip data memory bandwidth : 529. 424 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 2694. 29 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.6.1 statistik 442386619 profile : 72

1 00000000 : 201 E4000 ADDI $30, $0,4000 1 00000004 : 03 DEF020 ADD $30, $30, $30 1 00000008 : 03 DEF020 ADD $30, $30, $30 1 0000000 c : 03 DEE820 ADD $29, $30, $30 1 00000010 : 0 C000006 JAL 0000006 1 00000014 : FC000000 STOP 1 00000018 : AFDF0000 SW $31,0000( $30 ) 1 0000001 c : 2001000 C ADDI $1,$0,C 1 00000020 : 23 DE0004 ADDI $30, $30,4 1 00000024 : 0 C00000E JAL 000000 E 1 00000028 : 23 DEFFFC ADDI $30, $30, FFFC 1 0000002 c : AC01FFF4 SW $1, FFF4 ( $0) 1 00000030 : 8 FDF0000 LW $31,0000( $30 ) 1 00000034 : 03 E00008 JR $31 13 00000038 : AFDF0000 SW $31,0000( $30 ) 13 0000003 c : AFCB0008 SW $11,0008( $30 ) 13 00000040 : AFCC000C SW $12,000 C( $30 ) 13 00000044 : 342 B0000 ORI $11, $1,0 13 00000048 : 20010000 ADDI $1, $0,0 13 0000004 c : 142 B0002 BNE $1, $11,2 12 taken 1 00000050 : 20010000 ADDI $1, $0,0 1 00000054 : 08000021 J 0000021 12 00000058 : 35610000 ORI $1, $11,0 12 0000005 c : 23 DE0010 ADDI $30, $30,10 12 00000060 : 0 C000025 JAL 0000025 12 00000064 : 342 C0000 ORI $12, $1,0 12 00000068 : 23 DEFFF0 ADDI $30, $30, FFF0 12 0000006 c : 20010001 ADDI $1, $0,1 12 00000070 : 01610822 SUB $1, $11, $1 12 00000074 : 23 DE0010 ADDI $30, $30,10 12 00000078 : 0 C00000E JAL 000000 E 12 0000007 c : 23 DEFFF0 ADDI $30, $30, FFF0 12 00000080 : 01810822 SUB $1, $12, $1 13 00000084 : 8 FCB0008 LW $11,0008( $30 ) 13 00000088 : 8 FCC000C LW $12,000 C( $30 ) 13 0000008 c : 8 FDF0000 LW $31,0000( $30 ) 13 00000090 : 03 E00008 JR $31 90 00000094 : AFDF0000 SW $31,0000( $30 ) 90 00000098 : AFCB0008 SW $11,0008( $30 ) 90 0000009 c : 34220000 ORI $2, $1,0 90 000000 a0 : 20010000 ADDI $1, $0,0 90 000000 a4 : 14220002 BNE $1, $2,2 78 taken 12 000000 a8 : 20010001 ADDI $1, $0,1 12 000000 ac : 08000038 J 0000038 78 000000 b0 : 344 B0000 ORI $11, $2,0 78 000000 b4 : 34410000 ORI $1, $2,0 78 000000 b8 : 20020001 ADDI $2, $0,1 78 000000 bc : 00220822 SUB $1, $1, $2 78 000000 c0 : 23 DE000C ADDI $30, $30, C 78 000000 c4 : 0 C000025 JAL 0000025 78 000000 c8 : 34220000 ORI $2, $1,0 78 000000 cc : 23 DEFFF4 ADDI $30, $30, FFF4 73

78 000000 d0 : 23 DE000C ADDI $30, $30, C 78 000000 d4 : 35610000 ORI $1, $11,0 78 000000 d8 : 0 C00003B JAL 000003 B 78 000000 dc : 23 DEFFF4 ADDI $30, $30, FFF4 90 000000 e0 : 8 FCB0008 LW $11,0008( $30 ) 90 000000 e4 : 8 FDF0000 LW $31,0000( $30 ) 90 000000 e8 : 03 E00008 JR $31 261 000000 ec : AFDF0000 SW $31,0000( $30 ) 261 000000 f0 : 20030000 ADDI $3, $0,0 261 000000 f4 : 14610002 BNE $3, $1,2 183 taken 78 000000 f8 : 20010000 ADDI $1, $0,0 78 000000 fc : 08000045 J 0000045 183 00000100 : 20030001 ADDI $3, $0,1 183 00000104 : 34440000 ORI $4, $2,0 183 00000108 : 23 DE000C ADDI $30, $30, C 183 0000010 c : 0 C000047 JAL 0000047 183 00000110 : 23 DEFFF4 ADDI $30, $30, FFF4 261 00000114 : 8 FDF0000 LW $31,0000( $30 ) 261 00000118 : 03 E00008 JR $31 298 0000011 c : AFDF0000 SW $31,0000( $30 ) 298 00000120 : AFCB0014 SW $11,0014( $30 ) 298 00000124 : 34650000 ORI $5, $3,0 298 00000128 : 00 A32820 ADD $5, $5, $3 298 0000012 c : 00 A1282A SLT $5, $5, $1 298 00000130 : 10050008 BEQ $0, $5,8 183 taken 115 00000134 : 34650000 ORI $5, $3,0 115 00000138 : 00 A31820 ADD $3, $5, $3 115 0000013 c : 34850000 ORI $5, $4,0 115 00000140 : 00 A42020 ADD $4, $5, $4 115 00000144 : 23 DE0018 ADDI $30, $30,18 115 00000148 : 0 C000047 JAL 0000047 115 0000014 c : 23 DEFFE8 ADDI $30, $30, FFE8 115 00000150 : 0800005 B J 000005 B 183 00000154 : 348 B0000 ORI $11, $4,0 183 00000158 : 00230822 SUB $1, $1, $3 183 0000015 c : 23 DE0018 ADDI $30, $30,18 183 00000160 : 0 C00003B JAL 000003 B 183 00000164 : 23 DEFFE8 ADDI $30, $30, FFE8 183 00000168 : 01610820 ADD $1, $11, $1 298 0000016 c : 8 FCB0014 LW $11,0014( $30 ) 298 00000170 : 8 FDF0000 LW $31,0000( $30 ) 298 00000174 : 03 E00008 JR $31 Instruction : Occurences : JR 663 ADD 714 SUB 285 AND 0 OR 0 XOR 0 SLT 298 J 206 74

JAL 663 BEQ 298 183 taken BNE 364 273 taken ADDI 2054 SLTI 0 ANDI 0 ORI 1333 XORI 0 LUI 0 LW 1077 SW 1078 STOP 1 Total : 9034 F.7 fib1 This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. 10946 Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 225082250 evaluations in 483080 simulated cycles. That s 465 pr. cycle. On average 30% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 605. 657 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 19 writes : 0 MemIOSys : Off - chip transfers : 608 bytes. MemIOSys : Off - chip bandwidth : 0. 957364 Mbytes / sec. MemIOSys : Held & waited 1453 cycles MemIOSys : On - chip inst. fetches : 481627 MemIOSys : On - chip data - reads : 65674 MemIOsys : On - chip data - writes : 65675 MemIOSys : On - chip data memory bandwidth : 827. 295 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 3033. 5 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen 75

F.7.1 statistik 10946 profile : 1 00000000 : 201 E4000 ADDI $30, $0,4000 1 00000004 : 03 DEF020 ADD $30, $30, $30 1 00000008 : 03 DEF020 ADD $30, $30, $30 1 0000000 c : 03 DEE820 ADD $29, $30, $30 1 00000010 : 0 C000006 JAL 0000006 1 00000014 : FC000000 STOP 1 00000018 : AFDF0000 SW $31,0000( $30 ) 1 0000001 c : 20010014 ADDI $1, $0,14 1 00000020 : 23 DE0004 ADDI $30, $30,4 1 00000024 : 0 C00000E JAL 000000 E 1 00000028 : 23 DEFFFC ADDI $30, $30, FFFC 1 0000002 c : AC01FFF4 SW $1, FFF4 ( $0) 1 00000030 : 8 FDF0000 LW $31,0000( $30 ) 1 00000034 : 03 E00008 JR $31 21891 00000038 : AFDF0000 SW $31,0000( $30 ) 21891 0000003 c : AFCB0008 SW $11,0008( $30 ) 21891 00000040 : AFCC000C SW $12,000 C( $30 ) 21891 00000044 : 342 B0000 ORI $11, $1,0 21891 00000048 : 20010002 ADDI $1, $0,2 21891 0000004 c : 0161082 A SLT $1, $11, $1 21891 00000050 : 10010002 BEQ $0, $1,2 10945 taken 10946 00000054 : 20010001 ADDI $1, $0,1 10946 00000058 : 08000023 J 0000023 10945 0000005 c : 20010001 ADDI $1, $0,1 10945 00000060 : 01610822 SUB $1, $11, $1 10945 00000064 : 23 DE0010 ADDI $30, $30,10 10945 00000068 : 0 C00000E JAL 000000 E 10945 0000006 c : 342 C0000 ORI $12, $1,0 10945 00000070 : 23 DEFFF0 ADDI $30, $30, FFF0 10945 00000074 : 20010002 ADDI $1, $0,2 10945 00000078 : 01610822 SUB $1, $11, $1 10945 0000007 c : 23 DE0010 ADDI $30, $30,10 10945 00000080 : 0 C00000E JAL 000000 E 10945 00000084 : 23 DEFFF0 ADDI $30, $30, FFF0 10945 00000088 : 01810820 ADD $1, $12, $1 21891 0000008 c : 8 FCB0008 LW $11,0008( $30 ) 21891 00000090 : 8 FCC000C LW $12,000 C( $30 ) 21891 00000094 : 8 FDF0000 LW $31,0000( $30 ) 21891 00000098 : 03 E00008 JR $31 Instruction : Occurences : JR 21892 ADD 10948 SUB 21890 AND 0 OR 0 XOR 0 SLT 21891 J 10946 JAL 21892 BEQ 21891 10945 taken 76

BNE 0 0 taken ADDI 98511 SLTI 0 ANDI 0 ORI 32836 XORI 0 LUI 0 LW 65674 SW 65675 STOP 1 Total : 394047 F.8 mergesort1 This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. 465 921 1433 2111 3340 Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 214291254 evaluations in 893597 simulated cycles. That s 239 pr. cycle. On average 15% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 1120. 34 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 6817 writes : 4753 MemIOSys : Off - chip transfers : 370240 bytes. MemIOSys : Off - chip bandwidth : 315. 162 Mbytes / sec. MemIOSys : Held & waited 453376 cycles MemIOSys : On - chip inst. fetches : 440221 MemIOSys : On - chip data - reads : 38560 MemIOsys : On - chip data - writes : 32801 MemIOSys : On - chip data memory bandwidth : 242. 981 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 1498. 93 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.8.1 statistik 465 921 1433 2111 3340 77

profile : 1 00000000 : 201 E4000 ADDI $30, $0,4000 1 00000004 : 03 DEF020 ADD $30, $30, $30 1 00000008 : 03 DEF020 ADD $30, $30, $30 1 0000000 c : 03 DEE820 ADD $29, $30, $30 1 00000010 : 0 C000006 JAL 0000006 1 00000014 : FC000000 STOP 1 00000018 : AFDF0000 SW $31,0000( $30 ) 1 0000001 c : AFCB0004 SW $11,0004( $30 ) 1 00000020 : AFCC0008 SW $12,0008( $30 ) 1 00000024 : 200 B01F4 ADDI $11, $0,1 F4 1 00000028 : 35620000 ORI $2, $11,0 1 0000002 c : 20010000 ADDI $1, $0,0 1 00000030 : 37 AC0000 ORI $12, $29,0 1 00000034 : 00421020 ADD $2, $2, $2 1 00000038 : 00421020 ADD $2, $2, $2 501 0000003 c : 10020004 BEQ $0, $2,4 1 taken 500 00000040 : AFA10000 SW $1,0000( $29 ) 500 00000044 : 2042 FFFC ADDI $2, $2, FFFC 500 00000048 : 23 BD0004 ADDI $29, $29,4 500 0000004 c : 0800000 F J 000000 F 1 00000050 : 35610000 ORI $1, $11,0 1 00000054 : 35820000 ORI $2, $12,0 1 00000058 : 20030011 ADDI $3, $0,11 1 0000005 c : 23 DE000C ADDI $30, $30, C 1 00000060 : 0 C000028 JAL 0000028 1 00000064 : 23 DEFFF4 ADDI $30, $30, FFF4 1 00000068 : 35610000 ORI $1, $11,0 1 0000006 c : 35820000 ORI $2, $12,0 1 00000070 : 23 DE000C ADDI $30, $30, C 1 00000074 : 0 C00006B JAL 000006 B 1 00000078 : 23 DEFFF4 ADDI $30, $30, FFF4 1 0000007 c : 35610000 ORI $1, $11,0 1 00000080 : 35820000 ORI $2, $12,0 1 00000084 : 23 DE000C ADDI $30, $30, C 1 00000088 : 0 C000050 JAL 0000050 1 0000008 c : 23 DEFFF4 ADDI $30, $30, FFF4 1 00000090 : 8 FCB0004 LW $11,0004( $30 ) 1 00000094 : 8 FCC0008 LW $12,0008( $30 ) 1 00000098 : 8 FDF0000 LW $31,0000( $30 ) 1 0000009 c : 03 E00008 JR $31 501 000000 a0 : AFDF0000 SW $31,0000( $30 ) 501 000000 a4 : AFCB0010 SW $11,0010( $30 ) 501 000000 a8 : AFCC0014 SW $12,0014( $30 ) 501 000000 ac : AFCD0018 SW $13,0018( $30 ) 501 000000 b0 : 342 B0000 ORI $11, $1,0 501 000000 b4 : 344 C0000 ORI $12, $2,0 501 000000 b8 : 20010000 ADDI $1, $0,0 501 000000 bc : 142 B0002 BNE $1, $11,2 500 taken 1 000000 c0 : 20010000 ADDI $1, $0,0 1 000000 c4 : 0800004 B J 000004 B 500 000000 c8 : 200103 F1 ADDI $1, $0,3 F1 500 000000 cc : 0061082 A SLT $1, $3, $1 500 000000 d0 : 10010006 BEQ $0, $1,6 283 taken 78

217 000000 d4 : 34610000 ORI $1, $3,0 217 000000 d8 : 00230820 ADD $1, $1, $3 217 000000 dc : 00231020 ADD $2, $1, $3 217 000000 e0 : 2001014 B ADDI $1, $0,14 B 217 000000 e4 : 00416820 ADD $13, $2, $1 217 000000 e8 : 0800003 D J 000003 D 283 000000 ec : 200103 F5 ADDI $1, $0,3 F5 283 000000 f0 : 00616822 SUB $13, $3, $1 500 000000 f4 : 20010001 ADDI $1, $0,1 500 000000 f8 : 01610822 SUB $1, $11, $1 500 000000 fc : 35820000 ORI $2, $12,0 500 00000100 : 35 A30000 ORI $3, $13,0 500 00000104 : 23 DE001C ADDI $30, $30,1C 500 00000108 : 0 C000028 JAL 0000028 500 0000010 c : 23 DEFFE4 ADDI $30, $30, FFE4 500 00000110 : 20010001 ADDI $1, $0,1 500 00000114 : 01611022 SUB $2, $11, $1 500 00000118 : 35 A10000 ORI $1, $13,0 500 0000011 c : 00421020 ADD $2, $2, $2 500 00000120 : 00421020 ADD $2, $2, $2 500 00000124 : 004 C1020 ADD $2, $2, $12 500 00000128 : AC410000 SW $1,0000( $2) 501 0000012 c : 8 FCB0010 LW $11,0010( $30 ) 501 00000130 : 8 FCC0014 LW $12,0014( $30 ) 501 00000134 : 8 FCD0018 LW $13,0018( $30 ) 501 00000138 : 8 FDF0000 LW $31,0000( $30 ) 501 0000013 c : 03 E00008 JR $31 6 00000140 : AFDF0000 SW $31,0000( $30 ) 6 00000144 : AFCB000C SW $11,000 C( $30 ) 6 00000148 : AFCC0010 SW $12,0010( $30 ) 6 0000014 c : 342 B0000 ORI $11, $1,0 6 00000150 : 344 C0000 ORI $12, $2,0 6 00000154 : 20010001 ADDI $1, $0,1 6 00000158 : 0161082 A SLT $1, $11, $1 6 0000015 c : 10010002 BEQ $0, $1,2 5 taken 1 00000160 : 20010000 ADDI $1, $0,0 1 00000164 : 08000067 J 0000067 5 00000168 : 20010064 ADDI $1, $0,64 5 0000016 c : 01610822 SUB $1, $11, $1 5 00000170 : 35820000 ORI $2, $12,0 5 00000174 : 23 DE0014 ADDI $30, $30,14 5 00000178 : 0 C000050 JAL 0000050 5 0000017 c : 23 DEFFEC ADDI $30, $30, FFEC 5 00000180 : 20010001 ADDI $1, $0,1 5 00000184 : 01610822 SUB $1, $11, $1 5 00000188 : 00210820 ADD $1, $1, $1 5 0000018 c : 00210820 ADD $1, $1, $1 5 00000190 : 002 C0820 ADD $1, $1, $12 5 00000194 : 8 C210000 LW $1,0000( $1) 5 00000198 : AC01FFF4 SW $1, FFF4 ( $0) 6 0000019 c : 8 FCB000C LW $11,000 C( $30 ) 6 000001 a0 : 8 FCC0010 LW $12,0010( $30 ) 6 000001 a4 : 8 FDF0000 LW $31,0000( $30 ) 6 000001 a8 : 03 E00008 JR $31 79

1 000001 ac : AFDF0000 SW $31,0000( $30 ) 1 000001 b0 : 34230000 ORI $3, $1,0 1 000001 b4 : 34460000 ORI $6, $2,0 1 000001 b8 : 34610000 ORI $1, $3,0 1 000001 bc : 20020000 ADDI $2, $0,0 1 000001 c0 : 37 A40000 ORI $4, $29,0 1 000001 c4 : 00210820 ADD $1, $1, $1 1 000001 c8 : 00210820 ADD $1, $1, $1 501 000001 cc : 10010004 BEQ $0, $1,4 1 taken 500 000001 d0 : AFA20000 SW $2,0000( $29 ) 500 000001 d4 : 2021 FFFC ADDI $1, $1, FFFC 500 000001 d8 : 23 BD0004 ADDI $29, $29,4 500 000001 dc : 08000073 J 0000073 1 000001 e0 : 34610000 ORI $1, $3,0 1 000001 e4 : 20020000 ADDI $2, $0,0 1 000001 e8 : 37 A50000 ORI $5, $29,0 1 000001 ec : 00210820 ADD $1, $1, $1 1 000001 f0 : 00210820 ADD $1, $1, $1 501 000001 f4 : 10010004 BEQ $0, $1,4 1 taken 500 000001 f8 : AFA20000 SW $2,0000( $29 ) 500 000001 fc : 2021 FFFC ADDI $1, $1, FFFC 500 00000200 : 23 BD0004 ADDI $29, $29,4 500 00000204 : 0800007 D J 000007 D 1 00000208 : 20010001 ADDI $1, $0,1 1 0000020 c : 34620000 ORI $2, $3,0 1 00000210 : 34 C30000 ORI $3, $6,0 1 00000214 : 23 DE000C ADDI $30, $30, C 1 00000218 : 0 C00008A JAL 000008 A 1 0000021 c : 23 DEFFF4 ADDI $30, $30, FFF4 1 00000220 : 8 FDF0000 LW $31,0000( $30 ) 1 00000224 : 03 E00008 JR $31 10 00000228 : AFDF0000 SW $31,0000( $30 ) 10 0000022 c : AFCB0018 SW $11,0018( $30 ) 10 00000230 : AFCC001C SW $12,001 C( $30 ) 10 00000234 : AFCD0020 SW $13,0020( $30 ) 10 00000238 : AFCE0024 SW $14,0024( $30 ) 10 0000023 c : AFCF0028 SW $15,0028( $30 ) 10 00000240 : 342 B0000 ORI $11, $1,0 10 00000244 : 344 C0000 ORI $12, $2,0 10 00000248 : 346 D0000 ORI $13, $3,0 10 0000024 c : 348 E0000 ORI $14, $4,0 10 00000250 : 34 AF0000 ORI $15, $5,0 10 00000254 : 016 C082A SLT $1, $11, $12 10 00000258 : 10010028 BEQ $0, $1,28 1 taken 9 0000025 c : 35610000 ORI $1, $11,0 9 00000260 : 20020000 ADDI $2, $0,0 9 00000264 : 35830000 ORI $3, $12,0 9 00000268 : 35 A40000 ORI $4, $13,0 9 0000026 c : 20050000 ADDI $5, $0,0 9 00000270 : 35 C60000 ORI $6, $14,0 9 00000274 : 20070000 ADDI $7, $0,0 9 00000278 : 35 E80000 ORI $8, $15,0 9 0000027 c : 23 DE002C ADDI $30, $30,2C 9 00000280 : 0 C0000C7 JAL 00000 C7 9 00000284 : 23 DEFFD4 ADDI $30, $30, FFD4 80

9 00000288 : 20020000 ADDI $2, $0,0 9 0000028 c : 00421020 ADD $2, $2, $2 9 00000290 : 00421020 ADD $2, $2, $2 9 00000294 : 00411020 ADD $2, $2, $1 9 00000298 : 8 C450000 LW $5,0000( $2) 9 0000029 c : 20020001 ADDI $2, $0,1 9 000002 a0 : 00421020 ADD $2, $2, $2 9 000002 a4 : 00421020 ADD $2, $2, $2 9 000002 a8 : 00411020 ADD $2, $2, $1 9 000002 ac : 8 C470000 LW $7,0000( $2) 9 000002 b0 : 35610000 ORI $1, $11,0 9 000002 b4 : 20020000 ADDI $2, $0,0 9 000002 b8 : 20030000 ADDI $3, $0,0 9 000002 bc : 35 A40000 ORI $4, $13,0 9 000002 c0 : 35 C60000 ORI $6, $14,0 9 000002 c4 : 35 E80000 ORI $8, $15,0 9 000002 c8 : 23 DE002C ADDI $30, $30,2C 9 000002 cc : 0 C000130 JAL 0000130 9 000002 d0 : 23 DEFFD4 ADDI $30, $30, FFD4 9 000002 d4 : 35610000 ORI $1, $11,0 9 000002 d8 : 002 B0820 ADD $1,$1, $11 9 000002 dc : 35820000 ORI $2, $12,0 9 000002 e0 : 35 A30000 ORI $3, $13,0 9 000002 e4 : 35 C40000 ORI $4, $14,0 9 000002 e8 : 35 E50000 ORI $5, $15,0 9 000002 ec : 23 DE002C ADDI $30, $30,2C 9 000002 f0 : 0 C00008A JAL 000008 A 9 000002 f4 : 23 DEFFD4 ADDI $30, $30, FFD4 9 000002 f8 : 080000 C0 J 00000 C0 1 000002 fc : 20010000 ADDI $1, $0,0 10 00000300 : 8 FCB0018 LW $11,0018( $30 ) 10 00000304 : 8 FCC001C LW $12,001 C( $30 ) 10 00000308 : 8 FCD0020 LW $13,0020( $30 ) 10 0000030 c : 8 FCE0024 LW $14,0024( $30 ) 10 00000310 : 8 FCF0028 LW $15,0028( $30 ) 10 00000314 : 8 FDF0000 LW $31,0000( $30 ) 10 00000318 : 03 E00008 JR $31 510 0000031 c : AFDF0000 SW $31,0000( $30 ) 510 00000320 : AFCB0024 SW $11,0024( $30 ) 510 00000324 : AFCC0028 SW $12,0028( $30 ) 510 00000328 : AFCD002C SW $13,002 C( $30 ) 510 0000032 c : AFCE0030 SW $14,0030( $30 ) 510 00000330 : AFCF0034 SW $15,0034( $30 ) 510 00000334 : AFD00038 SW $16,0038( $30 ) 510 00000338 : AFD1003C SW $17,003 C( $30 ) 510 0000033 c : AFD20040 SW $18,0040( $30 ) 510 00000340 : 34300000 ORI $16, $1,0 510 00000344 : 344 F0000 ORI $15, $2,0 510 00000348 : 346 E0000 ORI $14, $3,0 510 0000034 c : 348 D0000 ORI $13, $4,0 510 00000350 : 34 CC0000 ORI $12, $6,0 510 00000354 : 34 F10000 ORI $17, $7,0 510 00000358 : 350 B0000 ORI $11, $8,0 510 0000035 c : 01 EE082A SLT $1, $15, $14 510 00000360 : 1001001 F BEQ $0, $1,1F 9 taken 501 00000364 : 36010000 ORI $1, $16,0 501 00000368 : 35 E20000 ORI $2, $15,0 501 0000036 c : 35 C30000 ORI $3, $14,0 501 00000370 : 35 A40000 ORI $4, $13,0 81

501 00000374 : 35860000 ORI $6, $12,0 501 00000378 : 23 DE0044 ADDI $30, $30,44 501 0000037 c : 0 C000111 JAL 0000111 501 00000380 : 34320000 ORI $18, $1,0 501 00000384 : 23 DEFFBC ADDI $30, $30, FFBC 501 00000388 : 36010000 ORI $1, $16,0 501 0000038 c : 01 F01020 ADD $2, $15, $16 501 00000390 : 35 C30000 ORI $3, $14,0 501 00000394 : 35 A40000 ORI $4, $13,0 501 00000398 : 36250000 ORI $5, $17,0 501 0000039 c : 35660000 ORI $6, $11,0 501 000003 a0 : 23 DE0044 ADDI $30, $30,44 501 000003 a4 : 0 C000111 JAL 0000111 501 000003 a8 : 34270000 ORI $7, $1,0 501 000003 ac : 23 DEFFBC ADDI $30, $30, FFBC 501 000003 b0 : 36010000 ORI $1, $16,0 501 000003 b4 : 01 F01020 ADD $2, $15, $16 501 000003 b8 : 00501020 ADD $2, $2, $16 501 000003 bc : 35 C30000 ORI $3, $14,0 501 000003 c0 : 35 A40000 ORI $4, $13,0 501 000003 c4 : 36450000 ORI $5, $18,0 501 000003 c8 : 35860000 ORI $6, $12,0 501 000003 cc : 35680000 ORI $8, $11,0 501 000003 d0 : 23 DE0044 ADDI $30, $30,44 501 000003 d4 : 0 C0000C7 JAL 00000 C7 501 000003 d8 : 23 DEFFBC ADDI $30, $30, FFBC 501 000003 dc : 08000107 J 0000107 9 000003 e0 : 20010002 ADDI $1, $0,2 9 000003 e4 : 37 A20000 ORI $2, $29,0 9 000003 e8 : 00210820 ADD $1, $1, $1 9 000003 ec : 00210820 ADD $1, $1, $1 27 000003 f0 : 10010004 BEQ $0, $1,4 9 taken 18 000003 f4 : AFA50000 SW $5,0000( $29 ) 18 000003 f8 : 2021 FFFC ADDI $1, $1, FFFC 18 000003 fc : 23 BD0004 ADDI $29, $29,4 18 00000400 : 080000 FC J 00000 FC 9 00000404 : 20010001 ADDI $1, $0,1 9 00000408 : 00210820 ADD $1, $1, $1 9 0000040 c : 00210820 ADD $1, $1, $1 9 00000410 : 00220820 ADD $1, $1, $2 9 00000414 : AC310000 SW $17,0000( $1) 9 00000418 : 34410000 ORI $1, $2,0 510 0000041 c : 8 FCB0024 LW $11,0024( $30 ) 510 00000420 : 8 FCC0028 LW $12,0028( $30 ) 510 00000424 : 8 FCD002C LW $13,002 C( $30 ) 510 00000428 : 8 FCE0030 LW $14,0030( $30 ) 510 0000042 c : 8 FCF0034 LW $15,0034( $30 ) 510 00000430 : 8 FD00038 LW $16,0038( $30 ) 510 00000434 : 8 FD1003C LW $17,003 C( $30 ) 510 00000438 : 8 FD20040 LW $18,0040( $30 ) 510 0000043 c : 8 FDF0000 LW $31,0000( $30 ) 510 00000440 : 03 E00008 JR $31 5502 00000444 : AFDF0000 SW $31,0000( $30 ) 5502 00000448 : 0043382 A SLT $7, $2, $3 5502 0000044 c : 10070019 BEQ $0, $7,19 11 taken 82

5491 00000450 : 20070000 ADDI $7, $0,0 5491 00000454 : 00 E1382A SLT $7, $7, $1 5491 00000458 : 10070016 BEQ $0, $7,16 991 taken 4500 0000045 c : 34 A70000 ORI $7, $5,0 4500 00000460 : 34480000 ORI $8, $2,0 4500 00000464 : 01084020 ADD $8, $8, $8 4500 00000468 : 01084020 ADD $8, $8, $8 4500 0000046 c : 01044020 ADD $8, $8, $4 4500 00000470 : 8 D080000 LW $8,0000( $8) 4500 00000474 : 00 E73820 ADD $7, $7, $7 4500 00000478 : 00 E73820 ADD $7, $7, $7 4500 0000047 c : 00 E63820 ADD $7, $7, $6 4500 00000480 : ACE80000 SW $8,0000( $7) 4500 00000484 : 34270000 ORI $7, $1,0 4500 00000488 : 20010001 ADDI $1, $0,1 4500 0000048 c : 00 E10822 SUB $1, $7, $1 4500 00000490 : 34470000 ORI $7, $2,0 4500 00000494 : 20020001 ADDI $2, $0,1 4500 00000498 : 00 E21020 ADD $2, $7, $2 4500 0000049 c : 20070001 ADDI $7, $0,1 4500 000004 a0 : 00 A72820 ADD $5, $5, $7 4500 000004 a4 : 23 DE001C ADDI $30, $30,1C 4500 000004 a8 : 0 C000111 JAL 0000111 4500 000004 ac : 23 DEFFE4 ADDI $30, $30, FFE4 4500 000004 b0 : 0800012 E J 000012 E 1002 000004 b4 : 34 A10000 ORI $1, $5,0 5502 000004 b8 : 8 FDF0000 LW $31,0000( $30 ) 5502 000004 bc : 03 E00008 JR $31 510 000004 c0 : AFDF0000 SW $31,0000( $30 ) 510 000004 c4 : AFCB0024 SW $11,0024( $30 ) 510 000004 c8 : AFCC0028 SW $12,0028( $30 ) 510 000004 cc : AFCD002C SW $13,002 C( $30 ) 510 000004 d0 : AFCE0030 SW $14,0030( $30 ) 510 000004 d4 : AFCF0034 SW $15,0034( $30 ) 510 000004 d8 : AFD00038 SW $16,0038( $30 ) 510 000004 dc : AFD1003C SW $17,003 C( $30 ) 510 000004 e0 : AFD20040 SW $18,0040( $30 ) 510 000004 e4 : 342 F0000 ORI $15, $1,0 510 000004 e8 : 34900000 ORI $16, $4,0 510 000004 ec : 34 AE0000 ORI $14, $5,0 510 000004 f0 : 34 CB0000 ORI $11, $6,0 510 000004 f4 : 34 ED0000 ORI $13, $7,0 510 000004 f8 : 35110000 ORI $17, $8,0 510 000004 fc : 004 E082A SLT $1, $2, $14 510 00000500 : 14010002 BNE $0, $1,2 501 taken 9 00000504 : 006 D082A SLT $1, $3, $13 9 00000508 : 10010022 BEQ $0, $1,22 9 taken 501 0000050 c : 004 F0820 ADD $1, $2, $15 501 00000510 : 002 E082A SLT $1, $1, $14 501 00000514 : 10010002 BEQ $0, $1,2 9 taken 492 00000518 : 004 F6020 ADD $12, $2, $15 492 0000051 c : 08000149 J 0000149 9 00000520 : 35 CC0000 ORI $12, $14,0 501 00000524 : 006 F0820 ADD $1, $3, $15 501 00000528 : 002 D082A SLT $1, $1, $13 83

501 0000052 c : 10010002 BEQ $0, $1,2 11 taken 490 00000530 : 006 F9020 ADD $18, $3, $15 490 00000534 : 0800014 F J 000014 F 11 00000538 : 35 B20000 ORI $18, $13,0 501 0000053 c : 34410000 ORI $1, $2,0 501 00000540 : 34620000 ORI $2, $3,0 501 00000544 : 36030000 ORI $3, $16,0 501 00000548 : 35840000 ORI $4, $12,0 501 0000054 c : 35650000 ORI $5, $11,0 501 00000550 : 36460000 ORI $6, $18,0 501 00000554 : 36270000 ORI $7, $17,0 501 00000558 : 23 DE0044 ADDI $30, $30,44 501 0000055 c : 0 C000170 JAL 0000170 501 00000560 : 23 DEFFBC ADDI $30, $30, FFBC 501 00000564 : 35 E10000 ORI $1, $15,0 501 00000568 : 35820000 ORI $2, $12,0 501 0000056 c : 36430000 ORI $3, $18,0 501 00000570 : 36040000 ORI $4, $16,0 501 00000574 : 35 C50000 ORI $5, $14,0 501 00000578 : 35660000 ORI $6, $11,0 501 0000057 c : 35 A70000 ORI $7, $13,0 501 00000580 : 36280000 ORI $8, $17,0 501 00000584 : 23 DE0044 ADDI $30, $30,44 501 00000588 : 0 C000130 JAL 0000130 501 0000058 c : 23 DEFFBC ADDI $30, $30, FFBC 501 00000590 : 08000166 J 0000166 9 00000594 : 20010000 ADDI $1, $0,0 510 00000598 : 8 FCB0024 LW $11,0024( $30 ) 510 0000059 c : 8 FCC0028 LW $12,0028( $30 ) 510 000005 a0 : 8 FCD002C LW $13,002 C( $30 ) 510 000005 a4 : 8 FCE0030 LW $14,0030( $30 ) 510 000005 a8 : 8 FCF0034 LW $15,0034( $30 ) 510 000005 ac : 8 FD00038 LW $16,0038( $30 ) 510 000005 b0 : 8 FD1003C LW $17,003 C( $30 ) 510 000005 b4 : 8 FD20040 LW $18,0040( $30 ) 510 000005 b8 : 8 FDF0000 LW $31,0000( $30 ) 510 000005 bc : 03 E00008 JR $31 5001 000005 c0 : AFDF0000 SW $31,0000( $30 ) 5001 000005 c4 : 0024402 A SLT $8, $1, $4 5001 000005 c8 : 1008003 E BEQ $0, $8,3E 826 taken 4175 000005 cc : 0046402 A SLT $8, $2, $6 4175 000005 d0 : 1008002 C BEQ $0, $8,2C 291 taken 3884 000005 d4 : 34280000 ORI $8, $1,0 3884 000005 d8 : 01084020 ADD $8, $8, $8 3884 000005 dc : 01084020 ADD $8, $8, $8 3884 000005 e0 : 01054020 ADD $8, $8, $5 3884 000005 e4 : 8 D080000 LW $8,0000( $8) 3884 000005 e8 : 34490000 ORI $9, $2,0 3884 000005 ec : 01294820 ADD $9, $9, $9 3884 000005 f0 : 01294820 ADD $9, $9, $9 3884 000005 f4 : 01274820 ADD $9, $9, $7 3884 000005 f8 : 8 D290000 LW $9,0000( $9) 3884 000005 fc : 0109402 A SLT $8, $8, $9 3884 00000600 : 10080010 BEQ $0, $8,10 1891 taken 84

1993 00000604 : 00224020 ADD $8, $1, $2 1993 00000608 : 34290000 ORI $9, $1,0 1993 0000060 c : 01294820 ADD $9, $9, $9 1993 00000610 : 01294820 ADD $9, $9, $9 1993 00000614 : 01254820 ADD $9, $9, $5 1993 00000618 : 8 D290000 LW $9,0000( $9) 1993 0000061 c : 01084020 ADD $8, $8, $8 1993 00000620 : 01084020 ADD $8, $8, $8 1993 00000624 : 01034020 ADD $8, $8, $3 1993 00000628 : AD090000 SW $9,0000( $8) 1993 0000062 c : 20080001 ADDI $8, $0,1 1993 00000630 : 00280820 ADD $1, $1, $8 1993 00000634 : 23 DE0020 ADDI $30, $30,20 1993 00000638 : 0 C000170 JAL 0000170 1993 0000063 c : 23 DEFFE0 ADDI $30, $30, FFE0 1993 00000640 : 080001 A0 J 00001 A0 1891 00000644 : 00224020 ADD $8, $1, $2 1891 00000648 : 34490000 ORI $9, $2,0 1891 0000064 c : 01294820 ADD $9, $9, $9 1891 00000650 : 01294820 ADD $9, $9, $9 1891 00000654 : 01274820 ADD $9, $9, $7 1891 00000658 : 8 D290000 LW $9,0000( $9) 1891 0000065 c : 01084020 ADD $8, $8, $8 1891 00000660 : 01084020 ADD $8, $8, $8 1891 00000664 : 01034020 ADD $8, $8, $3 1891 00000668 : AD090000 SW $9,0000( $8) 1891 0000066 c : 20080001 ADDI $8, $0,1 1891 00000670 : 00481020 ADD $2, $2, $8 1891 00000674 : 23 DE0020 ADDI $30, $30,20 1891 00000678 : 0 C000170 JAL 0000170 1891 0000067 c : 23 DEFFE0 ADDI $30, $30, FFE0 3884 00000680 : 080001 B0 J 00001 B0 291 00000684 : 00224020 ADD $8, $1, $2 291 00000688 : 34290000 ORI $9, $1,0 291 0000068 c : 01294820 ADD $9, $9, $9 291 00000690 : 01294820 ADD $9, $9, $9 291 00000694 : 01254820 ADD $9, $9, $5 291 00000698 : 8 D290000 LW $9,0000( $9) 291 0000069 c : 01084020 ADD $8, $8, $8 291 000006 a0 : 01084020 ADD $8, $8, $8 291 000006 a4 : 01034020 ADD $8, $8, $3 291 000006 a8 : AD090000 SW $9,0000( $8) 291 000006 ac : 20080001 ADDI $8, $0,1 291 000006 b0 : 00280820 ADD $1, $1, $8 291 000006 b4 : 23 DE0020 ADDI $30, $30,20 291 000006 b8 : 0 C000170 JAL 0000170 291 000006 bc : 23 DEFFE0 ADDI $30, $30, FFE0 4175 000006 c0 : 080001 C4 J 00001 C4 826 000006 c4 : 0046402 A SLT $8, $2, $6 826 000006 c8 : 10080010 BEQ $0, $8,10 501 taken 325 000006 cc : 00224020 ADD $8, $1, $2 325 000006 d0 : 34490000 ORI $9, $2,0 325 000006 d4 : 01294820 ADD $9, $9, $9 325 000006 d8 : 01294820 ADD $9, $9, $9 325 000006 dc : 01274820 ADD $9, $9, $7 325 000006 e0 : 8 D290000 LW $9,0000( $9) 85

325 000006 e4 : 01084020 ADD $8, $8, $8 325 000006 e8 : 01084020 ADD $8, $8, $8 325 000006 ec : 01034020 ADD $8, $8, $3 325 000006 f0 : AD090000 SW $9,0000( $8) 325 000006 f4 : 20080001 ADDI $8, $0,1 325 000006 f8 : 00481020 ADD $2, $2, $8 325 000006 fc : 23 DE0020 ADDI $30, $30,20 325 00000700 : 0 C000170 JAL 0000170 325 00000704 : 23 DEFFE0 ADDI $30, $30, FFE0 325 00000708 : 080001 C4 J 00001 C4 501 0000070 c : 20010000 ADDI $1, $0,0 5001 00000710 : 8 FDF0000 LW $31,0000( $30 ) 5001 00000714 : 03 E00008 JR $31 Instruction : Occurences : JR 12042 ADD 101074 SUB 5793 AND 0 OR 0 XOR 0 SLT 27426 J 18607 JAL 12042 BEQ 28446 4850 taken BNE 1011 1001 taken ADDI 53727 SLTI 0 ANDI 0 ORI 57399 XORI 0 LUI 0 LW 38560 SW 32801 STOP 1 Total : 388929 F.9 primes1 This is SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen SimSys is open source. Share and enjoy. Please visit http :www. opensource. org to learn more about the open source concept. --------- Simulation generated by KREDS 2. 0. 8 on Sun Nov 23 19: 12: 27 MET 2003 SimSys : Building client model.. Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 5] is completely disconnected Warning : in orplane specification for BranchController : Predictor : BranchPLA : PLA orplane line [ 7] is completely disconnected SimSys : Completing channel setup.. SimSys : Verifying that all channels are connected.. SimSys : Model has 1480 components with 3012 inputs and 2320 outputs SimSys : Checking for cyclic dependencies.. SimSys : Scheduling activities.. 21 partitions SimSys : Estimating resource usage : 49594 transistors @ 797. 614 MHz MemIOSys : Cache & buffers : 9530 bytes (471 Ktrans ) MemIOSys : Occupied area corresponds to ~87 Ktrans logic 86

MemIOSys : Autoconfiguring for 797. 614 MHz operating frequency MemIOSys : Off - chip burst transaction is 80-3 -3-3 -3-3 -3-3 --------- Preparations complete. Now starting functional simulation. 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 Functional simulation completed. Shutting down --------- SimSys : The simulation comprised 93032710 evaluations in 762451 simulated cycles. That s 122 pr. cycle. On average 7% of the model was recomputed every cycle. SimSys : Elapsed time ( simulated ): 955. 915 micro - seconds. --------- MemIOSys : Off - chip burst transactions : reads : 7921 writes : 5893 MemIOSys : Off - chip transfers : 442048 bytes. MemIOSys : Off - chip bandwidth : 441. 012 Mbytes / sec. MemIOSys : Held & waited 593127 cycles MemIOSys : On - chip inst. fetches : 169324 MemIOSys : On - chip data - reads : 14750 MemIOsys : On - chip data - writes : 19217 MemIOSys : On - chip data memory bandwidth : 135. 549 Mbytes / sec. MemIOSys : On - chip instruction memory bandwidth : 675. 708 Mbytes / sec. This was SimSys 2. 9. 4, November 24 th 2002, ( C) Finn Schiermer Andersen F.9.1 statistik 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 profile : 1 00000000 : 201 E4000 ADDI $30, $0,4000 1 00000004 : 03 DEF020 ADD $30, $30, $30 1 00000008 : 03 DEF020 ADD $30, $30, $30 1 0000000 c : 03 DEE820 ADD $29, $30, $30 1 00000010 : 0 C000006 JAL 0000006 1 00000014 : FC000000 STOP 1 00000018 : AFDF0000 SW $31,0000( $30 ) 1 0000001 c : 200107 D0 ADDI $1, $0,7 D0 1 00000020 : 34240000 ORI $4, $1,0 1 00000024 : 20030001 ADDI $3, $0,1 1 00000028 : 37 A20000 ORI $2, $29,0 1 0000002 c : 00842020 ADD $4, $4, $4 1 00000030 : 00842020 ADD $4, $4, $4 2001 00000034 : 10040004 BEQ $0, $4,4 1 taken 2000 00000038 : AFA30000 SW $3,0000( $29 ) 2000 0000003 c : 2084 FFFC ADDI $4, $4, FFFC 2000 00000040 : 23 BD0004 ADDI $29, $29,4 2000 00000044 : 0800000 D J 000000 D 1 00000048 : 20030002 ADDI $3, $0,2 1 0000004 c : 23 DE0004 ADDI $30, $30,4 1 00000050 : 0 C000018 JAL 0000018 1 00000054 : 23 DEFFFC ADDI $30, $30, FFFC 1 00000058 : 8 FDF0000 LW $31,0000( $30 ) 1 0000005 c : 03 E00008 JR $31 1999 00000060 : AFDF0000 SW $31,0000( $30 ) 1999 00000064 : AFCB0010 SW $11,0010( $30 ) 1999 00000068 : AFCC0014 SW $12,0014( $30 ) 1999 0000006 c : AFCD0018 SW $13,0018( $30 ) 87

1999 00000070 : 342 B0000 ORI $11, $1,0 1999 00000074 : 344 C0000 ORI $12, $2,0 1999 00000078 : 346 D0000 ORI $13, $3,0 1999 0000007 c : 01 AB082A SLT $1, $13, $11 1999 00000080 : 10010025 BEQ $0, $1,25 1 taken 1998 00000084 : 35 A10000 ORI $1, $13,0 1998 00000088 : 00210820 ADD $1, $1, $1 1998 0000008 c : 00210820 ADD $1, $1, $1 1998 00000090 : 002 C0820 ADD $1, $1, $12 1998 00000094 : 8 C220000 LW $2,0000( $1) 1998 00000098 : 20010000 ADDI $1, $0,0 1998 0000009 c : 14220008 BNE $1, $2,8 303 taken 1695 000000 a0 : 35610000 ORI $1, $11,0 1695 000000 a4 : 35820000 ORI $2, $12,0 1695 000000 a8 : 20030001 ADDI $3, $0,1 1695 000000 ac : 01 A31820 ADD $3, $13, $3 1695 000000 b0 : 23 DE001C ADDI $30, $30,1C 1695 000000 b4 : 0 C000018 JAL 0000018 1695 000000 b8 : 23 DEFFE4 ADDI $30, $30, FFE4 1695 000000 bc : 08000045 J 0000045 303 000000 c0 : 2001076 C ADDI $1, $0,76 C 303 000000 c4 : 002 D082A SLT $1, $1, $13 303 000000 c8 : 10010003 BEQ $0, $1,3 290 taken 13 000000 cc : 35 A10000 ORI $1, $13,0 13 000000 d0 : AC01FFF4 SW $1, FFF4 ( $0) 13 000000 d4 : 08000037 J 0000037 290 000000 d8 : 20010000 ADDI $1, $0,0 303 000000 dc : 35610000 ORI $1, $11,0 303 000000 e0 : 35820000 ORI $2, $12,0 303 000000 e4 : 35 A30000 ORI $3, $13,0 303 000000 e8 : 35 A40000 ORI $4, $13,0 303 000000 ec : 23 DE001C ADDI $30, $30,1C 303 000000 f0 : 0 C00004C JAL 000004 C 303 000000 f4 : 23 DEFFE4 ADDI $30, $30, FFE4 303 000000 f8 : 35610000 ORI $1, $11,0 303 000000 fc : 35820000 ORI $2, $12,0 303 00000100 : 20030001 ADDI $3, $0,1 303 00000104 : 01 A31820 ADD $3, $13, $3 303 00000108 : 23 DE001C ADDI $30, $30,1C 303 0000010 c : 0 C000018 JAL 0000018 303 00000110 : 23 DEFFE4 ADDI $30, $30, FFE4 1998 00000114 : 08000047 J 0000047 1 00000118 : 20010000 ADDI $1, $0,0 1999 0000011 c : 8 FCB0010 LW $11,0010( $30 ) 1999 00000120 : 8 FCC0014 LW $12,0014( $30 ) 1999 00000124 : 8 FCD0018 LW $13,0018( $30 ) 1999 00000128 : 8 FDF0000 LW $31,0000( $30 ) 1999 0000012 c : 03 E00008 JR $31 4755 00000130 : AFDF0000 SW $31,0000( $30 ) 4755 00000134 : 0081282 A SLT $5, $4, $1 4755 00000138 : 1005000 C BEQ $0, $5, C 303 taken 88

4452 0000013 c : 34850000 ORI $5, $4,0 4452 00000140 : 20060000 ADDI $6, $0,0 4452 00000144 : 00 A52820 ADD $5, $5, $5 4452 00000148 : 00 A52820 ADD $5, $5, $5 4452 0000014 c : 00 A22820 ADD $5, $5, $2 4452 00000150 : ACA60000 SW $6,0000( $5) 4452 00000154 : 34650000 ORI $5, $3,0 4452 00000158 : 00852020 ADD $4, $4, $5 4452 0000015 c : 23 DE0014 ADDI $30, $30,14 4452 00000160 : 0 C00004C JAL 000004 C 4452 00000164 : 23 DEFFEC ADDI $30, $30, FFEC 4452 00000168 : 0800005 C J 000005 C 303 0000016 c : 20010000 ADDI $1, $0,0 4755 00000170 : 8 FDF0000 LW $31,0000( $30 ) 4755 00000174 : 03 E00008 JR $31 Instruction : Occurences : JR 6755 ADD 25805 SUB 0 AND 0 OR 0 XOR 0 SLT 7057 J 10158 JAL 6755 BEQ 9058 595 taken BNE 1998 303 taken ADDI 26857 SLTI 0 ANDI 0 ORI 22122 XORI 0 LUI 0 LW 14750 SW 19217 STOP 1 Total : 150533 89

G Kontrol H Kildekode Nedenfor følger en udskrift af kildekodefilerne i alfabetisk rækkefølge. H.1 alu.k alu ( ina {32} inb {32} opcode {3} ) >> ( Res {32} Zero {1} ) opcode >> [ select ] mux {3 32}; ## Forbind indkommende l i n j e r 000 And o p e r a t i o n ( ina inb )/2 >> andarray {32 2}; 001 Or o p e r a t i o n ( ina inb )/2 >> orarray {32 2}; 010 Add o p e r a t i o n ina inb 0{1} >> adder {32}; 011 U d e f i n e r e t o p e r a t i o n 100 U d e f i n e r e t o p e r a t i o n 101 U d e f i n e r e t o p e r a t i o n 90

110 Sub o p e r a t i o n ina ( inb >> #{ NotArray 32}) 1{1} >> subtractor { Adder 32}; 111 SLT bruger s u b t r a c t o r komponenten ## Forbind udgående l i n j e r 111 Set on l e s s than 0{31} (( subtractor [ cout ] >> #{ Not }) ina [31] inb [31] >> #{ Xor 3}) 110 Sub o p e r a t i o n subtractor [ sum ] Dummy værdi (0{32})*3 010 Add o p e r a t i o n adder [ sum ] 001 Or o p e r a t i o n orarray [ out ] 000 And o p e r a t i o n andarray [ out ] >> [in]mux [ out ] >> Res ; Zero f a l g e t e r kun r e l e v a n t ( og v a l i d t ) ved s u b t r a k t i o n. subtractor [ sum ] >> #{ Or 32} >> #{ Not } >> Zero ; adder [ cout ] >> _ {1}; end H.2 BranchCache.k BranchCache ( FirstData {32+ prec } PrevData {32+ prec } FirstDataWrite {1} PrevDataWrite {1} Write {1} Select {1}, prec ) >> ( DataOut {32+ prec }) Select >> [ select ] DataMux {1 32+ prec }, [ select ] WriteMux {1 1}; FirstData PrevData >> [ in] DataMux ; FirstDataWrite PrevDataWrite >> [ in] WriteMux ; DataMux [ out ] >> [ in] Register { WrEnFlipFlop 32+ prec 0 x3fffffff }[ out ] >> DataOut ; WriteMux [ out ] Write >> #{ And 2} >> [ wrenable ] Register ; end H.3 BranchController.k BranchController ( PC {32} PC4 {32} JumpData_Valid {1} JumpData_Correct {1} JumpData_Addr {32} JumpData_Follow {32} JumpRegData_Valid {1} JumpRegData_Correct {1} JumpRegData_Addr {32} JumpRegData_Follow {32} BranchData_Valid {1} BranchData_Correct {1} BranchData_Addr {32} BranchData_Follow {32}, sbc prec ) >> ( Prediction {32}) Predictor { BranchPred sbc prec }; PC >> #{ BranchHash prec } >> [ PC] Predictor ; PC4 >> [ PC4 ] Predictor ; JumpData_Valid 0{1} >> [ in] JumpDataMux { Mux 1 1} >> JumpDataFF {1 0}; JumpRegData_Valid 0{1} >> [ in] JumpRegDataMux { Mux 1 1} >> JumpRegDataFF {1 0}; BranchData_Valid 0{1} >> [ in] BranchDataMux { Mux 1 1} >> BranchDataFF {1 0}; JumpData_Valid >> [ select ] JumpDataMux ; JumpRegData_Valid >> [ select ] JumpRegDataMux ; BranchData_Valid >> [ select ] BranchDataMux ; 91

JumpData_Valid JumpDataFF >> #{ Or 2} >> [ wrenable ] JumpDataRegister { WrEnFlipFlop 2+32+ prec 0}; JumpRegData_Valid JumpRegDataFF >> #{ Or 2} >> [ wrenable ] JumpRegDataRegister { WrEnFlipFlop 2+32+ prec 0}; BranchData_Valid BranchDataFF >> #{ Or 2} >> [ wrenable ] BranchDataRegister { WrEnFlipFlop 2+32+ prec 0}; JumpDataMux JumpData_Correct ( JumpData_Addr >> #{ BranchHash prec }) JumpData_Follow >> [ in] JumpDataRegister ; JumpRegDataMux JumpRegData_Correct ( JumpRegData_Addr >> #{ BranchHash prec }) JumpRegData_Follow >> [ in] JumpRegDataRegister ; BranchDataMux BranchData_Correct ( BranchData_Addr >> #{ BranchHash prec }) BranchData_Follow >> [ in] BranchDataRegister ; SearchMux { FastMux 3 prec +33}; Prioritizer { Prioritizer 3}; JumpDataRegister [ out : prec +33] JumpRegDataRegister [ out : prec +33] BranchDataRegister [ out : prec +33] >> Prioritizer [ out ] >> [ select ] SearchMux ; JumpDataRegister [ out :( prec +32)..0] JumpRegDataRegister [ out :( prec +32)..0] BranchDataRegister [ out :( prec +32)..0] >> [ in] SearchMux ; Prioritizer [ valid ] >> [ Write ] Predictor ; SearchMux [ out : prec +31..0] >> [Addr, Follow ] Predictor ; SearchMux [ out : prec +32] >> [ Correct ] Predictor ; Predictor [ Prediction ] >> Prediction ; end H.4 BranchHash.k BranchHash (in {32}, prec ) >> ( out { prec }) 0{2} i n [ prec 1.. 0 ] >> out _{ 2 } ; i n >> _{ 3 2 } ; in /2 >> (#{ XorArray 16 2})/2 >> #{ XorArray 8 2} >> out end H.5 BranchPLA.k BranchPLA ( In {2} Correct {1}) >> ( Out {2}) BranchPlane = In [ 1 ] In [ 0 ] Correct " 111 11," " 110 1-," " 101 11," " 100-1," " 011 1-," " 010 --," " 001-1," " 000 --"; In [1] In [0] Correct >> PLA { BranchPlane } >> Out ; end 92

H.6 BranchPred.k Alias (in{sz}, sz) >> ( out {sz }) in >> out end BranchPred ( PC{ prec } PC4 {32} Addr { prec } Follow {32} Correct {1} Write {1}, sbc prec ) >> ( Prediction {32}) PBC { BranchCache prec }; SBC { BranchCacheArray sbc prec }; SRC { Search sbc +1 prec }; SRCMux { FastMux sbc +1 32+ prec }; OutMux { Mux 1 32}; PredSRC { Search sbc +1 prec }; PredSRCMux { FastMux sbc +1 32+ prec }; Correct SRCMux [ out :31+ prec ] >> #{ Xor 2} >> #{ Not } >> [ Correct ] BranchPLA ; SRCMux [ out :31+ prec..30+ prec ] >> [In] BranchPLA ; Brugt ved dynamiske f o r u d s i g e r (1{1} 1{1} Follow [29..0] Addr ) BranchPLA SRCMux [ out : prec +29..0] >> [ PrevData, FirstData ] PBC ; Brugt ved 2 b i t f o r u d s i g e r ( Correct Correct Follow [ 2 9.. 0 ] Addr ) BranchPLA SRCMux[ out : prec + 2 9.. 0 ] >> [ PrevData, FirstData ] PBC ; SBC [ DataOut ] PBC [ DataOut ] >> _ {32+ prec } [ PrevData ] SBC ; PBC [ DataOut ]* sbc >> [ FirstData ] SBC ; Addr >> [ key ] SRC ; PC >> [ key ] PredSRC ; Write *( sbc +1) >> [ Write ] PBC [ Write ] SBC ; ( SBC [ DataOut ] PBC [ DataOut ])/( sbc +1)[ prec -1..0] >> [ keys ]SRC, [ keys ] PredSRC ; ( SBC [ DataOut ] PBC [ DataOut ]) >> [in]srcmux, [in] PredSRCMux ; SRC [ hits ] >> [ select ] SRCMux ; PredSRC [ hits ] >> [ select ] PredSRCMux ; SRC [ hits ] >> ([ Select ]SBC, [ FirstDataWrite ] SBC ) _ {1}; Hit >> [ Select ] PBC ; Write >> [ FirstDataWrite ] PBC ; PredSRCMux [32+ prec -1.. prec ] PC4 >> [ in] OutMux ; SRC [ hits ] >> #{ Or sbc +1} >> Hit { Alias 1}; Brugt ved dynamiske f o r u d s i g e r PredSRC [ hits ] >> #{ Or sbc +1} >> [ select ] OutMux ; Brugt ved 2 b i t f o r u d s i g e r e ( PredSRC [ h i t s ] >> #{Or sbc +1}) PredSRCMux [ out :31+ prec ] >> #{And 2} >> [ s e l e c t ] OutMux ; ( Hit >> #{ Not })*( sbc +1) >> [ PrevDataWrite ] SBC [ PrevDataWrite ] PBC ; 0{2} OutMux [29..0] >> Prediction ; PredSRCMux [31..0] >> _ {32}; Follow [31..30] >> _ {2}; OutMux [31..30] >> _ {2}; end H.7 control.k Control ( ID_Opcode {6} ID_Func {6} ) >> ( ALUOp {3} 93

) ALUSrc {1} BEQ {1} BNE {1} Jump {1} JumpReg {1} Link {1} MemRead {1} MemtoReg {1} MemWrite {1} RegDst {1} RegWrite {1} SignExt {1} Kontrol PLA en Opcode [ 5 ] Opcode [ 4 ] Opcode [ 3 ] Opcode [ 2 ] Opcode [ 1 ] Opcode [ 0 ] Func [ 5 ] Func [ 4 ] Func [ 3 ] Func [ 2 ] Func [ 1 ] Func [ 0 ] BA9876543210 controlplane = " 000000100000 ----1--------1-, " add " 000000100010 ---11--------1-, " sub " 000000101010 ---111-------1-, " s l t " 000000100100 -------------1-, " and " 000000100101 -----1-------1-, " or " 000000001000 ----1----1-----, " j r " 100011 - - - - - - 111-1 - - - - - -1-11, " lw " 101011 - - - - - - 1-1-1-----1----, " sw " 000100 - - - - - - --111---1------, " beq " 000101 - - - - - - --111--1-------, " bne " 000010 - - - - - - ------1--------, " j " 000011 - - - - - - ------1-----11-, " j a l " 001000 - - - - - - 111-1--------1-, " addi " 001010 - - - - - - 111111 - - - - - - -1 -, " s l t i " 001100 - - - - - - 11-----------1-, " andi " 001101 - - - - - - 11---1-------1- "; o r i EDCBA9876543210 MemtoReg RegWrite Link MemRead MemWrite JumpReg BEQ BNE Jump ALUOp[ 0 ] ALUOp[ 1 ] ALUOp[ 2 ] SignExt RegDst ALUSrc ID_Opcode ID_Func 94

>> #{ PLA controlplane } >> ALUSrc RegDst SignExt ALUOp Jump BNE BEQ JumpReg MemWrite MemRead Link RegWrite MemtoReg ; end H.8 forwarddetectionunit.k ForwardDetectionUnit ( ID_readReg1 {5} ID_readReg2 {5} ID_ALUSrc {1} EX_destReg {5} EX_RegWrite {1} EX_Link {1} MEM_destReg {5} MEM_RegWrite {1} MEM_MemtoReg {1} WB_destReg {5} WB_RegWrite {1} Reg_WriteData {32} Reg_ReadData1 {32} Reg_ReadData2 {32} ) >> ( ALUMUXaSelect {5} ALUMUXbSelect {6} SWMuxSelect {5} HDU_Reg1EXCompare {1} HDU_Reg2EXCompare {1} regdata1 {32} regdata2 {32} ) Lav f o r warding f r a WB f a s e n t i l ID f a s e n Undersøg om det e r r e g i s t e r $0 der s k r i v e s t i l WB_destReg >> #{ Or 5} >> WBdestRegEq0 { Not }; Sammenlign det r e g i s t e r der evt. s k r i v e s t i l med de r e g i s t r e, der evt. l æ s e s f r a. 0 betyder j a ( ID_readReg1 WB_destReg )/2 WBdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg1WBCompare { Or 6}; ( ID_readReg2 WB_destReg )/2 WBdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg2WBCompare { Or 6}; Mux det r i g t i g e output Reg1WBCompare >> WB_RegWrite #{ Not } >> #{ And 2} >> [ select ] readmux1 { Mux 1 32}; Reg_WriteData Reg_ReadData1 >> [ in] readmux1 >> regdata1 ; Reg2WBCompare >> WB_RegWrite #{ Not } >> #{ And 2} >> [ select ] readmux2 { Mux 1 32}; Reg_WriteData Reg_ReadData2 >> [ in] readmux2 >> regdata2 ; Forbered fowarding i næste c y k l u s Test om d e s t i n a t i o n s r e g i s t r e n e i de to f a s e r e r $0 1 betyder j a EX_destReg >> #{ Or 5} >> EXdestRegEq0 { Not }; MEM_destReg >> #{ Or 5} >> MEMdestRegEq0 { Not }; Sammenlign de r e g i s t r e der l æ s e s f r a med der evt. s k r i v e s t i l. 0 betyder match ( ID_readReg1 EX_destReg )/2 EXdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg1EXCompare { Or 6}; 95

( ID_readReg2 EX_destReg )/2 EXdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg2EXCompare { Or 6}; ( ID_readReg1 MEM_destReg )/2 MEMdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg1MEMCompare { Or 6}; ( ID_readReg2 MEM_destReg )/2 MEMdestRegEq0 >> #{ XorArray 5 2} {1} >> Reg2MEMCompare { Or 6}; ALUMUXa PLA en EX. RegWrite EX. Link Reg1EXCompare MEM. RegWrite MEM. MemtoReg Reg1MEMCompare 543210 PlaneA = " 110 - - - -1---, " " 100 - - - --1--, " " 0 - -110 ----1, " " 1-1110 ----1, " " 0 - -100 ---1-, " " 1-1100 ---1-, " " --1--1 1----, " " 0--0-- 1----, " " 0 - -1-1 1----, " " 1-10 - - 1---- "; 43210 ALUMUXaSelect [ 0 ] ALUMUXaSelect [ 1 ] ALUMUXaSelect [ 2 ] ALUMUXaSelect [ 3 ] ALUMUXaSelect [ 4 ] EX_RegWrite EX_Link Reg1EXCompare MEM_RegWrite MEM_MemtoReg Reg1MEMCompare >> #{ PLA PlaneA } >> ALUMUXaSelect ; ALUMUXb PLA en EX. RegWrite EX. Link Reg2EXCompare MEM. RegWrite MEM. MemtoReg Reg2MEMCompare ID. ALUSrc 6543210 PlaneB = " 110 - - -0 --1---, " " 100 - - -0 ---1--, " " 0 - -1100 -----1, " " 1-11100 -----1, " " 0 - -1000 ----1-, " " 1-11000 ----1-, " " --1--10-1----, " " 0--0--0-1----, " " 0 - -1-10 1-----, " " 1-10 - -0 1-----, " " ------1 1----- "; 543210 ALUMUXbSelect [ 0 ] ALUMUXbSelect [ 1 ] ALUMUXbSelect [ 2 ] ALUMUXbSelect [ 3 ] ALUMUXbSelect [ 4 ] ALUMUXbSelect [ 5 ] 96

EX_RegWrite EX_Link Reg2EXCompare MEM_RegWrite MEM_MemtoReg Reg2MEMCompare ID_ALUSrc >> #{ PLA PlaneB } >> ALUMUXbSelect ; SWMux PLA en EX. RegWrite EX. Link Reg2EXCompare MEM. RegWrite MEM. MemtoReg Reg2MEMCompare 543210 SWPlane = " 110 - - - -1---, " " 100 - - - --1--, " " 0 - -110 ----1, " " 1-1110 ----1, " " 0 - -100 ---1-, " " 1-1100 ---1-, " " --1--1 1----, " " 0--0-- 1----, " " 0 - -1-1 1----, " " 1-10 - - 1---- "; 43210 SWMuxSelect [ 0 ] SWMuxSelect [ 1 ] SWMuxSelect [ 2 ] SWMuxSelect [ 3 ] SWMuxSelect [ 4 ] EX_RegWrite EX_Link Reg2EXCompare MEM_RegWrite MEM_MemtoReg Reg2MEMCompare >> #{ PLA SWPlane } >> SWMuxSelect ; Før sammenligningerne a f de r e g i s t r e der l æ s e s f r a med det r e g i s t e r som EX i n s t r u k t i o n e n evt. s k r i v e r t i l v i d e r e t i l HDU en Reg1EXCompare >> HDU_Reg1EXCompare ; Reg2EXCompare >> HDU_Reg2EXCompare ; end H.9 hazarddetection-unit.k HazardDetectionUnit ( IF_PC {32} ID_PC {32} EX_PC {32} ID_Opcode {6} ID_Func {6} MEM_ALURes {32} MEM_MemWrite {1} EX_MemRead {1} Reg1Compare {1} Reg2Compare {1} ) >> ( OverridePC {1} NOP_EX {1} NOP_ID {1} NOP_IF {1} STALL_IFandID {1} ) 97

SW ( s e l v m o d i f i c e r e n d e kode ) Sammenlign a d r e s s e r n e på i n s t r u k t i o n e r n e i IF, ID og EX f a s e r n e med den a d r e s s e SW s k r i v e r t i l (MEM. ALURes) ( IF_PC MEM_ALURes )/2 >> #{ XorArray 32 2} >> IFCompare { Or 32}; ( ID_PC MEM_ALURes )/2 >> #{ XorArray 32 2} >> IDCompare { Or 32}; ( EX_PC MEM_ALURes )/2 >> #{ XorArray 32 2} >> EXCompare { Or 32}; PLA en der s æ t t e r nop s i g n a l e r n e MEM. MemWrite EXCompare IDCompare IFCompare SWPlane = " 10-- 111, " " 110 - -11, " " 1110 --1 "; NOP. IF NOP. ID NOP.EX MEM_MemWrite EXCompare IDCompare IFCompare >> SWPLA { SWPlane }; Sæt udgangene SWPLA >> NOP_EX NOP_ID ( NOP_IF, OverridePC ); LW ( kan i k k e forwarde t i l i n s t r u k t i o n l i g e e f t e r ) Sammenlign opkoden og func koden med f o r s k e l l i g e k o n s t a n t e r ID_PC [31..26] >> OpcodeEq0 { Or 6}; ( ID_Opcode 2{6} )/2 >> #{ XorArray 6 2} >> OpcodeEq2 { Or 6}; ( ID_Opcode 3{6} )/2 >> #{ XorArray 6 2} >> OpcodeEq3 { Or 6}; ( ID_Opcode 4{6} )/2 >> #{ XorArray 6 2} >> OpcodeEq4 { Or 6}; ( ID_Opcode 5{6} )/2 >> #{ XorArray 6 2} >> OpcodeEq5 { Or 6}; ( ID_Opcode 43{6} )/2 >> #{ XorArray 6 2} >> OpcodeEq43 { Or 6}; ( ID_Func 8{6} )/2 >> #{ XorArray 6 2} >> FuncEq8 { Or 6}; PLA en EX. MemRead Reg1Compare Reg2Compare OpcodeEq0 OpcodeEq2 OpcodeEq3 OpcodeEq4 OpcodeEq5 OpcodeEq43 FuncE8q LWPlane = " 10--11---- 1, " " 1-00-----1 1, " " 1-0---0--- 1, " " 1-0----0-- 1, " " 1-0-----0-1 "; S t a l l. IF&ID EX_MemRead Reg1Compare Reg2Compare OpcodeEq0 OpcodeEq2 OpcodeEq3 OpcodeEq4 OpcodeEq5 OpcodeEq43 FuncEq8 >> LWPLA { LWPlane } >> STALL_IFandID ; end H.10 misprediction-unit.k MispredictionUnit ( IF_PC {32} ID_PC {32} EX_PC {32} 98

MEM_PC {32} ID_JumpAddr {32} EX_PCPlus4 {32} MEM_ALURes {32} MEM_BranchAddr {32} MEM_PCPlus4 {32} ID_Jump {1} EX_BEQ {1} EX_BNE {1} EX_Jump {1} EX_JumpReg {1} EX_RegWrite {1} EX_MemWrite {1} MEM_JumpReg {1} MEM_BEQ {1} MEM_BNE {1} MEM_ALUZero {1} ) >> ( PCMux_Select {6} JumpData_Valid {1} JumpData_Correct {1} JumpData_Addr {32} JumpData_Follow {32} JumpRegData_Valid {1} JumpRegData_Correct {1} JumpRegData_Addr {32} JumpRegData_Follow {32} BranchData_Valid {1} BranchData_Correct {1} BranchData_Addr {32} BranchData_Follow {32} NOP_IF {1} NOP_ID {1} NOP_EX {1} ) J : Sammenlign hop a d r e s s e n med den e f t e r f ø l g e n d e a d r e s s e ( ID_JumpAddr IF_PC )/2 >> #{ XorArray 32 2} >> JCompare { Or 32}; JR : Sammenlign hop a d r e s s e n med den e f t e r f ø l g e n d e a d r e s s e ( MEM_ALURes EX_PC )/2 >> #{ XorArray 32 2} >> JRCompare { Or 32}; BEQ/BNE: Sammenlign branch a d r e s s e n med den e f t e r f ø l g e n d e a d r e s s e ( MEM_BranchAddr EX_PC )/2 >> #{ XorArray 32 2} >> BCompare { Or 32}; og PC+4 ( MEM_PCPlus4 EX_PC )/2 >> #{ XorArray 32 2} >> MEMCompare { Or 32}; Andre : Sammenlign PC+4 med addr. på den e f t e r f ø l g e n d e i n s t. ( EX_PCPlus4 ID_PC )/2 >> #{ XorArray 32 2} >> EXCompare { Or 32}; Undersøg om i n s t. i Ex f a s e n s k a l e f t e r f ø l g e s a f PC+4 EX_BEQ EX_BNE EX_Jump EX_JumpReg EX_RegWrite EX_MemWrite >> #{ NotArray 4} #{ Or 2} >> EXNotJump { And 5}; Undersøg om der en branch i n s t r u k t i o n i MEM f a s e n MEM_BEQ MEM_BNE >> MEMBranch { Or 2}; Undersøg om b r a n c h b e t i n g e l s e n e r o p f y l d t MEM_BEQ MEM_ALUZero *2 MEM_BNE >> {2} #{ Not } {1} >> #{ AndArray 2 2} >> BranchCond { Or 2}; PLA en 99

BCompare MEMCompare MEMBranch BranchCond JRCompare MEM_JumpReg EXCompare EXNotJump JCompare ID_Jump plane = " 1-11------ ----1-1-----111, " " -110------ -----11-----111, " " 0-11 - -11 - - --1---11-----11, " " -010 - -11 - - --1---11-----11, " " 0-11 - -0111-1----11--1---1, " " -010 - -0111-1----11--1---1, " " 0-11 - - -011-1----11--1---1, " " -010 - - -011-1----11--1---1, " " 0-11 - -0101 1-----11--11---, " " -010 - -0101 1-----11--11---, " " 0-11 - - -001 1-----11--11---, " " -010 - - -001 1-----11--11---, " " 0-11 - -01-0 1-----11-------, " " -010 - -01-0 1-----11-------, " " 0-11 - - -0-0 1-----11-------, " " -010 - - -0-0 1-----11-------, " " ----11---- ---1----1---111, " " ----0111-- --1-----11---11, " " - - - -010111-1------111---1, " " - - - -010101 1-------1111---, " " - - - -0101-0 1-------11-----, " " --0--011-- --1----------11, " " - -0 - -00111-1--------1---1, " " - -0 - -00101 1---------11---, " " - -0 - -001-0 1--------------, " " - -0 - -0-011 -1--------1---1, " " - -0 - -0-001 1---------11---, " " --0--0-0-0 1-------------- "; NOP_IF NOP_ID NOP_EX JumpData_Correct JumpData_Valid JumpRegData_Correct JumpRegData_Valid BranchData_Correct BranchData_Valid PCMux_Select [ 0 ] PCMux_Select [ 1 ] PCMux_Select [ 2 ] PCMux_Select [ 3 ] PCMux_Select [ 4 ] PCMux_Select [ 5 ] BCompare MEMCompare MEMBranch BranchCond JRCompare MEM_JumpReg EXCompare EXNotJump JCompare ID_Jump >> #{ PLA plane } >> PCMux_Select BranchData_Valid BranchData_Correct JumpRegData_Valid JumpRegData_Correct JumpData_Valid JumpData_Correct NOP_EX NOP_ID NOP_IF ; 100

Opsæt feed back t i l p r e d i c t o r e n ID_PC ID_JumpAddr >> JumpData_Addr JumpData_Follow ; MEM_PC MEM_ALURes >> JumpRegData_Addr JumpRegData_Follow ; Branch feedback afhænger a f om b e t i n g e l s e n e r o p f y l d t BranchCond >> [ select ] branchmux {1 32}; MEM_BranchAddr MEM_PCPlus4 >> [ in] branchmux ; MEM_PC branchmux >> BranchData_Addr BranchData_Follow ; end H.11 pipelined.k Implementation a f p i p e l i n e d m i k r o a r k i t e k t u r. Argumentet " p r e d i c t o r " a n g i v e r om p r e d i c t o r e n s k a l s l å s t i l. t r u e => a r k i t e k t u r e n f o r s ø g e r at gætte næste i n s t r u k t i o n f a l s e => a r k i t e k t u r e n " gætter " a l t i d på PC+4 main ( predictor ) Diagrammet implementeres f r a v e n s t r e mod højre, s t a r t e n d e ved IF f a s e n IF f a s e n Der l æ s e s a l t i d i n s t r u k t i o n e r : PC1 { WrEnFlipFlop 32 0} >> [ iaddrin ] mem { MemIOSys 7 5 5 100 3 0}; 1{1} >> [ ird ] mem ; Send data t i l hazard og m i s p r e d i c t i o n enhederne PC{ WrEnFlipFlop 32 0} >> [ IF_PC ] HDU { HazardDetectionUnit }, [ IF_PC ] MDU { MispredictionUnit }; PC+4 PC 4{32} 0{1} >> PCPlus4 { Adder 32}[ cout ] >> _ {1}; Med/uden f o r u d s i g e l s e if predictor then BranchController {16 8}; PC >> [ PC] BranchController ; PCPlus4 [ sum ] >> [ PC4 ] BranchController ; MDU [ JumpData_Valid ] >> [ JumpData_Valid ] BranchController ; MDU [ JumpData_Correct ] >> [ JumpData_Correct ] BranchController ; MDU [ JumpData_Addr ] >> [ JumpData_Addr ] BranchController ; MDU [ JumpData_Follow ] >> [ JumpData_Follow ] BranchController ; MDU [ JumpRegData_Valid ] >> [ JumpRegData_Valid ] BranchController ; MDU [ JumpRegData_Correct ] >> [ JumpRegData_Correct ] BranchController ; MDU [ JumpRegData_Addr ] >> [ JumpRegData_Addr ] BranchController ; MDU [ JumpRegData_Follow ] >> [ JumpRegData_Follow ] BranchController ; MDU [ BranchData_Valid ] >> [ BranchData_Valid ] BranchController ; MDU [ BranchData_Correct ] >> [ BranchData_Correct ] BranchController ; MDU [ BranchData_Addr ] >> [ BranchData_Addr ] BranchController ; MDU [ BranchData_Follow ] >> [ BranchData_Follow ] BranchController ; BranchController >> [ in :191..160] PCMux ; else Før PC+4 uændret t i l PC muxen ( på l i n j e 5) PCPlus4 [ sum ] >> [in :191..160] PCMux ; Drain feedback l i n j e r n e MDU [ JumpData_Valid ] MDU [ JumpData_Correct ] MDU [ JumpData_Addr ] MDU [ JumpData_Follow ] MDU [ JumpRegData_Valid ] MDU [ JumpRegData_Correct ] MDU [ JumpRegData_Addr ] MDU [ JumpRegData_Follow ] MDU [ BranchData_Valid ] MDU [ BranchData_Correct ] MDU [ BranchData_Addr ] MDU [ BranchData_Follow ] >> _ {198}; end ; / MDU[ JumpData_Correct ] MDU[ JumpRegData_Correct ] MDU[ BranchData_Correct ] 101

MDU[ JumpData_Valid ] MDU[ JumpRegData_Valid ] MDU[ BranchData_Valid ] / 1{1} Misses (( MDU [ JumpData_Correct ] >> #{ Not }) MDU [ JumpData_Valid ] >> #{ And 2}) (( MDU [ JumpRegData_Correct ] >> #{ Not }) MDU [ JumpRegData_Valid ] >> #{ And 2}) (( MDU [ BranchData_Correct ] >> #{ Not }) MDU [ BranchData_Valid ] >> #{ And 2}) Hits ( MDU [ JumpData_Correct ] MDU [ JumpData_Valid ] >> #{ And 2}) ( MDU [ JumpRegData_Correct ] MDU [ JumpRegData_Valid ] >> #{ And 2}) ( MDU [ BranchData_Correct ] MDU [ BranchData_Valid ] >> #{ And 2}) >> [ count ] SimSysCtrl {7}; Før l i n j e r ind i IF/ID grænsen PC >> [ PC] IF_ID { PipeStageBoundary SANC [ IF_ID_Write ]}; PCPlus4 [ sum ] >> [ PCPlus4 ] IF_ID ; mem [ idataout ] >> zif_id { ZapBoundary SANC [ IF_ID_Zap ]} >> [ inst ] IF_ID ; Stop s i m u l a t i o n e n når i n s t r u k t i o n e n FC000000 når MEM f a s e n mem [ idataout :31..26] >> #{ And 6} >> zif_id2 { ZapBoundary SANC [ IF_ID_Zap ]} >> {1} >> [ stop ] IF_ID ; IF_ID [ stop ] >> {1} >> zid_ex11 { ZapBoundary SANC [ ID_EX_Zap ]} >> {1} >> [ stop ] ID_EX ; ID_EX [ stop ] >> {1} >> zex_mem9 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ stop ] EX_MEM ; EX_MEM [ stop ] >> [ stop ] SimSysCtrl ; ID f a s e n Send data t i l HDU en og MDU en IF_ID [PC] >> ( [ ID_PC ]HDU, [ ID_PC ] MDU ); IF_ID [ inst :31..26] >> [ ID_Opcode ] HDU ; IF_ID [ inst :5..0] >> [ ID_Func ] HDU ; Lav c o n t r o l s i g n a l e r n e IF_ID [ inst :31..26] IF_ID [ inst :5..0] >> ID_Control ; Sæt r e g i s t r e n e op Læs data IF_ID [ inst :25..21] >> [ rdselect :4..0] regs { RegFile 1 2 5 32}[ rddata :31..0] >> [ Reg_ReadData1 ] FDU { ForwardDetectionUnit }; IF_ID [ inst :20..16] >> [ rdselect :9..5] regs [ rddata :63..32] >> [ Reg_ReadData2 ] FDU ; S k r i v Data MEM_WB [ destreg ] >> [ wrselect ]regs, [ idxin ]vw{ ValidateWrite 1 5 32 "r "}; Flag t i l b e s k y t t e l s e a f r e g i s t e r $0 MEM_WB [ destreg ] >> RegZapWrite { Or 5}; RegZapWrite >> [0] regwrite { And 2}; MEM_WB [ RegWrite ] >> [1] regwrite ; regwrite >> [ wrenable ]regs, [ wrenable ]vw; Muxen, der vælger mellem l æ s t data og PC+4/ALURes RegWriteMux { Mux 1 32} >> ( [ wrdata ]regs, [ Reg_WriteData ]FDU, [ datain ]vw ); 102

Opsæt f o r warding d e t e c t i o n enheden Ind data IF_ID [ inst :25..16] >> [ ID_readReg1 ] FDU [ ID_readReg2 ] FDU ; ID_Control [ ALUSrc ] >> [ ID_ALUSrc ] FDU ; ID_EX [ destreg ] >> [ EX_destReg ] FDU ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] FDU ; ID_EX [ Link ] >> [ EX_Link ] FDU ; EX_MEM [ destreg ] >> [ MEM_destReg ] FDU ; EX_MEM [ RegWrite ] >> [ MEM_RegWrite ] FDU ; EX_MEM [ MemtoReg ] >> [ MEM_MemtoReg ] FDU ; MEM_WB [ destreg ] >> [ WB_destReg ] FDU ; MEM_WB [ RegWrite ] >> [ WB_RegWrite ] FDU ; Data t i l hazard d e t e c t i o n enheden FDU [ HDU_Reg1EXCompare ] FDU [ HDU_Reg2EXCompare ] >> [ Reg1Compare ] HDU [ Reg2Compare ] HDU ; Opsæt muxen, der vælger d e s t i n a t i o n s r e g i s t r e t 100 = l i n k 010 = i e l l e r lw i n s t r u k t i o n 001 = r e s t e n : ) ( ID_Control [ Link ] ID_Control [ RegDst ] )*2 >> {2} #{ Or 2} >> {2} #{ Not } >> [ select ] ID_destReg { FastMux 3 5}; 31{5} IF_ID [ inst :20..11] >> [ in] ID_destReg ; Sammensæt jump a d r e s s e og f ø r den ind i MDU en og PC muxen IF_ID [ PCPlus4 :31..28] IF_ID [ inst :25..0] 0{2} >> ( [ ID_JumpAddr ]MDU, [in :159..128] PCMux ); ID_Control [ Jump ] >> [ ID_Jump ] MDU ; Beregn branch a d r e s s e n IF_ID [ inst :15] ID_Control [ SignExt ] IF_ID [ inst :15..0] IF_ID [ PCPlus4 ] >> (#{ And 2})*14 {16} 0{2} {32} 0{1} >> ID_BranchAddr { Adder 32}[ cout ] >> _ {1}; Før den udvidede konstant ind i ID/EX grænsen IF_ID [ inst :15] ID_Control [ SignExt ] IF_ID [ inst :15..0] >> (#{ And 2})*16 {16} >> [ extimm ] ID_EX { PipeStageBoundary SANC [ ID_EX_Write ]}; Før r e s t e n a f l i n j e r n e ind i ID/EX grænsen IF_ID [ PC] >> {32} >> [ PC] ID_EX ; IF_ID [ PCPlus4 ] >> {32} >> [ PCPlus4 ] ID_EX ; ID_BranchAddr [ sum ] >> [ BranchAddr ] ID_EX ; ID_destReg >> [ destreg ] ID_EX ; FDU [ ALUMUXaSelect ] >> [ ALUMUXaSelect ] ID_EX ; FDU [ ALUMUXbSelect ] >> [ ALUMUXbSelect ] ID_EX ; FDU [ SWMuxSelect ] >> [ SWMuxSelect ] ID_EX ; FDU [ regdata1 ] >> [ regdata1 ] ID_EX ; FDU [ regdata2 ] >> [ regdata2 ] ID_EX ; K o n t r o l l i n j e r n e s k a l kunne zappes ID_Control [ ALUOp ] >> zid_ex1 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ ALUOp ] ID_EX ; ID_Control [ Jump ] >> zid_ex2 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ Jump ] ID_EX ; ID_Control [ JumpReg ] >> zid_ex3 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ JumpReg ] ID_EX ; ID_Control [ BNE ] >> zid_ex4 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ BNE ] ID_EX ; ID_Control [ BEQ ] 103

>> zid_ex5 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ BEQ ] ID_EX ; ID_Control [ MemWrite ] >> zid_ex6 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemWrite ] ID_EX ; ID_Control [ MemRead ] >> zid_ex7 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemRead ] ID_EX ; ID_Control [ Link ] >> zid_ex8 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ Link ] ID_EX ; ID_Control [ RegWrite ] >> zid_ex9 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ RegWrite ] ID_EX ; ID_Control [ MemtoReg ] >> zid_ex10 { ZapBoundary SANC [ ID_EX_Zap ]} >> [ MemtoReg ] ID_EX ; EX f a s e n Send data t i l HDU en og MDU en ID_EX [ MemRead ] >> [ EX_MemRead ] HDU ; ID_EX [PC] >> ( [ EX_PC ]HDU, [ EX_PC ] MDU ); ID_EX [ PCPlus4 ] >> [ EX_PCPlus4 ] MDU ; ID_EX [ BEQ ] >> [ EX_BEQ ] MDU ; ID_EX [ BNE ] >> [ EX_BNE ] MDU ; ID_EX [ Jump ] >> [ EX_Jump ] MDU ; ID_EX [ JumpReg ] >> [ EX_JumpReg ] MDU ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] MDU ; ID_EX [ MemWrite ] >> [ EX_MemWrite ] MDU ; Sæt ALU en op ALUMUXa ALUMUXb ID_EX [ ALUOp ] >> alu ; Før l i n j e r n e ind i EX/MEM grænsen ID_EX [ PC] >> {32} >> [ PC] EX_MEM { PipeStageBoundary SANC [ EX_MEM_Write ]}; ID_EX [ PCPlus4 ] >> {32} >> [ PCPlus4 ] EX_MEM ; ID_EX [ BranchAddr ] >> {32} >> [ BranchAddr ] EX_MEM ; SWMux >> [ WriteData ] EX_MEM ; ID_EX [ destreg ] >> {5} >> [ destreg ] EX_MEM ; alu [ Res ] >> [ ALURes ] EX_MEM ; alu [ Zero ] >> [ ALUZero ] EX_MEM ; K o n t r o l l i n j e r n e s k a l kunne zappes ID_EX [ BNE ] >> {1} >> zex_mem1 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ BNE ] EX_MEM ; ID_EX [ BEQ ] >> {1} >> zex_mem2 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ BEQ ] EX_MEM ; ID_EX [ MemWrite ] >> {1} >> zex_mem3 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemWrite ] EX_MEM ; ID_EX [ MemRead ] >> {1} >> zex_mem4 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemRead ] EX_MEM ; ID_EX [ Link ] >> {1} >> zex_mem5 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ Link ] EX_MEM ; ID_EX [ RegWrite ] >> {1} >> zex_mem6 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ RegWrite ] EX_MEM ; ID_EX [ MemtoReg ] >> {1} >> zex_mem7 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ MemtoReg ] EX_MEM ; 104

ID_EX [ JumpReg ] >> {1} >> zex_mem8 { ZapBoundary SANC [ EX_MEM_Zap ]} >> {1} >> [ JumpReg ] EX_MEM ; MEM f a s e n Send data t i l HDU en og MDU EX_MEM [ ALURes ] >> [ MEM_ALURes ] HDU ; EX_MEM [ MemWrite ] >> [ MEM_MemWrite ] HDU ; EX_MEM [PC] >> [ MEM_PC ] MDU ; EX_MEM [ ALURes ] >> [ MEM_ALURes ] MDU ; EX_MEM [ PCPlus4 ] >> [ MEM_PCPlus4 ] MDU ; EX_MEM [ BranchAddr ] >> [ MEM_BranchAddr ] MDU ; EX_MEM [ JumpReg ] >> [ MEM_JumpReg ] MDU ; EX_MEM [ BEQ ] >> [ MEM_BEQ ] MDU ; EX_MEM [ BNE ] >> [ MEM_BNE ] MDU ; EX_MEM [ ALUZero ] >> [ MEM_ALUZero ] MDU ; Opsæt hukommelsestilgangen EX_MEM [ MemRead ] >> [ drd ] mem ; EX_MEM [ MemWrite ] >> [ dwr ] mem ; EX_MEM [ ALURes ] >> [ daddrin ] mem ; EX_MEM [ WriteData ] >> [ ddatain ] mem ; Opsæt muxen, der vælger mellem PC+4 og ALURes EX_MEM [ Link ] >> [ select ] PCp4orALUMux { Mux 1 32}; EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] >> [ in] PCp4orALUMux ; Før l i n j e r n e ind i MEM/WB grænsen PCp4orALUMux >> [ PCp4orALU ] MEM_WB { PipeStageBoundary SANC [ MEM_WB_Write ]}; mem [ ddataout ] >> [ readdata ] MEM_WB ; EX_MEM [ destreg ] >> {5} >> [ destreg ] MEM_WB ; EX_MEM [ RegWrite ] >> {1} >> [ RegWrite ] MEM_WB ; EX_MEM [ MemtoReg ] >> {1} >> [ MemtoReg ] MEM_WB ; WB f a s e n Send data t i l muxen f ø r r e g i s t r e n e MEM_WB [ MemtoReg ] >> [ select ] RegWriteMux ; MEM_WB [ readdata ] MEM_WB [ PCp4orALU ] >> [ in] RegWriteMux ; OBS! F l y t t e t f r a EX f a s e n pga. Kreds manglende evner Sæt muxerne f ø r ALU en op ID_EX [ ALUMUXaSelect ] >> [ select ] ALUMUXa { FastMux 5 32}; ID_EX [ regdata1 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] ALUMUXa ; ID_EX [ ALUMUXbSelect ] >> [ select ] ALUMUXb { FastMux 6 32}; ID_EX [ extimm ] ID_EX [ regdata2 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] ALUMUXb ; Sæt SW muxen op ID_EX [ SWMuxSelect ] >> [ select ] SWMux { FastMux 5 32}; ID_EX [ regdata2 ] EX_MEM [ PCPlus4 ] EX_MEM [ ALURes ] MEM_WB [ PCp4orALU ] MEM_WB [ readdata ] >> [in] SWMux ; Opsætning a f s t a l l and NOP c o n t r o l mem [ holdandwait ] >> [ holdandwait ] SANC { StallAndNOPControl }; ID_EX [ destreg ] >> [ EX_destReg ] SANC ; 105

ID_EX [ BEQ ] >> [ EX_BEQ ] SANC ; ID_EX [ BNE ] >> [ EX_BNE ] SANC ; ID_EX [ JumpReg ] >> [ EX_JumpReg ] SANC ; ID_EX [ MemWrite ] >> [ EX_MemWrite ] SANC ; ID_EX [ RegWrite ] >> [ EX_RegWrite ] SANC ; ID_EX [ stop ] >> [ EX_stop ] SANC ; EX_MEM [ MemRead ] >> [ MEM_MemRead ] SANC ; EX_MEM [ MemWrite ] >> [ MEM_MemWrite ] SANC ; HDU [ STALL_IFandID ] >> [ HDU_STALL_IFandID ] SANC ; HDU [ NOP_IF ] >> [ HDU_NOP_IF ] SANC ; HDU [ NOP_ID ] >> [ HDU_NOP_ID ] SANC ; HDU [ NOP_EX ] >> [ HDU_NOP_EX ] SANC ; MDU [ NOP_IF ] >> [ MDU_NOP_IF ] SANC ; MDU [ NOP_ID ] >> [ MDU_NOP_ID ] SANC ; MDU [ NOP_EX ] >> [ MDU_NOP_EX ] SANC ; PCWrite f l a g e t SANC [ PCWrite ] >> [ wrenable ]PC; SANC [ PCWrite ] >> [ wrenable ] PC1 ; Opsætning a f muxerne f ø r PC PCMux ( normalt f l o w ) MDU [ PCMux_Select ] >> [ select ] PCMux { FastMux 6 32}; ID_EX [ PCPlus4 ] EX_MEM [ ALURes ] EX_MEM [ BranchAddr ] EX_MEM [ PCPlus4 ] >> [in :127..0] PCMux ; OverrideMux ( s e l v m o d i f i c e r e n d e kode ) HDU [ OverridePC ] >> [ select ] OverrideMux { Mux 1 32}; EX_MEM [ ALURes ] PCMux >> [ in] OverrideMux ; OverrideMux >> ( [in]pc, [in]pc1 ); end H.12 stall-and-nop-control.k StallAndNOPControl ( holdandwait {1} EX_destReg {5} EX_BEQ {1} EX_BNE {1} EX_MemWrite {1} EX_JumpReg {1} EX_RegWrite {1} EX_stop {1} MEM_MemRead {1} MEM_MemWrite {1} HDU_STALL_IFandID {1} HDU_NOP_IF {1} HDU_NOP_ID {1} HDU_NOP_EX {1} MDU_NOP_IF {1} MDU_NOP_ID {1} MDU_NOP_EX {1} ) >> ( PCWrite {1} IF_ID_Write {1} IF_ID_Zap {1} ID_EX_Write {1} ID_EX_Zap {1} EX_MEM_Write {1} EX_MEM_Zap {1} MEM_WB_Write {1} ) Find ud a f om i n s t r u k t i o n e n s k r i v e r t i l reg $0 0 betyder j a 106

EX_destReg EX_RegWrite >> #{ Or 5} #{ Not } >> writereg0 { Or 2}; Find ud a f om i n s t r u k t i o n e n s k a l p a s s e r e t i l MEM f a s e n 1 betyder j a writereg0 EX_BEQ EX_BNE EX_JumpReg EX_MemWrite EX_stop >> mustpass { Or 6}; S t a l l PLA en holdandwait MEM. MemRead MEM. MemWrite mustpass HDU. S t a l l. IF&ID StallPlane = " 100-0 -111-1 -1, " " 100-1 - - -111-1, " " 1-10 - -111----, " " 0---0 11-1 -1-1, " " 0---1 - - -111-1 "; MEM_WB_Write EX_MEM_Zap EX_MEM_Write ID_EX_Zap ID_EX_Write IF_ID_Zap IF_ID_Write PCWrite holdandwait MEM_MemRead MEM_MemWrite mustpass HDU_STALL_IFandID >> StallPLA { StallPlane }; Sæt den ud l i n j e der kommer d i r e k t e f r a PLA en StallPLA [0] >> MEM_WB_Write ; NOP PLA en HDU.NOP.EX HDU.NOP. ID HDU.NOP. IF MDU.NOP.EX MDU.NOP. ID MDU.NOP. IF holdandwait NOPPlane = " 1-----0 1111111, " " 1-----1 11111-1, " " 0--1--- 1111111, " " 01-0 - -0 111111 -, " " 01-0 - -1 111-1 - -, " " 00-01 -0 111111 -, " " 00-01 -1 111-1 - -, " " 00100-0 1111-1 -, " " 00100-1 1-1----, " " 0000010 1111-1 -, " " 0000011 1-1---- "; EX_MEM_Zap EX_MEM_Write ID_EX_Zap ID_EX_Write IF_ID_Zap IF_ID_Write PCWrite HDU_NOP_EX HDU_NOP_ID HDU_NOP_IF MDU_NOP_EX MDU_NOP_ID MDU_NOP_IF holdandwait >> NOPPLA { NOPPlane }; 107

Sammensæt s i g n a l e r n e f r a de to PLA e r StallPLA [7] NOPPLA [6] >> #{ Or 2} >> PCWrite ; StallPLA [6] NOPPLA [5] >> #{ Or 2} >> IF_ID_Write ; StallPLA [5] NOPPLA [4] >> #{ Or 2} >> IF_ID_Zap ; StallPLA [4] NOPPLA [3] >> #{ Or 2} >> ID_EX_Write ; StallPLA [3] NOPPLA [2] >> #{ Or 2} >> ID_EX_Zap ; StallPLA [2] NOPPLA [1] >> #{ Or 2} >> EX_MEM_Write ; StallPLA [1] NOPPLA [0] >> #{ Or 2} >> EX_MEM_Zap ; end 108