Soft-CPU-Überprüfung

18

Ich bin gerade dabei, eine einfache CPU in VHDL mit Xilinx ISE und ISIM zu entwerfen. Der Designteil läuft bemerkenswert gut, aber ich kann anscheinend keine Möglichkeit finden, die Überprüfung auf konsistente Weise durchzuführen.

Im Moment habe ich einen VHDL-Prüfstand, den ich aktualisiere, um die Funktion zu testen, an der ich gerade arbeite. Dies ist sehr spontan, und es hilft mir nicht, Regressionen aufzufangen, und es kann nicht verwendet werden, um die Einhaltung der Spezifikation / des Anweisungssatzes zu überprüfen.

Ich habe über die Entwicklung einer umfangreichen Testsuite nachgedacht, aber das Problem ist, dass der potenzielle Zustand eines universellen Teils als CPU im Vergleich zu weniger generischen Komponenten sehr groß ist.

Ich suche nach einer Methode, mit der ich Design und Tests kontrollierter durchführen kann. Eine Art "Hardware-TDD", wenn Sie so wollen. Gibt es so etwas? Kann es relativ einfach auf Allzweckteile wie eine CPU angewendet werden?

drxzcl
quelle

Antworten:

16

Das gesamte Problem der CPU-Überprüfung ist sehr groß und schwierig. Es gibt Leute, die machen Karriere daraus. Ich gebe Ihnen nur den Überblick ...

  1. Schreiben Sie ein Assembler-Programm, das jede Anweisung und jedes Detail jeder Anweisung testet. Wenn Sie beispielsweise den ADD-Befehl testen, können Sie ihn mit Zahlen testen, die beide positiv, beide negativ und jeweils eine (zweimal) sind. Sie würden dann das Übertragsflag, das Nullflag usw. testen. Andere spezielle Merkmale der CPU (wie die Verzweigungsvorhersage usw.) hätten einen eigenen speziellen Teil dieses Tests.

  2. Schreiben Sie mit C / C ++ oder etwas anderem ein Modell Ihrer CPU. Dies ist Ihre virtuelle CPU. Dies ist auch Ihre "goldene CPU", was bedeutet, dass dies die CPU ist, mit der alles andere verglichen wird. Idealerweise ist die Person, die die VHDL geschrieben hat, NICHT dieselbe Person, die das C / C ++ - Modell schreibt.

  3. Schreiben / Erstellen Sie ein System, in dem Sie das C / C ++ - Modell und das VHDL-Modell nebeneinander ausführen und die Ergebnisse zyklisch vergleichen können. Führen Sie Ihr Assemblyprogramm ab Schritt 1 aus und stellen Sie sicher, dass die beiden Modelle übereinstimmen.

  4. Führen Sie Ihre beiden Modelle nach zufälligen "Anweisungen" aus. Grundsätzlich füllen Sie "ram" mit zufälligen Daten und führen Sie diese zufälligen Daten aus, als ob es sich um echte Anweisungen handelt. Führen Sie die gleichen Zufallsdaten für VHDL- und C / C ++ - Modelle aus und vergleichen Sie die Ergebnisse. Dieses C / C ++ - Modell würde auf einer Workstation und / oder einem Server ausgeführt werden (nicht auf der neuen CPU selbst).

  5. Richten Sie einen oder mehrere Computer ein, um Schritt 4 für immer zu wiederholen. Selbst wenn Ihre CPU "fertig" ist und ein Jahr oder länger in Produktion ist, werden Sie diesen Test weiterhin ausführen.

  6. Wiederholen Sie diese Schritte, wenn Sie mehr simulieren möchten. Beispielsweise würden Sie es auf der Post-Route-VHDL mit dem Timing ausführen, wenn dies verfügbar ist.

Es gibt keine Garantie dafür, dass der Vergleich der VHDL- und C / C ++ - Versionen jeden einzelnen Fehler erkennt - aber es gibt wirklich keinen besseren Weg. Das Testen der CPU mit zufälligen Anweisungen nimmt Zeit in Anspruch, ist aber auch sehr nützlich. Die einzige echte Alternative besteht darin, eine Menge Leute einzustellen, die nur den ganzen Tag Code schreiben, um verschiedene Teile der CPU zu testen - und die größeren Unternehmen tun dies, aber sie erledigen auch die Zufallsdaten.

Für eine einzelne Person, die VHDL-Code schreibt, ist es normalerweise nur Schritt 1, der ausgeführt wird. Aber wenn Sie die CPU verkaufen wollen, sollten Sie zumindest einige der anderen Schritte ausführen (und wirklich, Sie sollten sie alle ausführen).


quelle
Ausgezeichnete Antwort, danke! Das macht sehr viel Sinn. Die "Goldene CPU" ist in der Tat das fehlende Teil des Puzzles, mit dem Sie beim Testen zyklische Überprüfungen durchführen können. Da dies größtenteils ein Spielzeugprojekt ist, denke ich, dass ich mich an den ersten Satz des letzten Absatzes halten und nur Schritt 1 ausführen werde. Aber zu wissen, was ich tun sollte, ist von unschätzbarem Wert.
drxzcl
Sie können auch ein goldenes, aber nicht zyklusgenaues C ++ - Modell haben, das es viel einfacher und daher wahrscheinlicher macht, korrekt zu sein - nützlich zum Testen der ALU-Funktionalität zum Beispiel ("2 + 2 = 4 und einige Flags, I egal wann "anstatt" 2 + 2 = 4 nach einem Tick und die Flags nach 2 Ticks ")
Martin Thompson
Führen Sie außerdem Code-Coverage (um zu überprüfen, ob Sie alles ausgeführt haben) und Test-Coverage (um zu überprüfen, ob alle Tests auf Pas und Fail getestet wurden) aus
Martin Thompson,
Follow-up: Mit der Prozedur "Schritt eins" habe ich viele Fehler gefunden ... in meinem Assembler: P Der Kern selbst scheint relativ in Ordnung zu sein.
drxzcl