Vhdl Vivado没有学习进行类型推断吗?

Vhdl Vivado没有学习进行类型推断吗?,vhdl,xilinx,synthesis,vivado,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 [...] ); 上面的代码正在使用

我有大量这样的实体实例:

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
-夸特斯II 13.x
-ISEM iSim 14.7
我也确信,我成功地用Vivado 2013.x编译了我的设计

Vivado(2014.4)Synth抱怨说,
'0'

[Synth 8-2396]靠近字符“0”;3种可见类型在此匹配[“D:/git/../picoblase/System.vhdl”:645]

重置声明如下:
Reset:在标准逻辑中

我可以通过使用限定表达式来解决此问题:

GPIO : entity L_PicoBlaze.pb_GPIO_Adapter
  generic map (
    [...]
  )
  port map (
    Clock    => CPU_Clock,
    Reset    => STD_LOGIC'('0'),  -- line 645
    [...]
  );
我认为这(a)看起来很糟糕,(b)是Synth中的一个bug。

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

有人也遇到过这个问题吗?
如果我在端口映射中写入“0”、x“00..00”或“00..00”,我的编码风格是否很糟糕

编辑1-最小且完整的示例:
IEEE库;
使用IEEE.std_logic_1164.all;
实体顶部是
港口(
时钟:标准逻辑;
复位:在标准逻辑中;
输出:输出标准逻辑
);
终端实体;
top的体系结构rtl是
开始
切换:实体work.TFF
港口地图(
时钟=>时钟,
重置=>'0',--第17行
Q=>输出
);
结束;
--一种简单的触发器
图书馆IEEE;
使用IEEE.std_logic_1164.all;
实体TFF是
港口(
时钟:标准逻辑;
复位:在标准逻辑中;
Q:输出标准逻辑
);
终端实体;
TFF的rtl体系结构是
信号Q_r:STD_逻辑:='0';
开始
进程(时钟)
开始
如果上升沿(时钟),则
如果(重置='1'),则

Q_r 300)查找缺少的文件/组件。

这不一定能回答您的问题,但可以在注释链中解决您的问题:

所以Vivado 2013.4也有同样的问题:(…我使用了一个空项目 并添加了一个源文件(见上文)。之后,我点击“运行” 我还尝试使用以下TCL命令启用VHDL-2008: 设置属性vhdl\u版本vhdl\u 2008[当前文件集]并运行 再次合成->无变化。我如何联系Xilinx?网络视频 取消…论坛

请参阅,您似乎仍然可以通过
openwebcase
操作打开新的网络课程问题

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

ieee库;
使用ieee.std_logic_1164.all;
--使用ieee.numeric_std.all;
实体pb_GPIO_适配器为
通用(foo:natural:=42);
港口(
时钟:标准逻辑;
复位:在标准逻辑中;
dummy:out std_逻辑
);
终端实体;
pb_GPIO_适配器的体系结构foo是
开始
哑巴:
过程(时钟、复位)
变量dumbit:std_逻辑='0';
开始
如果重置='1',则
哑巴:='0';
elsif上升沿(时钟),然后
哑巴:=不哑巴;
如果结束;
假人42
)
港口地图(
时钟=>CPU时钟,--时钟:在标准逻辑中;
重置=>'0',--重置:在标准逻辑中;
虚拟=>虚拟
);
时钟:
过程
开始
等待10纳秒;
CPU_时钟200纳秒
等待
如果结束;
结束过程;
终端架构;
注意,我很自然地(对我来说)得到了正确的分析顺序。我本想在你的最小可验证且完整的示例中提高订单,但在评论中被打断了。您还可以注意到,长评论问答链是不可搜索的,任何收集到的信息对其他stackoverflow用户都没有好处

看看AR#62291(顺便说一下,Vivado 2014.3),我们看到了解决方案-

发生此错误的原因是RTL文件不同步,且未正确声明信号类型

请注意,该语言不是VHDL术语

这与Xilinx之前的神秘XST错误消息完全一致,表明在合成之前,仍然需要至少分析和细化设计规范。我们本可以期待更好的结果。至少对于某些竞争对手来说,通过Xilinx的错误代码(例如[Synth 8-2396])查找信息要容易得多

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

您还可以注意到,在链接中有一个名为
openwebcase
的操作项,它将引导您登录并打开一个新的Webcase问题

我认为,一旦您在设计中发现分析顺序问题并加以纠正,您将重新投入业务

这个故事的寓意是,对于相对较新的Vivado问题,web上的Xilinx支持应该是第一个接触点


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

错误的类型重载解析是由同一源文件中较早或较晚的语法错误造成的

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

第645行是
Reset
(或
GPIO
标签)吗?它不是一个类型构造函数,而是一个限定表达式,旨在“显式声明作为表达式或聚合的操作数的类型,可能还有子类型”,枚举文字可以是主类型。这不是类型推断,而是重载解析。这也是令人失望的
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;
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;