-no case static error

Gast #388458
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
Gast #388459
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
Gast #388460
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.
Gast #388462
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
Gast #388464
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 ?
Gast #388465
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,
Gast #388467
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.
Gast #388468
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;
Gast #388469
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.
Gast #388470
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.

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