Forum: FPGA, VHDL & Co. Fehlermeldung beim arbeiten mit real Zahlen


von Daniel P. (daniel2345)


Lesenswert?

Hallo zusammen,

ich habe mir eine Testbench gebaut um einen neuen Block zu testen.
Das funktioniert soweit auch sehr gut.
Um allerdings das korrekte Runden in dem Block zu testen, habe ich die 
Rechnungen parallel mit real Zahlen nachgebaut.
Aber bei der Multiplikation oder auch Division von zwei Real Signalen 
bekomme ich beim Starten der Simulation in Modelsim folgende 
Fehlermeldung:
** Fatal: (vsim-3421) Value 1.#INF for prod2_real is out of range 
-1e+308 to 1e+308.
Ganz egal welche Zahlen ich verwende.

Wenn ich aber für die Berechnung keine Signale verwende sondern nur 
einen Zahlenwert benutze, dann gibt es keinen Fehler.

Hat jemand eine Idee?

Danke und Gruß
Daniel

Hier das Minimalbeispiel:
1
   
2
   
3
LIBRARY ieee;
4
USE ieee.std_logic_1164.all;
5
USE ieee.numeric_std.ALL;
6
use IEEE.math_real.all;
7
8
ENTITY testbench_test IS
9
10
END testbench_test ;
11
12
13
ARCHITECTURE struct OF testbench_test IS
14
15
   SIGNAL diff1_real          : real;
16
   SIGNAL diff2_real          : real;
17
   SIGNAL kp_real             : real;
18
   SIGNAL prod1_real          : real;
19
   SIGNAL prod2_real          : real;
20
   SIGNAL vdiff_real          : real;
21
22
23
24
BEGIN
25
  
26
   
27
  
28
 
29
  kp_real <= 2.0;
30
  vdiff_real <= 4096.0;
31
  diff1_real <= 100.0;
32
  
33
  diff2_real <= 100.0;
34
   
35
  prod1_real <= diff1_real*kp_real;
36
  prod2_real <= diff2_real/vdiff_real;
37
  
38
39
END struct;

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


Angehängte Dateien:

Lesenswert?

Hilft dir zwar nicht viel weiter, aber: der ISIM kanns ohne Meckern.

BTW: für diese elementaren Rechnungen brauchst du keine math_real.

von Empfehler (Gast)


Lesenswert?

Daniel P. schrieb:
> Hat jemand eine Idee?

schreib der deklaration auch eine initialisierung dran.

von Daniel P. (daniel2345)


Lesenswert?

Empfehler schrieb:
> Daniel P. schrieb:
>> Hat jemand eine Idee?
>
> schreib der deklaration auch eine initialisierung dran.

Danke für den Tipp.
Ich habe die Signale mit einer Zahl ungleich 0 initialisiert und jetzt 
klappt es.

von Sigi (Gast)


Lesenswert?

Lothar M. schrieb:
> Hilft dir zwar nicht viel weiter, aber: der ISIM kanns ohne Meckern.

Also das sollte SEHR zu Denken geben, insb. bei dem Quelltext.

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


Lesenswert?

Sigi schrieb:
> Also das sollte SEHR zu Denken geben, insb. bei dem Quelltext.
Stimmt, ich habe da einen Verdacht und muss mal die Reihenfolge der 
Signalzuweisungen umsortieren. Es hat den Anschein, als ob der ISIM das 
Top-Down und nicht gleichzeitig macht.

von Markus F. (mfro)


Lesenswert?

Sigi schrieb:
> Lothar M. schrieb:
>> Hilft dir zwar nicht viel weiter, aber: der ISIM kanns ohne Meckern.
>
> Also das sollte SEHR zu Denken geben, insb. bei dem Quelltext.

Nö. In VHDL werden nicht explizit initialisierte Signale implizit mit 
dem Wert <type>'LEFT initialisiert.

So, wie's hier aufgeschrieben ist, spielt's (wegen concurrent 
statements) keine Rolle, ob die "Initialisierung" (die keine ist) über 
oder unter der Rechnung steht, im ersten Simulationsschritt wird die 
Rechnung jedenfalls mit den implizit initialisierten Werten 
durchgeführt.

und
real'left * real'left ergibt nun mal #inf.

VHDL definiert nirgends, ob 'infinity' ein erlaubter Wert für ein real 
ist oder nicht (ModelSim nimmt offensichtlich Letzteres an, ghdl z.B. 
nicht).

M.E. völlig akzeptabel und überhaupt nicht besorgniserregend.

von Markus F. (mfro)


Lesenswert?

Lothar M. schrieb:
> Sigi schrieb:
>> Also das sollte SEHR zu Denken geben, insb. bei dem Quelltext.
> Stimmt, ich habe da einen Verdacht und muss mal die Reihenfolge der
> Signalzuweisungen umsortieren. Es hat den Anschein, als ob der ISIM das
> Top-Down und nicht gleichzeitig macht.

wenn da nirgends #inf auftaucht, macht ISIM das m.E. falsch.

von Sigi (Gast)


Lesenswert?

Markus F. schrieb:
> Nö. In VHDL werden nicht explizit initialisierte Signale implizit mit
> dem Wert <type>'LEFT initialisiert.
Das ist schon klar (std_logic ist ja auch immer 'U'), darum
ging's aber nicht. Erstaunlisch ist, das es bei Lothar
geklappt hat. (und dann noch mögliche Interpretationen des
Quelltextes, du schreibst ja auch von "Initialisierung")

Markus F. schrieb:
> und
> real'left * real'left ergibt nun mal #inf.
Die Fehlermeldung aus Post 1 bezieht sich aber auf die
Division, und da bin ich bis jetzt davon ausgegangen,
dass die Fehlermeldung Oben so iO ist, die Simulation
von ISIM aber nicht. und hier schreibst du:
Markus F. schrieb:
> VHDL definiert nirgends, ob 'infinity' ein erlaubter Wert für ein real
> ist oder nicht
Muss ich mal nach suchen, bin bis jetzt immer davon ausgegangen,
dass REAL auf IEEE754 basiert, und da ist es doch wohl eindeutig
definiert(?).

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


Lesenswert?

Sigi schrieb:
> Erstaunlisch ist, das es bei Lothar
> geklappt hat.
Ja, das mit dem 'left ist klar, aber warum es dann da im allerersten 
Augenblick nicht gleich scheppert wundert mich schon auch. Dienstag 
schau ich mir das nochmal an.

von Markus F. (mfro)


Lesenswert?

Sigi schrieb:
> Die Fehlermeldung aus Post 1 bezieht sich aber auf die
> Division,

Mein ModelSim (10.1d und 10.5b) meldet mit dem Design vom 1. Post den 
Fehler hier:

 ** Fatal: (vsim-3421) Value inf for prod1_real is out of range -1e+308 
to 1e+308.

Also bei der Multiplikation und nicht bei der Division. Auch wenn ich 
die Multiplikation auskommentiere, kommt bei der Division kein Fehler 
(fühle mich bestätigt). Das ModelSim vom TO scheint kaputt zu sein.

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


Lesenswert?

Markus F. schrieb:
> Das ModelSim vom TO scheint kaputt zu sein.
Sieht ganz so aus. Oder die Meldung passt nicht zum Code... 😉

: Bearbeitet durch Moderator
von Fpgakuechle K. (Gast)


Lesenswert?

Markus F. schrieb:
> Sigi schrieb:
> Das ModelSim vom TO scheint kaputt zu sein.

vielleicht liegt es ja auch an unterschiedlichen Settings in der 
modelsim.ini.
Ich tippe  da mal auf 'NoRangeCheck = 1'
1
; Inhibit range checks on all (implicit and explicit) assignments to
2
; scalar objects defined with subtypes.
3
; NoRangeCheck = 1

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.