Fehler im ModelSim aber nicht im Quartus

Gast #2307124
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?
Gast #2307189
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
Moderator (Firma: Titel) Persönliche Seite #2307310
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.
Gast #2307334
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.
Moderator (Firma: Titel) Persönliche Seite #2307380
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren