2

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

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 抱怨说,有 3 种可能的类型解析'0'
[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] 靠近字符“0”;3 种可见类型在这里匹配 ["D:/Temp/OverloadTest/overload.vhdl":17]

编辑2:

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

我需要一些时间来重新检查我的文件列表 (>300) 是否有丢失的文件/组件。

4

2 回答 2

1

这不一定回答您的问题,但确实在评论链中解决了您的问题:

所以 Vivado 2013.4 也有同样的问题 :( ...我使用了一个空项目并添加了一个源文件(见上文)。之后我点击了“运行综合”。我还尝试使用这个 TCL 命令启用 VHDL-2008:set_property vhdl_version vhdl_2008 [current_fileset] 并再次运行综合 -> 没有变化。我如何联系 Xilinx?Webcases 被取消了......论坛?

请参阅AR# 62291,看来您仍然可以通过该open Webcase操作打开新的 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 支持页面,您可以在其中登录并打开一个新的 Webcase 问题。

我认为一旦您在设计中发现分析顺序问题并纠正它,您就会重新开始工作。

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

标签的答案构建问题,您还可以回答自己的问题。该标签目前只有六个问题,它可能有助于吸引更多的问题和答案。(六个 Vivado 标记问题均未接受答案)。

于 2014-12-18T18:27:00.613 回答
1

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

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

于 2018-04-26T19:43:16.033 回答