VHDL常量数组案例选择
VHDL constant array case choice
我的架构中有以下声明:
architecture behavioral of my_widget is
type register_bank_t is array(1 to 4) of std_logic_vector(31 downto 0);
-- register addresses
constant address : register_bank_t := (
x"0000_1081", -- 1
x"0000_1082", -- 2
x"0000_1083", -- 3
x"0000_1084" -- 4
);
..
然后,在同一架构内的进程中,我做:
case bus_addr is
when address(1) =>
r_output_value <= reg(1);
when address(2) =>
r_output_value <= reg(2);
when address(3) =>
r_output_value <= reg(3);
when address(4) =>
r_output_value <= reg(4);
when others =>
r_output_value <= (others => '0');
end case;
我不明白为什么 Modelsim 会给我以下警告:
(vcom-1937) Choice in CASE statement alternative must be locally static.
当所有的选择在编译时都是明确的常量。
这是我的发现。希望它能帮助下一个搜索此答案的人:
该警告是由于编译器(VHDL-2008 之前)在进程中不认为在体系结构级别定义的常量是局部静态的。为了实现这一点,它们必须在进程的声明块中定义。
一种解决方案是使用 VHDL 2008 进行编译(-2008
vcom 中的 -2008
选项)。另一种选择是将 nocasestaticerror
选项传递给 vcom,这将抑制警告。
我的架构中有以下声明:
architecture behavioral of my_widget is
type register_bank_t is array(1 to 4) of std_logic_vector(31 downto 0);
-- register addresses
constant address : register_bank_t := (
x"0000_1081", -- 1
x"0000_1082", -- 2
x"0000_1083", -- 3
x"0000_1084" -- 4
);
..
然后,在同一架构内的进程中,我做:
case bus_addr is
when address(1) =>
r_output_value <= reg(1);
when address(2) =>
r_output_value <= reg(2);
when address(3) =>
r_output_value <= reg(3);
when address(4) =>
r_output_value <= reg(4);
when others =>
r_output_value <= (others => '0');
end case;
我不明白为什么 Modelsim 会给我以下警告:
(vcom-1937) Choice in CASE statement alternative must be locally static.
当所有的选择在编译时都是明确的常量。
这是我的发现。希望它能帮助下一个搜索此答案的人:
该警告是由于编译器(VHDL-2008 之前)在进程中不认为在体系结构级别定义的常量是局部静态的。为了实现这一点,它们必须在进程的声明块中定义。
一种解决方案是使用 VHDL 2008 进行编译(-2008
vcom 中的 -2008
选项)。另一种选择是将 nocasestaticerror
选项传递给 vcom,这将抑制警告。