假设您的信号定义如下:
signal test_count : integer range 0 to 11;
现在,如果test_count在模拟中低于0或高于11,则会导致模拟立即崩溃。我想知道的是合成时会发生什么?如果test_count增加到11或减少到0,会发生什么?合成工具会强制信号环绕吗?请注意,我选择了一个不能轻松回到0000的示例。
答案 0 :(得分: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;
在此图中显示为RTL结果:
因此,在这种情况下,合成结果是一个4位计数器,具有增量和
通过信号clr_i
选择的多路复用器的清除值,并且没有任何范围
校验。因此,如果控制clr_i
信号的设计不能保持该值
在0到11的范围内,它可以输出声明范围0到11之外的值,
因此,即使是12到15的值。