Forum: FPGA, VHDL & Co. Fehler im ModelSim aber nicht im Quartus


von Mel (Gast)


Lesenswert?

Hallo,

ich hab da ein Problem mit ModelSim (6.5) und Quartus II (10.0). In 
einem State einer StateMachine mache ich folgendes:
1
 ...
2
if (data_counter=0) then
3
   next_state<=PARITY; 
4
end if;
5
data_counter<=data_counter -1; 
6
...

data_counter ist eine Variable und wird in der Architecture 
folgendermaßen deklariert:
1
signal data_counter: integer range 0 to 7;

Mein Problem: Im Quartus kompiliert alles wunderbar und funktioniert 
auch auf der HW wie es soll (ich verwende das DE2 Board).

Wenn ich meinen Code aber im ModelSim simuliere bekomme ich folgende 
Fehlermeldung:

Fatal: (vsim-3421) Value -1 for data_counter is out of range 0 to 7.

Woran liegt das?

von Duke Scarring (Gast)


Lesenswert?

Mel schrieb:
>  ...
> if (data_counter=0) then
>    next_state<=PARITY;
> end if;
> data_counter<=data_counter -1;
> ...
>
> data_counter ist eine Variable und wird in der Architecture
> folgendermaßen deklariert:
> signal data_counter: integer range 0 to 7;
Korrektur: es ist ein Signal und keine Variable. (Das ist einwichtiger 
Unterschied im VHDL.)

> Mein Problem: Im Quartus kompiliert alles wunderbar und funktioniert
> auch auf der HW wie es soll (ich verwende das DE2 Board).
>
> Wenn ich meinen Code aber im ModelSim simuliere bekomme ich folgende
> Fehlermeldung:
>
> Fatal: (vsim-3421) Value -1 for data_counter is out of range 0 to 7.
Du versuchst von der 0 was abzuziehen, hast aber den gültigen 
Werteberich für data_counter auf 0 bis 7 festgelegt. Genau das meckert 
der Simulator an. Der Synthesizer macht da keine Prüfung, sondern wird 
Dir u.U. ungültige Werte zurückliefern. Es 'kann' sein, daß diese 
ungültigen Werte in Deiner Schaltung keine Rolle spielen. Dann hast Du 
Glück gehabt. Wenn nicht, hat Dir die Simulation an dieser Stelle 
gezeigt, daß es zu Problemen kommt.

Gerade bei Zählern ist dieses penible Verhalten manchmal etwas lästig. 
Probiere mal den folgenden Code:
1
  if data_counter = 0 then
2
     next_state   <= PARITY; 
3
  else
4
     data_counter <= data_counter - 1; 
5
  end if;

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Duke Scarring schrieb:
> Der Synthesizer macht da keine Prüfung, sondern wird
> Dir u.U. ungültige Werte zurückliefern.
Nein, das tut er wahrscheinlich nicht, es könnte aber sein, dass er das 
3-Bit-Signal (0..7) unnötigerweise um ein Vorzeichenbit erweitert, weil 
es ja auf -1 heruntergezählt werden soll.

Duke Scarring schrieb:
> Gerade bei Zählern ist dieses penible Verhalten manchmal etwas lästig.
> Probiere mal den folgenden Code:
Und das Lustige und Vorteilhafte daran: der Synthesizer erkannt das 
richtig und macht auch keine zusätzliche Kombinatorik für den else 
Zweig, sondern er macht einfach wie gewünscht einen 3-Bit-Zähler daraus.

von Andi (chefdesigner)


Lesenswert?

Abgesehen von der Bequemlichkeit, finde ich es streng genommen falsch, 
dass die Synthese das tut. Wenn man funktionell beschreibt, sollte auach 
das bei ruaskommen, was man definiert. Und eine Fehldefinition sollte 
angemahnt werden, statt zu bauen, was digital möglich und zufällig 
richtig ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas Fischer schrieb:
> Abgesehen von der Bequemlichkeit, finde ich es streng genommen falsch,
> dass die Synthese das tut.  Wenn man funktionell beschreibt, sollte auach
> das bei ruaskommen, was man definiert.
Es kommt genau das raus, was im Prozess beschrieben ist. Von jeher war 
die Sensitivliste nur ein Mittel, Simulationrechenzeit einzusparen. Denn 
sonst hätte jeder Prozess bei jeder Änderung irgeneines signals neu 
berechnet werden müssen.

> Und eine Fehldefinition sollte angemahnt werden, statt zu bauen,
> was digital möglich und zufällig richtig ist.
Aus diesem Grund lohnt es sich, den Synthesereport anzuschauen. Dort 
steht zumindest eine Info, dass die Liste korrigiert werden musste, um 
das Verhalten des Prozesses richtig synthetisieren zu können.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.