Laatste keer dat ik keek naar een eenvoudige 16-bits risc-processor gericht op studenten. Het had een beetje hulp nodig bij de documentatie en had een ontbrekend bestand, maar ik heb het erin geslaagd om het te simuleren om een gratis te gebruiken op het internettool genaamd Eda Playground. Deze keer breng ik je mee met de code-details, evenals precies hoe de simulatie kan worden uitgevoerd.
U wilt verwijzen naar de vorige publicatie als u het al niet hebt gecontroleerd. De diagrammen en tafels bieden een overzicht op hoog niveau waarmee u de bestanden in dit bericht hebt begrepen.
Als je dit echt op een echte FPGA wilde programmeren, zou je een beetje werken. Zowel het geheugen als registerinitialisatie wordt uitgevoerd in een methode die prima werkt voor de simulatie, maar zou echter niet werken aan een echte FPGA. Hoe dan ook, laten we beginnen!
Bestand
Als u elke gegevens afzonderlijk neemt, is geen van hen buitengewoon moeilijk te begrijpen. Hier is een snelle vervallen (ik ben gebruik van de gegevensnamen die ik in mijn op internet-simulatie benut):
Parameter.v – Dit is als een opnemende gegevens die een aantal fundamentele definities voor elk ander bestand instellen.
PROG.V – Dit is het richtinggeheugen. Een eenvoudige module, het is een adres nodig en presenteert gegevens voor dat adres. De RICHTLANDELING VAN DE $ LEIDMEMB leest de gegevens van een gegevens (test.prog).
Registreer.v – het registerbestand. Dit is bijna als de richtinggeheugen, maar het heeft twee ingecheckte havens en je kunt erop composeren.
Data.v – het RAM-geheugen. Dit is bijna net als de registers, hoe groter ook als met een enkele uitcheckte poort. Er is een simulatiecode die een gegevens opent en de geheugencommentaren afdrukt, maar ik verwijderde dat als het alleen voor foutopsporing was. De voorlopige inhoud komt van het test.data-bestand.
alu.v – je zou geloven dat dit gecompliceerd zou zijn, maar het is het niet. Het kost maar twee inputs en doet iets om de output te produceren. Iets simpels als voegt toe of aftrekken. De Always @ (*) vertelt Verilog niet om hiervoor geklokte logica hiervoor te produceren. Het verandert gewoon in enkele eenvoudige poorten en muxes.
Datapath_unit.v – Dit is een van de complexere bestanden, hoewel als je erin graaft, je ziet dat het vooral bulk is. Deze gegevens produceren alle bronnen (zoals de registers en herinneringen) en draden ze samen.
Control_unit.v – Nog een meer meer module, dit implementeert alleen de richtingstabel, instellen van de bedieningsleidingen op basis van de huidige instructie.
AluCONTROL.V – Deze gegevens decodeert instructies voor de alu. Het ontbrak in de originele post. Vreemd genoeg is er nog een vergelijkbare CPU op exact dezelfde site met een alucontrol-bestand, maar het is duidelijk voor een andere richtingset. Beginnend om die gegevens te houden, evenals het gebruik van de stijltabel, kon ik het opnieuw maken. Als [FPGA4Studenten] dit corrigeert, kunnen de bestanden er uiterst verschillend uitzien.
Design.SV – Deze gegevens zijn vereist voor de EDAPLAYRITE-simulator die ik gebruik. Het bevat de elementen op het hoogste niveau (het gegevenspad en de besturingseenheid). Aangezien Edaplayground dit bestand alleen verwerkt, is het noodzakelijk om de andere hierboven genoemde bestanden op te nemen. Dit veroorzaakt enkele waarschuwingen omdat elk van hen een tijdschaalrichtlijn heeft, maar dit is onschadelijk.
TestBench.SV – De testbench maakt geen deel uit van het echte ontwerp, maar zet gewoon de simulatie op en verzamelt resultaten. Ik moest het een beetje aanpassen aan werken met Edaplayground, maar de operatie is hetzelfde. Het produceert gewoon een CPU, voedt het een klok, evenals laat het een tijdje draaien. Het testprogramma en geheugeninhoud zijn in test.prog evenals test.data.
Simulatie
Je kunt een van de twee dingen doen. U kunt mijn kopie van de ready-to-go van de stijl openen, maar dat is echter niet uw beste optie. Ik zou je aanraden om gewoon naar EdaplayLayground te gaan en een nieuw Verilog-project te produceren. Begin dan met het verplaatsen van de bestanden van de originele post. U rijdt evenals fouten en ontbrekende bestanden. Zie precies hoeveel u kunt oplossen. Als je stumped raakt, kun je mijn exemplaar gebruiken om je te helpen als je stumped krijgt. Je zult op die manier ontdekken.
Als u ervoor kiest om het te proberen, zijn hier een paar tips over EdaplayGle. U vereiste geen UVM / OVM geselecteerd, en u hebt ook geen enkele andere bibliotheken nodig. Ik heb ICARUS VERILOG 0.9.7 gebruikt, maar u kunt waarschijnlijk gebruik maken van elk type beschikbare Verilog-tools. U wilt het selectievakje EPWAVE inspecteren, evenals de vereiste om dit toe te voegen aan het initaal deel van Testbench:
voorletter
beginnen
$ Dumpfile (“Dump.vcd”);
$ Dumpvars;
Gebruik de + -indicatie naast de tabbladen van de gegevensnaam om nieuwe bestanden te maken. EDAPLAYGRITE heeft een limiet van tien bestanden per deelvenster. Vergeet niet dat u elk type .V-bestanden moet opnemen dat u produceert in TestBench.SV of Design.SV. U vereiste niet om de gegevensbestanden op te nemen, aangezien de andere bestanden deze indirect gebruiken.
Rennen!
Zodra u alle fouten hebt uitgewerkt, kunt u op RUN drukken en krijgt u de golfvormviewer, EPGGE. Je hebte om signalen van rentevoeten toe te voegen, zodat u de CPU op het werk kunt bekijken. Het zou leuk zijn om wat I / O-apparaten in het geheugen of een aantal foutopsporingshavens toe te voegen, zodat u de dingen een beetje beter kunt bekijken. Ik kijk meestal naar de programmateller, evenals de register Compose-poort om een concept te krijgen van wat er aan de hand is.
De originele code had een programma dat veel instructies uitoefende. Ik merkte het op en vervangte het hiermee:
0000_0100_0000_0000 // 0000: ton R0 <- MEM (R2 + 0) Sinds R2 = 0 Dit zet 1 in R0 0000_0100_0100_0000 // 0002: ton exact hetzelfde in R1 (R1 bevat altijd 1) // plaats 8 (byte), 4 (woord): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (dat is MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000A: spring naar plaats # 4 (CPU zal vermenigvuldigen met 2 en toevoegen 2) // Geen richting bij 000c, maar pc blijft daar terwijl het verwerkt springen U moet in staat zijn om te voldoen aan de comprimerende waarde die op het geheugen worden gecomponeerd en de programmeercountercyclus weergeeft terug naar plaats 4 met elke lus. Hier is een typische sessie: Ik heb veel interieursignalen weggelaten, maar je kunt zien dat geheugenadres 1 is ingesteld op 2 en vervolgens op 3 op de allereerste twee iteraties van de lus. Eindspel Is dit een geweldige academische CPU? Ik weet het niet zeker. Sommige eenvoudiger CPU's bestaan echter, maar ze zijn vaak weinig omdat ze lastig zijn of ze zijn buitengewoon onpraktisch. Alles uitdagender dan dit is hoogstwaarschijnlijk evenveel om te bijten voor een beginner. Terwijl ik geloof dat je wat greep van fundamentele verilog zou moeten hebben voordat je iets dergelijks aanhoudt, was de documentatie in sommige gebieden een beetje schaars (en verwarrend). Het was duidelijk dat het geweldig genoeg was sinds ik het werkte, maar als je net begint, zou je hoogstwaarschijnlijk een beetje meer assisteren als toelichtingen op prijs stellen. Heb je een gewenste academische verilog cpu? Ik ben nog steeds op zoek naar die persoon die "precies goed" is.