假设您有一个定义如下的信号:
signal test_count : integer range 0 to 11;
Run Code Online (Sandbox Code Playgroud)
现在,如果在模拟中test_count小于0或大于11,将导致模拟立即崩溃。我想知道的是,将其合成后会发生什么?如果test_count增加到11以上或减少到0以下,会发生什么情况?综合工具会迫使信号回绕吗?请注意,我选择了一个示例,该示例不能轻易地返回到0000。
该工具假定信号设计使信号保持在范围内,因此在不正确的情况下,电路可以在内部总线上提供用于实现整数值的任何输出。在这种情况下,对于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的值。