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.