Synplify:不支持异步加载foo的非常量数据

时间:2016-08-24 20:25:55

标签: asynchronous vhdl reset synthesis

在尝试使用Synplify Pro(莱迪思版)编译和合成我的VHDL设计时,我收到以下错误和警告:

Asynchronous load of non-constant data for counter(0) is not supported
Input data for signal counter(31 downto 0) contains references to signal edges. An asynchronous reset may be missing from the sensitivity list.

第一个错误是CL126,在手册中描述为'HDL代码包含顺序元素上异步加载的不完整描述。'

第二行是警告(CL116),但在手册中找不到,谷歌也是空的。

我从中收集到的是Synplify以某种方式无法推断出正在使用异步复位,尽管我没有为同一行提供警告而导致其他行的第一个错误。

包含cnt / counter变量和signal(整数)的块:

receive_counter : process (reset, receive_add, receive_rst) 
    variable cnt        : integer;
begin
    if reset = '1' or receive_rst'event then
        cnt     := -1;
        counter <= -1;
    elsif receive_add'event then
        cnt     := cnt + 1;
        counter <= cnt;
    end if;
end process;

复位信号从顶层设计向下传播到包含多个模块的低级设计文件,每个模块都包含与此奇异模块相同的逻辑。我无法确定为什么Synplify将此模块与其他模块区别对待。

我已经查看了重置分发树和相关信息,认为它可能对我有帮助,但我不完全确定这就是问题的原因所在。也许这里的任何人都有线索,或者至少在Synplify之前看过这个错误和警告?

1 个答案:

答案 0 :(得分:2)

在我使用的任何综合工具中,有两种有效的模式用于实现重置。显然,边缘(上升或下降)可以改变,复位的极性也可以改变:

process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;

process (clk)
begin
  if (rising_edge(clk)) then
    if (reset = '1') then
      q <= '0';
    else
      q <= d;
    end if;
  end if;
end process;

您要描述的是一个对两个不同时钟上的两个边边缘敏感的寄存器,并且FPGA中不存在此类寄存器布。您需要提出一种仅使用对一个时钟敏感的寄存器的设计。

关于错误:

  

不支持计数器(0)的非常量数据的异步加载

如果您查看FPGA的手册,您应该找到具体可用逻辑资源的详细说明,以及设备中的寄存器的确切内容。通常,这些可能具有数据输入,启用和异步控制,可以在配置时设置清除寄存器。我无法看到您发布的代码实际上正在执行错误消息所说的内容,但您在我使用的任何FPGA设备中无法拥有的是异步加载。这似乎是特定错误消息所说的内容。当我之前意外地犯了这个错误时,工具推断出一个锁存器,这是不可取的。如上所述,以下代码应映射到FPGA中可用的内容:

process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;

但是,如果结构寄存器中没有异步加载功能(因为您的设备中不可能存在异步加载功能),则此代码不会:

process (reset, clk)
begin
  if (reset = '1') then
    q <= d2;  -- Async load
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;