首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vivado没有学会进行类型推断吗?

Vivado没有学会进行类型推断吗?
EN

Stack Overflow用户
提问于 2014-12-16 01:02:55
回答 2查看 4.7K关注 0票数 2

我有很多这样的实体实例:

代码语言:javascript
复制
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‘;三个可见类型匹配在这里“D:/git/./PicoBlaze/System.vhdl”:645

重置声明如下:

Reset : in STD_LOGIC

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

代码语言:javascript
复制
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-最小且完整的示例:

代码语言:javascript
复制
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‘;三个可见类型匹配在这里"D:/Temp/OverloadTest/overload.vhdl":17

编辑2:

我找到了一个有用的例子:我只是把实体tff的声明放在顶层声明的前面。它接缝合成器8-2396附近.可见类型匹配这里错误消息从Vivado只是一个笨拙的方式告诉我们,它找不到对整个组件/文件的引用?

我需要一些时间来重新检查我的文件列表(>300)中缺少的文件/组件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-26 19:43:16

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-18 18:27:00

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

所以Vivado 2013.4有同样的问题:( .我使用了一个空项目并添加了一个源文件(见上文)。在那之后,我点击了“跑步合成”。我还尝试使用以下TCL命令启用VHDL-2008 : set_property、vhdl_version、vhdl_2008、current_fileset,并再次运行-> no。我怎样才能联系西林克斯?网络案件被废除了..。论坛?

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

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

代码语言:javascript
复制
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;

注意,我(对我)自然得到了正确的分析顺序。我想在你的最小、可验证和完整的例子中提高顺序,但是注释中的长度被剪短了。您还可以注意到,长时间的评论问题和答案链是不可搜索的,在那里收集的任何东西对其他堆栈溢出用户都没有好处。

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

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

请注意,该语言不是在VHDL术语中。

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

不管怎么说,您的MVCe中有相同的东西,并且内容在错误的分析顺序中,这告诉我们,通过苦差事是可以修复的。

您还可以在AR# 62291链接中注意到,有一个名为open Webcase的操作项,它将引导您进入WebCase支持页面,在那里您可以登录并打开一个新的Webcase问题。

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

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

要用维瓦多标记构建带有答案的问题,您也可以回答自己的问题。目前只有六个问题与标签,它可能有助于吸引更多的问题和答案。(六个被标记的问题中没有一个接受答案)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27495907

复制
相关文章

相似问题

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