从 Vivado 获取 "No such design unit"

Getting "No such design unit" from Vivado

我需要有人检查我的代码并给我一个完整性检查。这是用 VHDL 编写的。 Vivado 一直报错:

[Synth 8-493] no such design unit 'onesevenseg'

但是,我可以清楚地看到我的项目中的文件,并且项目管理器来源 window 正在以正确的方式列出文件。

这是发生错误的行。

digitOne: entity xil_defaultlib.oneSevenSeg port map (switchIn, sevenSegOut);

这是有错误的顶级文件。它被编译到库 xil_defaultlib.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity oneSevenSegTop is
    Port ( anodeOut : out STD_LOGIC_VECTOR (0 to 7);
           switchIn : in STD_LOGIC_VECTOR (0 to 3);
           sevenSegOut : out STD_LOGIC_VECTOR (0 to 6));
end oneSevenSegTop;

architecture Behavioral of oneSevenSegTop is
component oneSevenSeg 
    Port ( digitIn : in STD_LOGIC_VECTOR (0 to 3);
           segOut : out STD_LOGIC_VECTOR (0 to 6));
end component;
begin

digitOne: entity xil_defaultlib.oneSevenSeg port map (switchIn, sevenSegOut);

anodeOut <= "00000001";

end Behavioral;

这里是上面文件正在实例化的文件,也编译进了库xil_defaultlib.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity oneSevenSeg is
    Port ( digitIn : in STD_LOGIC_VECTOR (0 to 3);
           segOut : out STD_LOGIC_VECTOR (0 to 6));
end oneSevenSeg;

architecture Behavioral of oneSevenSeg is

begin
process(digitIn)
begin
if digitIn = "0000" then --0
    segOut <= "1000000";
elsif digitIn = "0001" then --1
    segOut <= "1111001";
elsif digitIn = "0010" then --2
    segOut <= "0100100";
elsif digitIn = "0011" then --3
    segOut <= "0110000";
elsif digitIn = "0100" then --4
    segOut <= "0011001";
elsif digitIn = "0101" then --5
    segOut <= "0010010";
elsif digitIn = "0110" then --6
    segOut <= "0000010";
elsif digitIn = "0111" then --7
    segOut <= "1111000";
elsif digitIn = "1000" then --8
    segOut <= "0000000";
elsif digitIn = "1001" then --9
    segOut <= "0011000";
else                   -- error
    segOut <= "0110110";
end if;

end process;

end Behavioral;

正在用 ghdl 尝试你的两个文件:

% ghdl -a --work=xil_defaultlib onesevenseg.vhdl
% ghdl -a -P. onesevensegtop.vhdl
onesevensegtop.vhdl:17:18: no declaration for "xil_defaultlib"
ghdl: compilation error

因此问题中列出的第二个设计单元很好地分析到一个名为 xil_defaultlib.

的新工作库中

第二个分析是针对顶级单元,-P 标志告诉它在当前位置查找其他库。

分析失败,因为名称 xil_defaultlib 尚未声明。

IEEE 标准 1076-2008,13.2 设计库:

A library clause defines logical names for design libraries in the host environment. A library clause appears as part of a context clause, either at the beginning of a design unit or within a context declaration.
...
Each logical name defined by the library clause denotes a design library in the host environment.

没有告诉分析器简单名称 xil_defaultlib 引用主机环境中的库,名称的含义是未知的。

如果前缀不是库逻辑名称,则它必须是设计单元,但该名称在库工作、库 IEEE 或库标准中未知:

12.3 可见度:

Visibility is either by selection or direct. A declaration is visible by selection at places that are defined as follows:

a) For a primary unit contained in a library: at the place of the suffix in a selected name whose prefix denotes the library.

13.2 中的进一步内容:

Every design unit except a context declaration and package STANDARD is assumed to contain the following implicit context items as part of its context clause:

library STD, WORK; use STD.STANDARD.all;

注意库逻辑名可以隐式定义也可以显式定义。 xil_defaultlib.

没有隐式定义

添加一个库子句,使所选名称的前缀 xil_defaultlib.oneSevenSeg 可见。

这可以通过 library 子句在未命名的顶级文件中使库逻辑名称 IEEE 可见来完成:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library xil_defaultlib;

entity oneSevenSegTop is
...

所以我们做出改变并且:

% ghdl -a -P. onesevensegtop.vhdl
%

没有错误。

虽然@user1155120 的回答是正确的,但这里的根本问题是您没有以预期的方式引用实体。 xil_defaultlib 是 Xilinx Vivado 默认将您的设计编译到的库的名称。您根本不需要引用它,而是利用 work 用于引用当前正在编译的库的想法:

digitOne: entity work.oneSevenSeg port map (switchIn, sevenSegOut);

这样一来,您的代码就不会绑定到 Vivado 决定编译您的项目的特定方式。当您可以更轻松地使用 work 方法时,在整个代码中添加对 xil_defaultlib 的引用是没有意义的。