VHDL中的整数超出范围时会发生什么?

Rus*_*ell 5 synthesis vhdl

假设您有一个定义如下的信号:

signal test_count : integer range 0 to 11;
Run Code Online (Sandbox Code Playgroud)

现在,如果在模拟中test_count小于0或大于11,将导致模拟立即崩溃。我想知道的是,将其合成后会发生什么?如果test_count增加到11以上或减少到0以下,会发生什么情况?综合工具会迫使信号回绕吗?请注意,我选择了一个示例,该示例不能轻易地返回到0000。

Mor*_*mer 8

该工具假定信号设计使信号保持在范围内,因此在不正确的情况下,电路可以在内部总线上提供用于实现整数值的任何输出。在这种情况下,对于0到11,它将是一个4位总线,并且如果设计不将值保持在0到11的范围内,那么在合成电路中甚至可能出现12到15范围内的“非法”值。 。

另外,如果该值增加到超过11,那么计数器应该饱和还是自动换行?根本没有定义。

该计数器的Altera QII结果如下:

architecture syn of mdl is  -- Counter with clear
  signal test_count : integer range 0 to 11;
begin

  process (clk_i) is
  begin
    if rising_edge(clk_i) then
      if clr_i = '1' then  -- Clear
        test_count <= 0;
      else  -- Increment
        test_count <= test_count + 1;
      end if;
    end if;
  end process;

  z_o <= std_logic_vector(to_unsigned(test_count, 4));

end architecture;
Run Code Online (Sandbox Code Playgroud)

在该图中显示为RTL结果:

在此处输入图片说明

因此,在这种情况下,合成结果是一个4位计数器,该信号具有mux的增量和清除值,该信号是通过signal选择的clr_i,并且没有任何范围检查。因此,如果控制clr_i信号的设计未将值保持在0到11的范围内,则它可能会输出超出声明的范围0到11的值,因此甚至会输出12到15的值。