Simulera Lärningsbyfästande CPU
förra gången jag tittade på en enkel 16-bitars RISC-processor riktad mot studenter. Det behövde en liten hjälp på dokumentationen samt haft en saknad fil, men jag lyckades få det att simulera med att använda en gratis på internetverktyget EDA Lekplats. Den här gången tar jag dig med koduppgifterna såväl som exakt hur man kör simuleringen.
Du vill referera till föregående publicera om du inte checkat ut det redan. Diagrammen samt tabeller ger en översikt på hög nivå som hjälper dig att förstå de filer som diskuteras i det här inlägget.
Om du ville verkligen programmera detta på en äkta FPGA, skulle du ha lite arbete att göra. Minnet såväl som registerinitiering utförs i en metod som fungerar bra för simulering, men inte skulle fungera på en äkta FPGA. Hur som helst, låt oss komma igång!
Fil-för-fil
Om du tar varje data individuellt är ingen av dem extremt svåra att förstå. Här är en snabb rundown (jag använder de datamn som jag använder i min på Internet-simuleringen):
Parameter.v – Det här är som en Inkludera data som sätter några grundläggande definitioner för alla andra filer.
PROG.V – det här är riktminnet. En enkel modul, det tar en adress såväl som presenterar data för den adressen. Direktivet om $ ReadMemb läser data från en data (test.prov).
Registrera.v – Registreringsfilen. Det här är nästan som riktminnet men det har två checkade ut portar såväl som du kan komponera det.
Data.v – RAM-minnet. Detta är nästan som register, men större såväl som med en enda checkad port. Det finns en viss simuleringskod som öppnar en data såväl som skriver in minneskommentarerna, men jag tog bort det som det var bara för debugging. Det preliminära innehållet kommer från test.data-filen.
alu.v – du tror att det skulle vara komplicerat, men det är det inte. Det tar bara två ingångar såväl som gör något för att producera utgången. Något enkelt som lägger till eller subtraherar. Alltid @ (*) berättar Verilog att inte producera klockad logik för detta. Det blir bara några enkla grindar såväl som muxes.
DataPath_Unit.v – Det här är en av de mer komplexa filerna, även om du gräver in det, ser du att det huvudsakligen är bulk. Dessa data producerar alla resurser (som register såväl som minnen) samt ledningar dem tillsammans.
Control_Unit.v – En längre modul, det här ändrar bara riktningsbordet och ställer in kontrolllinjerna baserat på föreliggande instruktion.
Alucontrol.v – Dessa data avkodar instruktioner för ALU. Det saknades på det ursprungliga inlägget. Oddly, det finns en liknande CPU på exakt samma webbplats som har en Alucontrol-fil, men det är klart för en annan riktningssats. Men börja hålla den data samt utnyttja stilbordet, kunde jag återskapa det. Om [FPGA4students] korrigerar detta kan filerna se extremt annorlunda ut.
Design.sv – Denna data krävs för EdaplayGround Simulator jag använder. Den innehåller toppnivåelementen (databana såväl som styrenheten). Eftersom EdaplayGround bara behandlar den här filen är det nödvändigt att det är nödvändigt att inkludera de andra filerna som nämns ovan. Detta orsakar vissa varningar eftersom var och en av dem har ett tidscale-direktiv, men det är ofarligt.
testbench.sv – Testbenken är inte en del av den äkta designen, men bara sätter upp simuleringen samt samlar resultat. Jag var tvungen att ändra det lite att arbeta med Edaplayground, men operationen är densamma. Det producerar bara en CPU, matar det en klocka, liksom det kan springa ett tag. Testprogrammet samt minnesinnehållet är i test.prov såväl som test.data.
Simulering
Du kan göra en av två saker. Du kan öppna min kopia av stilen färdig att gå, men det kanske inte är ditt finaste alternativ. Jag föreslår att du bara går till EdaplayGround och producerar ett nytt Verilog-projekt. Sedan börja flytta filerna över från det ursprungliga inlägget. Du kommer att gå i fel såväl som saknade filer. Se exakt hur många du kan fixa. Om du blir stumped, kan du använda min kopia för att hjälpa dig om du blir stumpad. Du kommer att upptäcka mer på det sättet.
Om du väljer att prova det, är det några tips om Edaplayground. Du behöver inte UVM / OVM vald, och du kräver inte någon annan typ av andra bibliotek. Jag utnyttjade Icarus Verilog 0.9.7, men du kanske sannolikt utnyttjar någon typ av de verilogverktyg som finns tillgängliga. Du vill inspektera Epwave-kryssrutan såväl som du kommer att kräva att lägga till det i den initala delen av testbenench:
första
Börja
$ dumpfile (“dump.vcd”);
$ dumpvars;
Använd + -indikationen bredvid flikarna för dataminnet för att skapa nya filer. Edaplayground har en gräns på tio filer per panel. Kom ihåg att du måste inkludera vilken typ av .v-filer du producerar i antingen testbench.sv eller design.sv. Du behöver inte att inkludera datafilerna eftersom de andra filerna använder dem indirekt.
Springa!
När du har alla fel utarbetats kan du trycka på Kör så bra som du får Waveform-tittaren, Epwave. Du hare För att lägga till signaler om intresse, så att du kan titta på CPU på jobbet. Det är kul att lägga till några I / O-enheter i minnet eller några felsökningsportar så att du kanske tittar lite bättre. Jag brukar titta på programräknaren samt registret komponera hamnen för att få ett begrepp om vad som händer inuti.
Den ursprungliga koden hade ett program som utövade en hel del instruktioner. Jag kommenterade det såväl som ersatt det med detta:
0000_0100_0000_0000 // 0000: Tons R0 <- MEM (R2 + 0) Sedan R2 = 0 Detta sätter 1 i R0 0000_0100_0100_0000 //0002: ton Den exakta samma i R1 (R1 innehåller alltid 1) // plats 8 (byte), 4 (ord): 0010_0000_0101_0000 // 0004: r2 = r0 + r1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (det är MEM [1] = R2 0000_0010_0000_0000 // 0008: r0 = mem [r1] 1101_0000_0000_0011 //000a: Hoppa till plats # 4 (CPU kommer att multiplicera med 2 såväl som tillägg 2) // ingen riktning på 000C, men PC kommer att hänga där medan det behandlas Du bör kunna följa det inkremade värdet som komponerar till minne såväl som att titta på programräknaren tillbaka till Placera 4 med varje slinga. Här är en typisk session: Jag släppte ut en hel del interiörsignaler, men du kan se att minnesadress 1 är inställd på 2 såväl som sedan till 3 på de allra första två iterationerna av slingan. Slutspel Är det en stor akademisk CPU? Jag är inte säker. Några enklare cpus finns, men de är ofta små eftersom de är knepiga eller de är extremt opraktiska. Något mer utmanande än det är mest troligt att det är mycket att bita av för en nybörjare. Medan jag tror att du borde ha lite grepp om grundläggande verilog innan du tar itu med något så här, var dokumentationen lite gles (och förvirrande) på vissa områden. Självklart var det tillräckligt bra eftersom jag fick det att fungera, men om du bara börjar, skulle du sannolikt uppskatta lite mer assistent samt förklaringar. Har du en föredragen akademisk Verilog CPU? Jag letar fortfarande efter att en person som är "precis rätt".