VHDL常量数组大小写选择

VHDL常量数组大小写选择,vhdl,modelsim,Vhdl,Modelsim,我的体系结构中有以下声明: 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",

我的体系结构中有以下声明:

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;

当所有选项在编译时都是常量时

以下是我发现的情况。希望它能帮助下一个搜索此答案的人:

该警告是由于编译器(VHDL-2008之前)不认为在体系结构级别定义的常量在进程中是局部静态的。为了实现这一点,必须在流程的声明块中定义它们


一种解决方案是使用VHDL 2008(vcom中的
-2008
选项)编译。另一个选项是将
nocasestaticerror
选项传递给vcom,vcom将抑制该警告。

使用-2008,其中选项将是局部静态的-请参阅IEEE Std 1076-2008 9.4.2局部静态初级,第1 n)段-2008中添加的一个索引名称,其前缀为本地静态主,其索引表达式均为本地静态表达式。同样,您可以为4个寄存器位置声明4个常量。为什么类型register\u bank\t的范围从1开始?指定常量地址值的聚合表达式不是类型register\u bank\t(您的值需要其他选择)参见6.4.2.2常量声明第3段:如果赋值符号“:=”后跟表达式出现在常量声明中,表达式指定常量的值;表达式类型应为常数类型。在详细说明声明后,无法修改常量的值。所有值未初始化的事实是我在复制原始代码并将其截断以节省空间时犯的错误。在本例中,寄存器没有名称:它们称为寄存器1、寄存器2,等等。你是说,如果我将索引声明为常量,那么这些选择将被视为静态的吗?不,具有静态索引的数组类型常量的索引名称仅指定为局部静态的,并且在IEEE Std 1076-2008的case语句中可接受为选项。使用符合-2008的工具或将地址定义为单独的常量e。g<代码>常量寄存器1\u地址:标准逻辑向量(31向下至0):=x“0000\u 1081”,等等。。如果register\u bank\t数组中的索引是本地静态的,则使用情况没有差异。
(vcom-1937) Choice in CASE statement alternative must be locally static.