ghdl Warnungen, aber wo ?

Gast #5621564
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
Gast #5621823
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
Angehängte Dateien:
Gast #5622155
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).
#5622240
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.
Gast #5622515
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)
Gast #5623540
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;
#5623710
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).
Gast #5623757
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".
Gast #5623794
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
#5623804
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 ...

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