首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Synplify:不支持foo的非常数数据的异步加载。

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

Stack Overflow用户
提问于 2016-08-24 20:25:54
回答 1查看 1K关注 0票数 0

在试图使用Synplify Pro (格子版)编译和综合我的VHDL设计时,我会收到以下错误和警告:

代码语言:javascript
复制
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/计数器变量和信号(整数)的块:

代码语言:javascript
复制
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之前看到过这个错误和警告?

EN

回答 1

Stack Overflow用户

发布于 2016-08-25 08:27:10

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

代码语言:javascript
复制
process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;

代码语言:javascript
复制
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中可用的内容:

代码语言:javascript
复制
process (reset, clk)
begin
  if (reset = '1') then
    q <= '0'; -- or '1'
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;

但是,如果fabric寄存器中没有异步负载能力(因为在设备中不太可能),则此代码不会:

代码语言:javascript
复制
process (reset, clk)
begin
  if (reset = '1') then
    q <= d2;  -- Async load
  elsif (rising_edge(clk)) then
    q <= d;
  end if;
end process;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39132460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档