www.mikrocontroller.net

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


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@FPGAküchle:

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

Kest

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGAküchle (Gast)
Datum:

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

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: RJG (Gast)
Datum:

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

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: RJG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.