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
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
#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.
@FPGAküchle: verstehe jetzt nicht, wie - "Warnung"? Oben habe ich nur "Error" gesehen :-o Kest
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
Hm, modelsim: error; synthese (XST): warning - so ists richtig. Denn error habe ich wohl auch per modelsim.ini weggedrückt.
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 ?
#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,
Was genau bedeutet "locally static"? Das LRM ist nicht sehr hilfreich dabei :-((
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.
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;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.