Forum: FPGA, VHDL & Co. -no case static error


von chris (Gast)


Lesenswert?

hallo,
ich habe eine Reihe von Constants deklariert aus denen sich meine
Adresse zusammensetzt.

um jtezt bei der Testbench eine case auswahl machen zu können

etwa so

 case ADDR is

  when CONST_BASE & CONST_1 => mach irgendwas
  when CONST_BASE & CONST_2 => mach irgendwas
  usw....
end case;

jetzt ist mein Probelm das wenn ich ModelSim starte, der Fehler :
ERROR: test.vhd(21): Case choice must be a locally static expression.


hab das mal gegeoogelt und rausgefunden das man es abschalten kann,
mit -nocasestaticerror

allerdings hab ich wenig ahnung wo ich es eingeben muss ?

ich starte MopdelSim aus  Xilinx ISE 7.1

ich dachte ich kann es einfach in der zeile der *fdo Datei,
in der meine Testbench aufgerufen wird mit eintippen ....

etwa so ...

## NOTE:  Do not edit this file.
## Autogenerated by ProjNav (creatfdo.tcl) on Tue May 16 13:13:44
Westeuropäische Sommerzeit 2006
##
vlib work
vcom
vcom -93 -explicit  constants.vhd
vcom -93 -explicit  hallo.vhd
vcom -93 -explicit  tb_hallo.vhd
vsim -t 1ps   -lib work tb_txsequence_vhd
do {tb_txsequence_vhd.udo}
view wave
add wave *
view structure
view signals
run 1000ns


und so wollte ich es amchen

##
vlib work
vcom
vcom -93 -explicit  constants.vhd
vcom -93 -explicit  hallo.vhd
vcom -93 -nocasestaticerror -explicit  tb_hallo.vhd
vsim -t 1ps   -lib work tb_txsequence_vhd
do {tb_txsequence_vhd.udo}
view wave
add wave *
view structure
view signals
run 1000ns

allerdings ging das uch nicht ..
selber fehler wie oben ....

 danke für tipps

   Chris

von Kest (Gast)


Lesenswert?

Ich rate mal

ERROR: test.vhd(21): Case choice must be a locally static expression

heist so viel, dass Du
when CONST_BASE & CONST_1 => ...

nicht schreiben darfst. Also "&" muss weg. Kannst ja als erstes ein
Signal difinieren und denn dann überprüfen, also

sig <= CONST_BASE & CONST_1;
...
when sig => ...

Wenn's nicht klappt, dann...

Gruß
Kest

von FPGAküchle (Gast)


Lesenswert?

#Ich rate mal

#ERROR: test.vhd(21): Case choice must be a locally static expression

#heist so viel, dass Du
#when CONST_BASE & CONST_1 => ...

#nicht schreiben darfst. Also "&" muss weg. Kannst ja als erstes ein
#Signal difinieren und denn dann überprüfen, also

#sig <= CONST_BASE & CONST_1;
#...
#when sig => ...

#Wenn's nicht klappt, dann...


Hm ist ein versuch wert das "&" zu ersetzten, aber es wird wohl nicht
helfen. Case mit Konstanten produziert bei mir immer diese Warning,
man will wohl ein Literal dort also

Case mit "001" "000" etc. Aber Konstanten machen genau das gleiche
und der Code ist übersichtlicher. Vielleicht hilft es die Konstanten im
selben file wie das Case, besser noch in einem Block mit dem Case zu
deklarieren.

Aber ich habe entliche designs mit dieser Warning (wg. Konstanten statt
Literalen) und es funktioniert in Simu und auf FPGA wunderbar.

IMHO eine Warning mit der man Leben muss.

von Kest (Gast)


Lesenswert?

@FPGAküchle:

verstehe jetzt nicht, wie - "Warnung"? Oben habe ich nur "Error"
gesehen :-o

Kest

von chris (Gast)


Lesenswert?

hi,
ja genau, bei mir gibts ein Error.

ich hab jetzt die Case durch if ersetzt.


[vhdl]
   if ADDR =  CONST_BASE & CONST_1
   elsif ADDR =  CONST_BASE & CONST_2
.
.
.
[\vhdl]




achja, in modelsim.ini ( im gleichen ornder wie das Projekt)
kann man -nocasestaticerror acuh ein oder ausschalten ....

nur falls mal jemand durch die suche auf meinem Beitrag stößt .....


 chris

von FPGAküchle (Gast)


Lesenswert?

Hm, modelsim: error; synthese (XST): warning - so ists richtig.

Denn error habe ich wohl auch per modelsim.ini weggedrückt.

von chris (Gast)


Lesenswert?

bei mir hat das irgendwie nicht funktioniert.

ich hab

; NoCaseStaticError =1

zu

NoCaseStaticError =1

gemacht , aber hat nichts geholfen , oder muss ihc das bei der
modelsim.ini in dem Modelsim verzeichniss machen ?

von FPGAküchle (Gast)


Lesenswert?

#bei mir hat das irgendwie nicht funktioniert.

#ich hab

#; NoCaseStaticError =1

#zu

#NoCaseStaticError =1

#gemacht , aber hat nichts geholfen , oder muss ihc das bei der

das ist eines der Probleme mit modelsim, welche ini nimmt der denn. Die
vermehren sich auf meiner Platte wie die Karnickel. Lass mal nach allen
modelsim.ini Dateien auf der Platte suchen und lösche/sichere die
unnötigen. Dann hilft es einen Fehler in die modelsim zu schreiben,
z.B. NoBierforBavarians = 1. Ist es die richtige wird sich modelsim
beim starten beschweren.

Dann Kannst Du compileoptions auch per Menu Compile Settings setzen,
Also Compile -> compile options und in der zeile other compile options
die Zeile: NoCaseStaticError =1
hacken. Apply button nicht vergessen, vielleicht gibts auch noch ein
save options was ich jetzt übersehen habe.

Auch beliebt sind doppelt angegeben Optionen, also oben im Ini setzt du
den wert auf 1 und weiter unten wieder aud 0. Mal nach dem Keyword per
editor suchen,

von RJG (Gast)


Lesenswert?

Was genau bedeutet "locally static"? Das LRM ist nicht sehr hilfreich
dabei :-((

von FPGAküchle (Gast)


Lesenswert?

Also die FAQ der Newsgroup comp.lang.vhdl sagt:

"B.147 locally static expression: An expression that can be evaluated
during
the analysis of the design unit in which it appears. (§7.4, §7.4.1)"

IMHO heisst das, wenn die Architecture analysiert(compiliert) wird muss
der Ausdruck fix sein. Das schliesst z.B. Generics aus, da die erst bei
der Instanziierung der Entity, die diese architecture enthält gesetzt
werden. Signale und Variablen sowieso da sich deren wert während der
(Simulator-) Laufzeit ändert.

Bei constant ist die Frage ob sie später gesetzt werden können. Wenn
diese in der Architecture deklariert werden, sollten sie locally static
sein. Wenn aber die Konstanten einem package entnohmen werden und dort
erst im package body gesetzt werden, sehe ich die Möglichkeit durch
eine Konfiguration diesen Wert zu ändern.

Oder das package ist in einer Bibliothek und das Library mapping könnte
geändert werden.

Ich werde mal bei gelegenheit testen ob Konstanten die in der
architecture deklariert werden auch diese fehlermeldung provozieren.

von RJG (Gast)


Lesenswert?

Habe spaßeshalber mal ein kleinen Test gemacht:

========================================================
library ieee;
use ieee.STD_LOGIC_1164.all;
library ieee;
use ieee.STD_LOGIC_ARITH.all;


entity  TESTCASE  is
   port ( RES_N : in std_logic;
          CLK   : in std_logic;
          ADR   : in std_logic_vector(15 downto 0);
          TEST  : out std_logic_vector(11 downto 0)
         );

end TESTCASE;



architecture  arch  of  TESTCASE  is
  constant max : natural := 16;
  subtype adr_type is std_logic_vector(max-1 downto 0);

   constant a_adr : adr_type := conv_std_logic_vector(16#0000#, max);
   constant b_adr : adr_type := conv_std_logic_vector(16#F020#, max);


begin

   process (RES_N, CLK)
   begin
      if RES_N = '0' then
         TEST <= (others => '0');
      elsif rising_edge(CLK) then
         case ADR is
            when a_adr => TEST <= x"001";
            when b_adr => TEST <= x"002";
            when others => null;
         end case;
      end if;
   end process;
end arch;

von FPGAküchle (Gast)


Lesenswert?

Bringt mit modelsim ne warning, ist wohl nicht lokal statisch, warum
auch immer:


 Model Technology ModelSim XE II vcom 5.8c Compiler 2004.03 Mar 26
2004
# -- Loading package standard
# -- Loading package std_logic_1164
# -- Loading package std_logic_arith
# -- Compiling entity testcase
# -- Compiling architecture arch of testcase
###### D:/jjj(34):             when a_adr => TEST <= x"001";
#
# ** Warning: D:/jjj(34): Case choice must be a locally static
expression.
###### D:/jjj(35):             when b_adr => TEST <= x"002";
#
# ** Warning: D:/jjj(35): Case choice must be a locally static
expression.

von FPGAküchle (Gast)


Lesenswert?

Aber folgend bleibt die warning aus:


library ieee;
use ieee.STD_LOGIC_1164.all;
library ieee;
use ieee.STD_LOGIC_ARITH.all;


entity  TESTCASE  is
   port ( RES_N : in std_logic;
          CLK   : in std_logic;
          ADR   : in std_logic_vector(15 downto 0);
          TEST  : out std_logic_vector(11 downto 0)
         );

end TESTCASE;



architecture  arch  of  TESTCASE  is
  constant max : natural := 16;
  subtype adr_type is std_logic_vector(max-1 downto 0);

   constant a_adr : adr_type := (others => '1');
   constant b_adr : adr_type := (others => '0');


begin

   process (RES_N, CLK)
   begin
      if RES_N = '0' then
         TEST <= (others => '0');
      elsif rising_edge(CLK) then
         case ADR is
            when a_adr => TEST <= x"001";
            when b_adr => TEST <= x"002";
            when others => null;
         end case;
      end if;
   end process;
end arch;


Die Konvertierung integer -> std_logic_vector stört, wohl weil sie aus
nem Package stammt.

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.