Forum: FPGA, VHDL & Co. Frage zu Case Warning: Choice in a Case statement not locally static


von Peter (Gast)


Lesenswert?

Hallo Zusammen,

Ich habe ein FPGA-internes Prozessorinterface, an das ich eine 
Componente anbinden will. In der Praxis funktioniert es auch 
einwandfrei, jedoch gibt der Simulator (ActiveHdl) mir ein Fehler, den 
ich über den Schalter -relax auf eine Warning runterschrauben kann. 
Trotzdem möchte ich gerne verstehen, was da passiert und was die 
Fehlermeldung auslösen könnte. Dazu habe ich mal die Relevanten Code 
Teile unten eingefügt.

 Bei den "when cAddrx =>" Zeilen kommt die Meldung
# Warning: COMP96_0546: xxx.vhd : Choice in a case statement is not 
locally static. Duplicate choices will not be detected.


Nach meinem Verständnis können sich die Konstanten Adressen aber nicht 
ändern, so dass es für mich keinen Grund gibt, weshalb der Compiler hier 
meckert. Da das Package, welches die Adressen beinhaltet, bereits 
kompiliert ist, sollten die Werte beim Kompilieren meines Moduls ja 
bekannt und vor allem fix sein.
1
--Processor interface:
2
iAddr     : in std_logic_vector (15 downto 0);
3
iDataBus  : in std_logic_vector (15 downto 0);
4
iWr       : in std_logic;
5
6
-- Constants, in ein Package ausgelagert
7
constant cAddr0 : std_logic_vector(15 downto 0) := x"0100";
8
constant cAddr1 : std_logic_vector(15 downto 0) := x"0101";
9
10
-- signals
11
signal sMyData0 : std_logic_vector(15 downto 0);
12
signal sMyData1 : std_logic_vector(15 downto 0);
13
14
-- hier ein Ausschnitt aus meinem synchronen Prozess:
15
if iWr = '1' then
16
  case iAddr is
17
    when cAddr0 =>
18
      sMyData0 <= iDataBus;
19
    when cAddr1 =>
20
      sMyData1 <= iDataBus;
21
  end case;
22
end if;

Ich freue mich auf sachdienliche Hinweise :-)

Viele Grüße,
Peter

von P. K. (pek)


Lesenswert?

Hmmm.

Ein guter Ansatz ist sicher herauszufinden, warum der Simulator die 
konstanten Werte von cAddrx (vermeintlich) nicht kennt.

Erwähnst Du das Package im header von xxx.vhd explizit, oder ist es 
einfach implizit da (z.B. in der library work)?

Dann könnte ich mir vorstellen, dass der Simulator beim Aufbau die Werte 
cAddrx (noch) nicht kennt, und drum auch nicht überprüfen kann, ob Werte 
mehrfach vorkommen.

Noch keine fixe Lösung, aber vielleicht ein Startpunkt...

von Duke Scarring (Gast)


Lesenswert?

Peter schrieb:
> Da das Package, welches die Adressen beinhaltet, bereits
> kompiliert ist, sollten die Werte beim Kompilieren meines Moduls ja
> bekannt und vor allem fix sein.
Wenn Du die Konstanten in der selben entity definierst, dann ist es 
locally static. Da erst endgültig zur Laufzeit feststeht, welches 
Package gültig ist, wird diese Warnung ausgegeben.

Eigentlich schade, weil sich die Opcodes für eine CPU so wunderbar in 
ein Package definieren lassen.

Duke

von Peter (Gast)


Lesenswert?

Hallo Peter,

das Package erwähne ich explizit:

library work;
  use work.MyAddr.all;

Wenn ich die Zeilen auskommentiere, bekomme ich (wie erwartet) die 
Fehlermeldung, dass cAddrX gar nicht bekannt ist...

von August (Gast)


Lesenswert?

Duke Scarring schrieb:
> Peter schrieb:
>> Da das Package, welches die Adressen beinhaltet, bereits
>> kompiliert ist, sollten die Werte beim Kompilieren meines Moduls ja
>> bekannt und vor allem fix sein.
> Wenn Du die Konstanten in der selben entity definierst, dann ist es
> locally static. Da erst endgültig zur Laufzeit feststeht, welches
> Package gültig ist, wird diese Warnung ausgegeben.
>
> Eigentlich schade, weil sich die Opcodes für eine CPU so wunderbar in
> ein Package definieren lassen.
>
> Duke

Ich mach sowas auch und bis auf die "Warnung" gibts keine 
Laufzeitprobleme ;-)

von Lattice User (Gast)


Lesenswert?

August schrieb:
> Ich mach sowas auch und bis auf die "Warnung" gibts keine
> Laufzeitprobleme ;-)

Bei der Warnung geht es ja auch nicht um Laufzeitprobleme. "Duplicate 
choices will not be detected" heisst ja dass er eventuelle Fehler in der 
Konstantenliste nicht erkennen kann. Das ist alles. Musst du halt von 
Hand sicherstellen.

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.