VHDL ist doch sehr eigenartig. Folgendes ended in eine "Choice FOO is
not a locally static expression" Warning:
1 | package pkg_la_register is
|
2 |
|
3 | subtype addr_t is unsigned(7 downto 0);
|
4 | subtype addr_base_t is unsigned(addr_t'range);
|
5 |
|
6 | constant EXT_TRIGGER_BASE : addr_base_t
|
7 | := (7|6 => '1', others => '0');
|
8 |
|
9 | constant MSB_BASE : natural := addr_base_t'high;
|
10 | constant LSB_BASE : natural := 4;
|
11 |
|
12 | subtype addr_msb_t is unsigned(MSB_BASE-LSB_BASE downto 0);
|
13 |
|
14 | constant ADDR_EXT_TRIGGER_BASE : addr_msb_t
|
15 | := EXT_TRIGGER_BASE(MSB_BASE downto LSB_BASE);
|
16 | ...
|
und
1 | case address(MSB_BASE downto LSB_BASE) is
|
2 | when ADDR_EXT_TRIGGER_BASE => ... -- WARNING
|
Wie konstant bzw. variable kann denn eine Konstante denn sein, selbst
in einer package?? Lt. google gibt's tolle Begründungen und auch
Lösung wie: man schreibe doch gleich:
1 | constant ADDR_EXT_TRIGGER_BASE : addr_msb_t := "01010...."
|
Na, dann kann ich mir die ganzen Identifier Kram eh sparen und sofort
los hacken ... Habe ich beim googeln etwas übersehen? andere Lösungen?
Ziel ist zumindest den oberen Teil des Address Busses vom unteren
abzuspalten und in einer verschachtelten case zu verarbeiten. Lt.
google ist die Lokalität mehr ein "Pünktchen" (selbst convert
funktions wie to_integer() in einer Zuweisung sind nicht mehr lokal).
Da es ja hoffentlich nach der Synthese auch noch Konstanten bleiben,
ist die Meldung eher nur nervig bei der Synthese. Modelsim hat dafür
einen eigenen switch.
Viele Grüße
Olaf