Forum: FPGA, VHDL & Co. ghdl Warnungen, aber wo ?


von Ale (Gast)


Lesenswert?

Ich kriege ein paar Warnungen mit ghdl, das Problem es ist daß es nicht 
sagt wo (in meinem Quelltext). Ich hab ghdl 0.35 (llvm/x64) unter 
Windows:

../../src/ieee2008/numeric_std-body.vhdl:3034:7:@0ms:(assertion 
warning): NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0

../../src/ieee2008/numeric_std-body.vhdl:3087:7:@1043us:(assertion 
warning): NUMERIC_STD.TO_UNSIGNED: vector truncated

Gibt es irgend ein Kommando/Option was man verwenden könnte so es sagt 
mindesten wie den Parameter heist ?.

ghdl -r --ieee=synopsys --std=08 tb --vcd=tb_11.vcd --stop-time=10ms

von Sebastian R. (sebastian_r569)


Lesenswert?

Zeile 3034 und 3087, jeweils Spalte 7?

von Ale (Gast)


Lesenswert?

wo (in meinem Quelltext)
Gibt es irgend ein Kommando/Option was man verwenden könnte so es sagt
mindesten wie den Parameter heist ?

lesen kann ich auch :/

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Schau Dir mal die Stellen an, an denen Du to_integer bzw. to_unsigned 
verwendest.
Die mögen es nicht, wenn etwas anderes als '0' oder '1' konvertiert 
werden soll.

Bei Modelsim setze ich in solchen Fällen die 'Break Severity' hoch, um 
die Stelle und den Zeitpunkt zu finden.

Duke

von berndl (Gast)


Lesenswert?

Duke Scarring schrieb:
> Schau Dir mal die Stellen an, an denen Du to_integer bzw. to_unsigned
> verwendest.
> Die mögen es nicht, wenn etwas anderes als '0' oder '1' konvertiert
> werden soll.

denke ich auch, da wird wohl ein nicht initialisierter std_logic_vector 
oder (un)signed nach Integer gemoppelt

von Theor (Gast)


Lesenswert?

RTFM

von berndl (Gast)


Lesenswert?

Theor schrieb:
> RTFM

Link?

von bko (Gast)


Lesenswert?

berndl schrieb:
> Link?

Dort hat jemand ein wenig Doku über den GHDL zusammengetragen:
http://www.dossmatik.de/vhdl.html

von Ale (Gast)


Lesenswert?

Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es 
gezeigt!
Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine 
Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).

von Markus F. (mfro)


Lesenswert?

Ale schrieb:
> Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es
> gezeigt!
> Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine
> Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).

Das tut es doch?

Der Fehler tritt in numeric_std-body.vhdl in Zeile 3034 auf.

Dort steht ein assert mit severity warning. Mach' da (von mir aus auch 
temporär) ein "severity error" draus und Du bekommst einen Fehler mit 
backtrace. Mit dem kannst Du festestellen, wo das Problem auftritt.

Das sollte aber auch ohne diese Änderung nicht allzu schwierig sein - so 
viele Stellen, wo Du to_integer() aufrufst, wird's ja wohl nicht geben.

von C. A. Rotwang (Gast)


Lesenswert?

Markus F. schrieb:
> Ale schrieb:
>> Evtl. habe ich das Problem nicht genau geschieldert: ghdl hat früher es
>> gezeigt!
>> Ich hab auf einem anderen Rechner ghdl 0.29.1 und es zeigt wo eine
>> Meldung kommt. 0.35 und 0.34 tuen es irgendwie nicht (mehr).
>
> Das tut es doch?
>
> Der Fehler tritt in numeric_std-body.vhdl in Zeile 3034 auf.

Genaugenommen tritt der Fehler nicht im Quelltext sondern während der 
Laufzeit auf. Und ursächlich ist nicht der Quelltext der meckert 
(konvertierungsroutine in Standard-lib) sondern entweder der Umstand das 
eine Konvertierung gemacht wird, die vermeidbar ist oder das ein 
mehrwertigessignal (höchstwahrscheinlich vom typ std_logic) einen Wert 
neben '1' oder '0' annimmt. Und es ist kein Fehler sondern eine warning, 
die man wennman deren Ursache kennt, getrost ignorieren kann.

Vielleicht hilft es den Code für einen anderen hdl-standard bspw. 93 zu 
kompilieren, vielleicht sind diese standardlibs genauer.
Dann könnte es auch sein, das "zuviel" optimiert wurde bei Compilieren, 
bspw Reduktion des Speicherbedarfs durch Entfernen der Symboltabelle. 
Bei manchen Compileren heisst die Option die die (hier mglw nötige) 
Synboltablle entfernt "-strip".


Auf die schnelle fallen mir in 
https://ghdl.readthedocs.io/en/latest/using/InvokingGHDL.html

folgende Optionen auf
--ieee=   ...versuch mal ne andere standard lib
-v        ..verbose (geschwätzig)

von Markus F. (mfro)


Lesenswert?

C. A. Rotwang schrieb:
> Genaugenommen tritt der Fehler nicht im Quelltext sondern während der
> Laufzeit auf.
Noch genauer genommen ist der Fehler keiner, sondern eine 
(beabsichtigte) Warnung.

> mehrwertigessignal (höchstwahrscheinlich vom typ std_logic)
Unwahrscheinlich (es gibt kein to_integer für std_logic). Eher signed 
oder unsigned...

von C. A. Rotwang (Gast)


Lesenswert?

Markus F. schrieb:
>> mehrwertigessignal (höchstwahrscheinlich vom typ std_logic)
> Unwahrscheinlich (es gibt kein to_integer für std_logic). Eher signed
> oder unsigned...

???
auch unsigned und signed sind vom Typ std_logic, genauer array of 
std_ulogic; lediglich ein paar Operatoren sind neu oder anders wie 
std_logic_vector definiert. Siehe package code - Auszug
1
package NUMERIC_STD is
2
  constant CopyRightNotice : STRING
3
    := "Copyright © 2008 IEEE. All rights reserved.";
4
5
  attribute builtin_subprogram: string;
6
7
  --============================================================================
8
  -- Numeric Array Type Definitions
9
  --============================================================================
10
11
  type UNRESOLVED_UNSIGNED is array (NATURAL range <>) of STD_ULOGIC;
12
  type UNRESOLVED_SIGNED is array (NATURAL range <>) of STD_ULOGIC;
13
14
  alias U_UNSIGNED is UNRESOLVED_UNSIGNED;
15
  alias U_SIGNED is UNRESOLVED_SIGNED;
16
17
  subtype UNSIGNED is (resolved) UNRESOLVED_UNSIGNED;
18
  subtype SIGNED is (resolved) UNRESOLVED_SIGNED;

Der Quelltext der lib ist beispeilsweise im Modelsim-Verzeichniss zu 
finden, bei Quartus -Lite unter 
\intelFPGA\18.0\modelsim_ase\vhdl_src\ieee

Und in der std_logic_arith sollte sich sehr wohl ein to_integer für 
std_logic_vector finden lassen:
 http://soc.eurecom.fr/EDC/lectures/vhdl/1164pkg.pdf Abschnitt 9.4..

Im Quelltext findet sich auch einen ähnliche Assertion wie vom TO 
zitiert, die sogar genauer als der wohl weniger geläufige Begriff 
'metavalue' ist:
1
  elsif tmp = 'X' then
2
      assert false
3
      report "CONV_INTEGER: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, and it has been converted to 0."
4
      severity WARNING;
5
      return 0;

von Markus F. (mfro)


Lesenswert?

C. A. Rotwang schrieb:
> Und in der std_logic_arith sollte sich sehr wohl ein to_integer für
> std_logic_vector finden lassen:

wer redet von std_logic_arith?

Die Meldung kommt doch eindeutig aus numeric_std.to_integer bzw. 
numeric_std.to_unsigned.

Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B. 
in einem report-Statement):
1
x <= to_integer(<unsigned>...
2
x <= to_unsigned(<natural>, ...)

wobei die Argumente nicht oder nicht vollständig initialisiert sind.

Die erste Warnung tritt @0 auf. Die kann man mit der ghdl run option 
--ieee-asserts=disable-at-0 unterdrücken. Die zweite würde dann immer 
noch kommen - will man die auch weg haben, geht das entweder durch eine 
entsprechende Initialisierung im Quelltext oder mit der run option 
--ieee-asserts=disable (nicht empfehlenswert, wenn man sich nicht später 
nach echten Problemen totsuchen will).

von C. A. Rotwang (Gast)


Lesenswert?

Markus F. schrieb:
> wobei die Argumente nicht oder nicht vollständig initialisiert sind.

Nö, fehlendes Init kann , muss aber nicht die Ursache dafür sein, das 
signale die mehr Werte als '0' und '1' annehmen können einen wie im 
report genannt "Metavalue" annehmen.

Unitialisiert wäre 'U', genauso kann es aber auch 'Z', was aber ein 
Initwert ist den man gerne Datenbussen zuweist.
https://www.csee.umbc.edu/portal/help/VHDL/misc.html

Wie bereits gestern geschrieben die Ursache liegt in der Verwendung 
mehrwertiger signale, ob nun unsigned, signed, std_logic ist Wurscht.


>Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B.
>in einem report-Statement):
1
--snip
2
x <= to_unsigned(<natural>)

Ich seh jetzt nicht, wo bei dieser Umwandlung von natural als subtype 
von integer metavalues auftreten können, 'integer' kennt kein 
"Unitialized" oder "Unknown".

von Duke Scarring (Gast)


Lesenswert?

Markus F. schrieb:
> Die erste Warnung tritt @0 auf. Die kann man mit der ghdl run option
> --ieee-asserts=disable-at-0 unterdrücken. Die zweite würde dann immer
> noch kommen - will man die auch weg haben, geht das entweder durch eine
> entsprechende Initialisierung im Quelltext oder mit der run option
> --ieee-asserts=disable
Oder man ergänzt den Code mit zusätzlichen to_01()-Funktionen.

Duke

von Markus F. (mfro)


Lesenswert?

C. A. Rotwang schrieb:
>>Der TO hat also irgendwo solcherart Code (möglicherweise implizit, z.B.
>>in einem report-Statement):--snip
> x <= to_unsigned(<natural>)
>
> Ich seh jetzt nicht, wo bei dieser Umwandlung von natural als subtype
> von integer metavalues auftreten können, 'integer' kennt kein
> "Unitialized" oder "Unknown".

An der Stelle sagt die Warning eindeutig "Vector truncated". Ich dachte, 
das wäre klar ...

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.