Simulieren Sie das Lern-by-fixing-CPU

Letztes Mal, als ich einen einfachen 16-Bit-RISC-Prozessor ansah, der an Studenten abzielte. Es brauchte ein wenig Unterstützung bei der Dokumentation sowie eine fehlende Datei, aber ich habe es jedoch geschafft, es zu finden, um ein kostenloses Im Internet-Tool namens EDA Playground zu simulieren. Diesmal bringe ich Sie mit den Code-Details sowie genau, wie Sie die Simulation ausführen.

Sie möchten auf die vorherige Veröffentlichung verweisen, wenn Sie es bereits nicht überprüft haben. Die Diagramme sowie Tabellen bieten einen Überblick mit hoher Ebene, mit dem Sie die in diesem Beitrag diskutierten Dateien unterstützen.

Wenn Sie dies wirklich auf einem echten FPGA programmieren wollten, hätten Sie etwas zu tun. Der Speicher sowie die Register-Initialisierung erfolgt in einer Methode, die für die Simulation gut funktioniert, jedoch würde jedoch nicht an einem echten FPGA funktionieren. Wie auch immer, lass uns anfangen!

File-by-by-file

Wenn Sie jede Daten einzeln einnehmen, ist keiner von ihnen extrem schwer zu verstehen. Hier ist ein kurzer Auslauf (ich nutze die Datennamen, die ich in meiner Internetsimulation nutzen werde):

Parameter.V – Dies ist wie einschließlich der Daten, die für jede andere Datei einige grundlegende Definitionen festlegen.

Prog.v – Dies ist der Richtungsspeicher. Ein einfaches Modul benötigt eine Adresse sowie Daten für diese Adresse. Die $ readmemb-Richtlinie liest die Daten aus einem Daten (test.prog).

register.v – Die Registerdatei. Dies ist fast wie der Richtungsspeicher, der jedoch zwei geprüfte Anschlüsse aufweist, und Sie können dazu komponieren.

Data.v – Der RAM-Speicher. Dies ist fast wie die Register, jedoch größer, ebenso wie mit einem einzigen geprüften Port. Es gibt einen Simulationscode, der ein Daten eröffnet und die Speicherkommentare druckt, aber ich habe das gelöscht, da es nur zum Debuggen war. Der vorläufige Inhalt stammt aus der Datei test.data.

ALU.V – Sie würden glauben, dass dies kompliziert wäre, jedoch nicht. Es nimmt nur zwei Eingänge und tut etwas, um den Ausgang zu erzeugen. Etwas Einfaches wie Hinzufügen oder Subtrahieren. Das immer @ (*) sagt, dass verilog nicht getaktet logisch wird. Es verwandelt sich nur in einfachen Toren sowie Muxes.

Datapath_unit.v – Dies ist eine der komplexeren Dateien, obwohl Sie, wenn Sie hineingraben, sehen, dass es hauptsächlich in der Masse ist. Diese Daten erzeugt alle Ressourcen (wie die Register sowie Erinnerungen) sowie die zusammenführenden Wirkungen.

Control_unit.v – ein weiteres längeres Modul, dadurch wird nur die Richtungstabelle implementiert und die Steuerleitungen basierend auf der vorliegenden Anweisung eingestellt.

ALUCONTROL.V – Diese Daten dekodiert Anweisungen für die ALU. Es fehlte auf dem ursprünglichen Beitrag. Seltsamerweise gibt es eine weitere ähnliche CPU auf der gleichen Site mit einer Alucontrol-Datei, die jedoch eindeutig für einen anderen Richtungssatz ist. Beginnen Sie jedoch, dass die Daten sowie die Verwendung der Stiltabelle jedoch unter Verwendung des Stils erstellen, konnte ich sie neu erstellen. Wenn [fpga4students] dies korrigiert, können die Dateien extrem unterschiedlich aussehen.

Design.SV – Diese Daten sind für den EDAPAlleground-Simulator erforderlich, den ich verwende. Es enthält die Elemente der obersten Ebene (der Datenpfad sowie die Steuereinheit). Da Edaplayground nur diese Datei verarbeitet, ist es erforderlich, dass sie die anderen oben genannten Dateien aufnehmen. Dies führt dazu, dass einige Warnungen, da jeder von ihnen eine Zeitszielrichtlinie hat, jedoch ist dies harmlos.

testbench.sv – Die Testbench ist nicht Teil des echten Designs, legt jedoch nur die Simulation auf, und sammelt Ergebnisse. Ich musste es ein bisschen modifizieren, um mit dem EDAPlayground zu arbeiten, der Betrieb ist jedoch derselbe. Es erzeugt nur eine CPU, füttert es eine Uhr und lässt sie eine Weile laufen lassen. Das Testprogramm sowie der Speicherinhalt erfolgt in Test.Prog sowie test.data.

Simulation

Sie können eines von zwei Dingen tun. Sie können meine Kopie des Stils des Stils öffnen, das jedoch nicht Ihre feinste Option ist. Ich würde vorschlagen, dass Sie einfach zum Edaplayground gehen und ein neues Verilog-Projekt erstellen. Beginnen Sie dann mit dem Verschieben der Dateien von der ursprünglichen Post. Sie werden in Fehlern sowie fehlende Dateien ausgeführt. Sehen Sie genau, wie viele Sie beheben können. Wenn Sie stumpf werden, können Sie meine Kopie verwenden, um Sie zu unterstützen, wenn Sie stumpf werden. Sie werden mehr auf diese Weise entdecken.

Wenn Sie es entscheiden, es auszuprobieren, sind hier ein paar Tipps zum EDAPAlleground. Sie benötigen nicht ausgewählt UVM / OVM, auch keine anderen Bibliotheken. Ich habe Icarus Verilog 0.9.7 verwendet. Sie könnten jedoch höchstwahrscheinlich jede Art von verfügbaren Verilog-Tools verwenden. Sie möchten das Kontrollkästchen EPWAVE auch inspizieren, und Sie müssen dies zum intenalen Teil von Testbench hinzufügen:

Initial
Start
$ dumpfile (“dump.vcd”);
$ dumpvars;
Verwenden Sie die + Anzeigen neben den Registerkarten Datennamen, um neue Dateien zu erstellen. Edaplayground hat ein Limit von zehn Dateien pro Fenster. Denken Sie daran, Sie müssen alle Typ von .v-Dateien aufnehmen, die Sie in Testbench.sv oder design.sv produzieren. Sie sind nicht erforderlich, die Datendateien aufzunehmen, da die anderen Dateien sie indirekt nutzen.

Laufen!

Sobald Sie alle Fehler haben, können Sie den Lauf drücken, und Sie erhalten den Wellenform-Viewer, Epwave. Du hastE Um Signale der Zinssätze hinzuzufügen, können Sie die CPU bei der Arbeit ansehen. Es würde Spaß machen, einige E / A-Geräte im Speicher oder einige Debugging-Ports hinzuzufügen, sodass Sie die Dinge ein wenig besser sehen können. Ich schaue normalerweise den Programmzähler als auch den Register-Kompositionshafen, um ein Konzept dessen zu bekommen, was innen los ist.

Der ursprüngliche Code hatte ein Programm, das viel Anweisungen ausübt. Ich kommentierte es und ersetzte es mit diesem:

0000_0100_0000_0000 // 0000: tons r0 <- mem (R2 + 0) seit r2 = 0 ist das 1 in r0 0000_0100_0100_0000 // 0002: Tonnen Das gleiche in R1 (R1 enthält immer 1) // Platz 8 (Byte), 4 (Wort): 0010_0000_0101_0000 // 0004: R2 = R0 + R1 0001_0010_1000_0000 // 0006: MEM [R1] = R2 (das ist MEM [1] = R2 0000_0010_0000_0000 // 0008: R0 = MEM [R1] 1101_0000_0000_0011 // 000A: Springe zu Platz # 4 (CPU multipliziert mit 2 sowie Add 2) // Keine Richtung bei 000c, der PC hängt jedoch dort, während es springen Sie sollten in der Lage sein, den inkrementierenden Wert zu erfüllen, der zum Erstellen komponiert wird, sowie den Programmzählerzähler auf Platz 4 mit jeder Schleife zurückzusetzen. Hier ist eine typische Sitzung: Ich habe viel innere Signale ausgelassen, aber Sie können sehen, dass die Speicheradresse 1 sowie dann auf den ersten beiden Iterationen der Schleife auf 2 sowie auf 3 eingestellt ist. Endspiel Ist das eine großartige akademische CPU? Ich bin mir nicht sicher. Einige einfachere CPUs existieren, aber sie sind jedoch häufig wenig, da sie schwierig sind oder extrem unpraktisch sind. Alles, was anspruchsvoller ist als dies ist höchstwahrscheinlich, um einen Anfänger zu beißen. Während ich glaube, dass Sie einen grundlegenden grundlegenden Verilog haben sollten, bevor Sie so etwas angehen, war die Dokumentation in einigen Bereichen etwas spärlich (und verwirrend). Offensichtlich war es großartig, da ich es funktioniert habe, aber wenn Sie gerade erst anfangen, würden Sie höchstwahrscheinlich ein bisschen mehr Assistenz sowie Erklärungen freuen. Hast du eine bevorzugte akademische Verilog-CPU? Ich suche immer noch danach, dass eine Person, die "genau richtig ist".

Leave a Reply

Your email address will not be published. Required fields are marked *