Simularea CPU-ului de învățare

Ultima dată când m-am uitat la un procesor simplu de RISC pe 16 biți destinat studenților. Avea nevoie de un mic ajutor pe documentație, precum și a avut un fișier lipsă, cu toate acestea am reușit să-l simt pentru a simula utilizarea liberă pe instrumentul de internet numit EDA Loc de joacă. De data aceasta, te voi lua cu detaliile codului, precum și cu exact cum să rulați simularea.

Veți dori să vă referiți la publicarea anterioară dacă nu ați verificat deja acest lucru. Diagramele, precum și tabelele oferă o imagine de ansamblu la nivel înalt, care vă vor ajuta să înțelegeți fișierele discutate în acest post.

Dacă v-ați dorit să programați cu adevărat acest lucru pe o adevărată FPGA, ați avea o mică lucrare de făcut. Memoria, precum și inițializarea înregistrării se efectuează într-o metodă care funcționează bine pentru simulare, totuși nu ar funcționa pe o adevărată FPGA. Oricum, să începem!

File-by-free

Dacă luați fiecare date individual, nici unul dintre ele nu este extrem de greu de înțeles. Iată o rundă rapidă (folosesc numele de date pe care le voi utiliza în simularea pe Internet):

Parameter.v – Acest lucru este ca un includ datele care stabilește unele definiții fundamentale pentru fiecare alt fișier.

Prog.v – Aceasta este memoria de direcție. Un modul simplu, este nevoie de o adresă, precum și prezintă date pentru acea adresă. Directiva $ Readmemb citește datele dintr-un date (test.prog).

Register.V – Fișierul de înregistrare. Acest lucru este aproape ca memoria de direcție, dar are două porturi verificate, precum și puteți să le compuneți.

date.v – memoria RAM. Acest lucru este aproape ca și registrele, cu toate acestea mai mari, precum și cu un singur port verificat. Există un anumit cod de simulare care deschide datele, precum și imprimă comentariile de memorie, cu toate acestea am șters că, deoarece a fost doar pentru depanare. Conținutul preliminar vine din fișierul test.Data.

Alu.v – Credeți că acest lucru ar fi complicat, totuși nu este. Doar durează două intrări, precum și face ceva pentru a produce ieșirea. Ceva simplu cum ar fi adauga sau scade. Întotdeauna @ (*) îi spune lui Verilog să nu producă logica clară. Se transformă într-un simplu porți simple, precum și muxi.

DataPath_UNit.V – Acesta este unul dintre fișierele mai complexe, deși dacă vă săturați-vă, veți vedea că este în principal în vrac. Aceste date produc toate resursele (cum ar fi registrele, precum și amintirile), precum și le strânge împreună.

Control_unit.v – Un modul mai lung, acest lucru implementează doar tabelul de direcție, setând liniile de control bazate pe instrucțiunea prezentă.

Alucontrol.V – Aceste date decode instrucțiuni pentru ALU. Lipsea pe postul original. În mod ciudat, există încă un CPU similar pe același site care are un fișier alucontrol, cu toate acestea este clar pentru un set diferit de direcție. Cu toate acestea, pornind de a păstra acele date, precum și utilizarea mesei de stil, am reușit să o recreez. Dacă [FPGA4Students] corectează acest lucru, fișierele pot arăta extrem de diferite.

Design.SV – Aceste date sunt necesare pentru simulatorul Edaplayground pe care îl folosesc. Acesta conține elementele de nivel superior (calea de date, precum și unitatea de comandă). Deoarece EdaplayGround procesează doar acest fișier, este necesar ca acesta să includă celelalte fișiere menționate mai sus. Acest lucru cauzează unele avertismente, deoarece fiecare dintre ele are o directivă de timp de timp, totuși acest lucru este inofensiv.

Testbench.sv – Testbench nu face parte din designul autentic, totuși doar stabilește simularea, precum și colectează rezultatele. A trebuit să o modific un pic pentru a lucra cu Edaplayground, totuși operația este aceeași. Pur și simplu produce un procesor, îl hrănește cu ceas, precum și îl permite să ruleze o vreme. Programul de testare, precum și conținutul de memorie sunt în test.prog și test.Data.

Simulare

Puteți face unul din cele două lucruri. Puteți deschide copia mea a stilului gata de a merge, totuși să nu fie cea mai bună opțiune. Aș sugera că veți merge la Ediplayground și să produceți un nou proiect Verilog. Apoi începeți să mutați fișierele de la postul original. Veți rula în erori, precum și fișierele lipsă. Vedeți exact câte puteți repara. Dacă vă deplasați, atunci puteți utiliza copia mea pentru a vă ajuta dacă vă prindeți. Vei descoperi mai mult în acest fel.

Dacă alegeți să o încercați, chiar aici sunt câteva sfaturi despre Edaplayground. Nu aveți nevoie de UVM / OVM selectat, nici nu aveți nevoie de niciun fel de alte biblioteci. Am utilizat Icarus Verilog 0.9.7, cu toate acestea, probabil că ați putea utiliza cel mai probabil orice tip de instrumente Verilog disponibile. Vreți să inspectați caseta de selectare EPWAVE, precum și să vă cereți să adăugați acest lucru la partea initală a testbenchului:

iniţială
începe
$ bumpfile (“dump.vcd”);
$ gvigars;
Utilizați indicarea + lângă filele de nume de date pentru a efectua fișiere noi. Edaplayground are o limită de zece fișiere pe panou. Amintiți-vă, va trebui să includeți orice tip de fișiere .v pe care le produceți fie în testbench.sv sau design.sv. Nu aveți nevoie să includeți fișierele de date, deoarece celelalte fișiere le utilizează indirect.

Alerga!

Odată ce ați lucrat toate erorile, puteți apăsa rularea, precum și veți obține vizualizatorul de undă, Epwave. Tu hav.e Pentru a adăuga semnale de rată de interes, astfel încât să puteți urmări procesorul la locul de muncă. Ar fi distractiv să adăugați unele dispozitive I / O în memorie sau unele porturi de depanare, astfel încât să puteți urmări lucrurile puțin mai bine. De obicei, voi urmări contorul de programe, precum și registrul compun portul pentru a obține un concept de ceea ce se întâmplă în interior.

Codul original a avut un program care a exercitat o mulțime de instrucțiuni. Am comentat-o, precum și am înlocuit-o cu aceasta:

0000_0100_0000_0000 // 0000: tone R0 <- MEM (R2 + 0) Deoarece R2 = 0 Aceasta pune 1 în R0 0000_0100_0100_0000 // 0002: Tone Exact același în R1 (R1 va conține întotdeauna 1) // locul 8 (Byte), 4 (cuvânt): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (care este mem [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000A: Salt la locul # 4 (CPU se va înmulți cu 2, precum și adăugați 2) // nici o direcție la 000C, cu toate acestea PC-ul va rămâne acolo în timp ce procesează saltul Ar trebui să puteți respecta valoarea incrementării compunerii la memorie, precum și urmărirea ciclului contorului de programe înapoi la locul 4 cu fiecare buclă. Iată o sesiune tipică: Am lăsat o mulțime de semnale interioare, totuși puteți vedea că adresa de memorie 1 este setată la 2, precum și apoi la 3 pe primele două iterații ale bucla. Sfârșitul jocului Este aceasta o mare procesoare academice? Nu sunt sigur. Există un procesor mai simplu, totuși ele sunt frecvent puțin, deoarece sunt complicate sau sunt extrem de nepractice. Orice mai dificil decât este cel mai probabil atât de mult pentru a mușca pentru un începător. În timp ce cred că ar trebui să aveți niște înțelepciune de verilog fundamental înainte de a aborda ceva de genul acesta, documentația a fost un pic rar (și confuz) în unele zone. Evident, a fost destul de mult de când am lucrat, cu toate acestea, dacă tocmai ați început, probabil că ar aprecia puțin mai mult, precum și explicații. Aveți un CPU Academic preferat Verilog? Căut încă o persoană care este "dreaptă".