Okei. Legger ut MIPS-simulatoren så du kan se på den. Den er skrevet i Python 2.6 og har følgende instruksjoner implementert:
Jump, store-word, loadword, branch-not-equal, break, and, add og addui.
For å kjøre koden starter men med å kjøre "simulator.py" og legg ved navnet på "memory-fila". Memory-fila er da en fil som inneholder minnet slik det skal være når programmet starter; men instruksjonene og eventuelt data, satt opp på den måten at først en minne-adresse, så en instruksjon (i hex), og alt etter det er kommentarer. Med en minneadresse per linje.
Programmet vil starte med å sette PC til første minne-adressen i fila, men utover denne er den ikke avhengi av at minne-adressene er sortert.
Programmet er implementert etter følgende tegning og modell:
http://rolsted.co.uk/images/mipsProject/mipsHwDia.jpg
Bildet er desverre litt lite.
De ulike logiske enhetene er forskjellige klasser (f.eks. er det laget en klasse for å beskrive ulike MUX-er og ALU-er), men alle arver fra en standard-komponent klasse. Det betyr at de har visse likheter, som gjør at man kan koble de sammen. Så i begynnelsen av koden så sier man i programmet hvilke logiske enheter som er koblet sammen. (I praksis så sies det her at f.eks. "MUX1 henter input fra outputten til ALU1 og ALU2, og har kontrollsignal "Jump")
Programmet er satt opp for å simulere hvordan en pipeline-prosesor fungerer. Det vil si at den hele tiden vil lese inn en instruksjon og legge den til i pipelinen ved å endre input og output-verdiene til de ulike klassene, på en måte som har likhet med hvordan det ville blitt på elektronikk nivå.
For hver klokkesykel vil programmet oppdatere alle de simulerte logiske enhetene. Denne delen kunne vært gjort på en bedre måte, men for å ha det oversiktlig - og samtidig unngå en del bugs ble det valgt å manuelt kalle oppdatering på hvert enkelt element. Men personlig skulle jeg gjerne ha fått implementert denne delen bedre.
Siden dette er implementert som en pipeline, vil den få samme problemer med data-hazards og kontroll-hazards som den i virkeligheten får. Dette er håndtert med hensyn til stalls. Forwarding-unit rakk jeg desverre ikke implementere.
Sist endret av etse; 9. desember 2010 kl. 17:00.