我有大量这样的实体实例:
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) 是否有丢失的文件/组件。