Vivado没有学会做类型推断吗?

时间:2014-12-16 01:02:56

标签: vhdl xilinx synthesis vivado

我有大量的实体实例:

GPIO : entity L_PicoBlaze.pb_GPIO_Adapter
  generic map (
    [...]
  )
  port map (
    Clock    => CPU_Clock,   -- Clock : in STD_LOGIC;
    Reset    => '0',         -- Reset : in STD_LOGIC;  -- line 645
    [...]
  );

上面的代码正在使用:
- ISE XST 14.7
- Quartus II 13.x
- ISE iSim 14.7
我也很确定,我用Vivado 2013.x成功编译了我的设计!!!

Vivado(2014.4)Synth抱怨说,'0'有3种可能的类型解析:
[Synth 8-2396]附近的角色' 0' ; 3种可见类型匹配[" D:/ git /.../ PicoBlaze / System.vhdl":645]

重置声明如下:
Reset : in STD_LOGIC

我可以使用合格的表达式来解决这个问题:

GPIO : entity L_PicoBlaze.pb_GPIO_Adapter
  generic map (
    [...]
  )
  port map (
    Clock    => CPU_Clock,
    Reset    => STD_LOGIC'('0'),  -- line 645
    [...]
  );

我认为这(a)看起来很糟糕,(b)是Synth的错误。

我认为ISE XST和其他工具正在进行反向/反向类型推断以确定正确的文字类型。

是否有人遇到过这个问题? 我的编码风格是如此糟糕,如果我写的是' 0',x" 00..00"或" 00..00"在港口地图?

编辑1 - 最小和完整示例:

library IEEE;
use     IEEE.std_logic_1164.all;

entity top is
  port (
    Clock   : in  STD_LOGIC;
    Reset   : in  STD_LOGIC;
    OUTPUT  : out  STD_LOGIC
  );
end entity;

architecture rtl of top is
begin
  toggle : entity work.TFF
    port map (
      Clock    => Clock,
      Reset    => '0',            -- line 17
      Q        => Output
    );
end;

-- a simple toggle flip flop
library IEEE;
use     IEEE.std_logic_1164.all;

entity TFF is
  port (
    Clock   : in  STD_LOGIC;
    Reset   : in  STD_LOGIC;
    Q       : out  STD_LOGIC
  );
end entity;

architecture rtl of TFF is
  signal Q_r    : STD_LOGIC    := '0';
begin
  process(Clock)
  begin
    if rising_edge(Clock) then
      if (Reset = '1') then
        Q_r    <= '0';
      else
        Q_r    <= not Q_r;
      end if;
    end if;
  end process;
  Q    <= Q_r;
end;

Vivado 2014.4错误信息:
[Synth 8-2396]附近的角色&#39; 0&#39; ; 3种可见类型匹配[&#34; D:/Temp/OverloadTest/overload.vhdl" ;:17]

编辑2:

我找到了一个工作示例:我只是将实体tff的声明放在顶级声明的前面。它接触到 [Synth 8-2396]附近......可见类型匹配来自Vivado的错误消息只是一种笨拙的方式告诉我们,它无法找到对整个组件/文件?

我需要一些时间来重新检查我的文件列表(&gt; 300)以查找丢失的文件/组件。

2 个答案:

答案 0 :(得分:1)

这并不一定能回答您的问题,但会在评论链中解决您的问题:

  

所以Vivado 2013.4也存在同样的问题:( ...我使用了一个空项目   并添加了一个源文件(见上文)。之后我点击了跑步   合成&#39 ;.我还尝试使用此TCL命令启用VHDL-2008:   set_property vhdl_version vhdl_2008 [current_fileset]并运行   再次合成 - &gt;没变。我该如何联系Xilinx?网络是   废除了...论坛?

请参阅AR# 62291,您仍然可以通过open Webcase操作打开新的网络版问题。

我从原始代码段写的测试用例巧合地在测试用例和它的直接实体实例化测试单元(标记为GPIO)之间具有正确的声明/规范顺序:

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;

entity pb_GPIO_Adapter is
    generic (foo: natural := 42);
    port (
    Clock:  in      std_logic;
    Reset:  in      std_logic;
    dummy:  out     std_logic
    );
end entity;

architecture foo of pb_GPIO_Adapter is

begin
DUMB:
    process (Clock, Reset)
        variable dumbit:    std_logic := '0';
    begin
        if Reset = '1' then
            dumbit := '0';
        elsif rising_edge(Clock) then
            dumbit := not dumbit;
        end if;
        dummy <= dumbit;
    end process;
end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity fum is
end entity;

architecture fie of fum is
    signal dummy:       std_logic;
    signal CPU_Clock:   std_logic := '0';
    signal Reset:       std_logic;
begin
GPIO: 
    entity work.pb_GPIO_Adapter -- work substituted for L_PicoBlaze
        generic map (
           foo => 42
        )
    port map (
        Clock    => CPU_Clock,         -- Clock : in STD_LOGIC;
        Reset    => '0',               -- Reset : in STD_LOGIC;
        dummy    => dummy
    );
CLOCK:
    process
    begin
        wait for 10 ns;
        CPU_Clock <= not CPU_Clock;
        if Now > 200 ns then
            wait;
        end if;
    end process;
end architecture;

注意我自然(对我来说)得到了正确的分析顺序。我的意思是提高你的最小可验证和完整例子中的顺序,但是在评论中已经剪了很长时间。您还可以注意到长评论问题和答案链是不可搜索的,任何获得的东西都对其他stackoverflow用户没有任何好处。

关注AR#62291(顺便提一下Vivado 2014.3)我们在解决方案 -

下看到了
  

发生错误是因为RTL文件不同步且未正确声明信号类型。

请注意语言不是VHDL术语。

这使得Xilinx之前的神秘XST错误消息符合要求,并表明在合成之前仍需要至少分析和详细说明设计规范。我们本可以希望更好。至少通过Xilinx的错误代码(例如[Synth 8-2396])比某些竞争对手更容易找到信息。

无论如何,你在你的MVCe中得到了同样的东西,并且内容是错误的分析顺序告诉我们它可以通过苦差事来解决。

您还可以在AR# 62291链接中注明标有open Webcase的操作项,它会引导您进入WebCase Support Page,您可以登录并打开新的Webcase问题

我认为一旦您在设计中发现分析订单问题并更正它,您就会重新开始营业。

这个故事的寓意是,Xilinx在网络上的支持应该是相对较新的Vivado问题的第一次接触点。

要使用标记建立问题答案,您也可以回答自己的问题。标签目前只有六个问题,它可能有助于吸引更多的问题和答案。 (六个Vivado标记的问题都没有接受答案)。

答案 1 :(得分:0)

错误的类型重载解析是由同一源文件中的早期或后期语法错误引起的。

查找实例周围的错误。修复所有类型的过载问题将揭示它与类型无关,而与另一个错误无关。当您修复该错误时,您可以恢复类型重载的所有修复,现在它们将起作用。