Fehlermeldung beim arbeiten mit real Zahlen

OP #6862952
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;
#6863933
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.
#6863942
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.
Gast #6864006
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(?).
#6864157
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.
Gast #6864364
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.