Seite 1 von 1

Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 10:32
von timo.b
Hallo, ich bin am Testen unseres Programms mithilfe der Tests auf der TGDI-Seite. Leider bricht er bei der zweiten "20" ab. Was bedeutet das für mein Programm. Wo liegt der Fehler?

Die linken Binärzahlen stammen aus "Simulate Behavorial Model" der "testbench".
Die Dezimalzahlen dahinter sind die aus der PDF.
anschließend folgen die Zeilen mit den Befehlen aus der PDF, die ich den Werten (hoffentlich richtig) zugeordnet habe.

00000001 0 0x00: begin: lwc1 $f1, 0($zero) //Lade Wert aus Speicher in FPU-Register
00000101 4 0x04: lwc1 $f2, 4($zero) //Lade Wert aus Speicher in FPU-Register
0000100X 8 0x08: add.s $f3, $f1, $f2 //Addition in der FPU
00001101 12 0x0C: swc1 $f3 0($zero) //Speichere Wert in Speicher
00010001 16 0x10: lw $t0, 0($zero) //Lade Wert aus Speicher in MIPS-Register
00010101 20 0x14: lw $t1, 8($zero) //Lade Wert aus Speicher in MIPS-Register
00011001 24 0x18: beq $t1, $t0, t2 //$t0 = $t1 ?
00011101 28 0x1C: j begin //Schleife erneut ausführen
00000001 0 0x00: begin: lwc1 $f1, 0($zero) //Lade Wert aus Speicher in FPU-Register
00000101 4 0x04: lwc1 $f2, 4($zero) //Lade Wert aus Speicher in FPU-Register
0000100X 8 0x08: add.s $f3, $f1, $f2 //Addition in der FPU
00001101 12 0x0C: swc1 $f3 0($zero) //Speichere Wert in Speicher
00010001 16 0x10: lw $t0, 0($zero) //Lade Wert aus Speicher in MIPS-Register
00010101 20 0x14: lw $t1, 8($zero) //Lade Wert aus Speicher in MIPS-Register
... 24

Vielen Dank für Hilfe! Bin ziemlich aufgeschmissen.
lg Timo

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 12:47
von davidda
Was mir als erstes auffält sind folgende Zeilen:

0x18: beq $t1, $t0, t2 //$t0 = $t1 ?
0x1C: j begin //Schleife erneut ausführen

Hier wird der Branch-Befehl offensichtlich nicht ausgeführt, sondern der darauffolgende Jump. Das heißt, dass der erste Test (Addition der beiden ersten Zeilen der memfiledata) nicht zum erwarteten Ergebnis (3. Zeile der memfiledata) geführt hat.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 12:52
von timo.b
Kann das auschließlich am Addierer liegen? Ich habe ihn schon so oft betrachtet, das Konzept angeschaut, ich wüsste einfach nicht, was falsch daran sein könnte.
Danke für die Antwort, G.Timo

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 13:01
von nicolas
Kann es sein, dass der Test einfach nicht lang genug läuft? Starte die Simulation mal mit "Run all" in der ISim-Toolbar.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 13:06
von davidda
nicolas hat geschrieben:Kann es sein, dass der Test einfach nicht lang genug läuft? Starte die Simulation mal mit "Run all" in der ISim-Toolbar.
Daran kann es nicht (ausschließlich) liegen, da er ja immerhin bis zur Richtigkeitsprüfung des Ergebnisses gelangt, die es aber nicht besteht.
timo.b hat geschrieben:Ich habe ihn schon so oft betrachtet, das Konzept angeschaut, ich wüsste einfach nicht, was falsch daran sein könnte.
Schau dir doch einfach mal im Simulator an, welchen Wert dein Addierer ausgibt und vergleiche diesen mit dem richtigen Ergebnis

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 13:13
von nicolas
Doch, genau daran kann es liegen, die Richtigkeitsprüfung soll nämlich erst beim zweiten Erreichen dieser Stelle erfolgreich sein - und bis dahin kommt er ja gar nicht da die Simulation vorher endet.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 13:29
von davidda
Stimmt, das hatte ich übersehen^^. Die Abbruchstelle stimmt sogar ziemlich genau mit der 1us-Standardeinstellung überein.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 14:36
von Gnomix
Es gibt eine Taste [->SANDUHR] im Simulator (isim), diese zweimal drücken.

Wenn der PC dann immer noch nicht weitergeht als 24, hast du einen Fehler im Addierer oder dein Addierer gibt das Ergebnis zu spät an den MIPS zurück.
Dies kann daran liegen, dass du blockende(=) und nicht blockende(<=) Zuweisungen gemischt hast in deinen Modulen.
Wir haben es mit blockenden Zuweisungen gelöst.
Es kann auch daran liegen, worauf deine Module reagieren in den always-Blöcken, ob auf @(*) oder @(posedge ...).

Prüfe ob deine Addition korrekt ist, mit einer Testbench, die nur die Addition testet.
Am einfachsten mit den drei Werten aus der memfiledata.dat ((0x40340000 + 0x40240000) + 0x40240000) = 0x40440000.
Wenn du ein anderes Ergebnis hast, prüfe ob die Mantisse, Exponent und Vorzeichen korrekt sind oder nicht.

Wenn dein Ergebnis übereinstimmt, prüfe mit dem vorgegebenen Testfall im iSim ob er dort korrekte Eingaben bekommt, falls ja, ob er das korrekte Ergebnis weitergibt.
Falls ja, ob das Ergebnis im dMEM landet.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 15:35
von timo.b
Danke für die vielen Antworten. Die Sanduhr hilft in der Tag um meine Endloseschleife aufzudecken.
00000001 0
00000101 4
0000100X 8
00001101 12
00010001 16
00010101 20
00011001 24
00011101 28
00000001 0
00000101 4
0000100X 8
00001101 12
00010001 16
00010101 20
00011001 24
00011101 32 (!)
00000001 36 (!)
00000101 40 (!)
0000100X 44 (!)
00001101 48 (!)
00010001 52 (!)
00011001 56 (!)
00011101 64 (!)
Kurz gesagt, er scheitert immer bei der beq-Abfrage und jumpt deshalb zurück zum Anfang. Also müsste es an einer fehlerhaften Addition liegen.

Da gibt es wohl noch was zu tun. ^^
G.Timo

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 15:48
von Gnomix
Dieser Fehler deutet darauf hin, dass der Multiplizierer falsch ist.
Schau mal im iSim(testbench), ob dein Multiplizierer das korrekte Ergebnis liefert.
Steht an in der PDF, an welcher Stelle genau.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 17:43
von nicolas
Wenn ich den Post richtig interpretiere, ist es eher der Addierer, der da nicht ganz in Ordnung ist. Das Problem scheint ja zu sein, dass das hier

Code: Alles auswählen

0x18: beq $t1, $t0, t2 //$t0 = $t1 ?
nie zutrifft, das Programm also nie zu t2 springt -> Endlosschleife.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 17:49
von timo.b
Ich denke auch, dass es eine Endlosschleife ist.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 17:54
von nicolas
Hast du mal überprüft, ob dein Addierer mit den Werten aus dem Testfall richtig funktioniert? Gnomix hat die Werte oben schon gepostet:
Prüfe ob deine Addition korrekt ist, mit einer Testbench, die nur die Addition testet.
Am einfachsten mit den drei Werten aus der memfiledata.dat ((0x40340000 + 0x40240000) + 0x40240000) = 0x40440000.

Re: Test läuft nicht durch, was genau ist falsch?

Verfasst: 29. Jan 2010 18:14
von Thorti
Hallo,

wenn es immer wieder an den Anfang zurückspringt, klappt die Addition (oder das Auslesen des Wertes aus dem Register ins RAM) nicht.
Wie schon geschrieben, hilft hier eine Betrachtung der einzelnen Signale im Simulator.

Gruss
Thorsten