从 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
的引用是没有意义的。
我需要有人检查我的代码并给我一个完整性检查。这是用 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
的引用是没有意义的。