Vhdl 如果存在两个名称相同的组件,一个在包中,另一个在体系结构中,那么哪个组件优先?

Vhdl 如果存在两个名称相同的组件,一个在包中,另一个在体系结构中,那么哪个组件优先?,vhdl,hdl,modelsim,Vhdl,Hdl,Modelsim,我有一个VHDL测试文件a.vhd 猫a.vhd 因此,在其上运行modelsim时,没有被覆盖组件的警告/错误。我们是否总是优先考虑在体系结构中声明的组件,而不是在包中声明的同名组件。 谁能告诉我LRM对此怎么说? 请对此进行解释。在这个特定示例中,您在“a”中实例化为“inst”的组件肯定是体系结构中声明的组件“b”,因为work.pak.b具有不同的端口声明 如果在a中实例化了一个没有端口的“b”,那么应该看到work.pack.b 但是,请理解,这些与“实体b”之间没有内在联系。只有在详

我有一个VHDL测试文件a.vhd

猫a.vhd

因此,在其上运行modelsim时,没有被覆盖组件的警告/错误。我们是否总是优先考虑在体系结构中声明的组件,而不是在包中声明的同名组件。 谁能告诉我LRM对此怎么说?
请对此进行解释。

在这个特定示例中,您在“a”中实例化为“inst”的组件肯定是体系结构中声明的组件“b”,因为work.pak.b具有不同的端口声明

如果在a中实例化了一个没有端口的“b”,那么应该看到work.pack.b

但是,请理解,这些与“实体b”之间没有内在联系。只有在详细阐述设计时(例如,在模拟开始时),工具才会查找与组件声明实际匹配的“b”。在这种情况下,它可以找到在“a”中声明的“b”,但找不到匹配“work.pak.b”的实体


在这个阶段,您可以使用配置(单独的配置或嵌入在arch A中的配置语句)将特定实体“work.b”绑定到“b”。由于端口声明不匹配,这对“work.pak.b”不起作用。

在此特定示例中,您在“a”中实例化为“inst”的组件肯定是体系结构中声明的组件“b”,因为work.pak.b具有不同的端口声明

如果在a中实例化了一个没有端口的“b”,那么应该看到work.pack.b

但是,请理解,这些与“实体b”之间没有内在联系。只有在详细阐述设计时(例如,在模拟开始时),工具才会查找与组件声明实际匹配的“b”。在这种情况下,它可以找到在“a”中声明的“b”,但找不到匹配“work.pak.b”的实体


在这个阶段,您可以使用配置(单独的配置或嵌入在arch A中的配置语句)将特定实体“work.b”绑定到“b”。这对“work.pak.b”不起作用,因为端口声明不匹配。

考虑这种情况,当包中声明的组件b与体系结构中声明的组件b具有相同的接口时。对于本例,您是说在精化时,我应该看到work.pack.b。我想知道如何决定优先考虑包组件而不是其他组件?它是特定于工具的还是在VHDL LRM中指定的?抱歉,我不是说如果接口相同,您会看到work.pack.b。我希望本地的“b”。我不能指出一个确切的LRM规则来澄清发生了什么,但在VHDL的其他领域(及其父Ada)的一个基本原则是,局部声明(例如局部变量)通常隐藏一个等效但更远程的声明。在两个选项可见的情况下(例如,来自不同库的函数“+”声明),惯例是隐藏这两个选项,而不是在它们之间做出任意且可能错误的决定。Thanx Brian.在LRM 1076-2008第12.4节使用条款中,状态:为了确定由使用子句在给定位置直接可见哪些声明,请考虑由其范围包含该位置的所有使用子句所标识的声明集。此集合中的任何声明都可能是可见的声明。潜在可见的声明实际上是直接可见的,但以下三种情况除外:A)如果所考虑的位置在声明同形词的直接范围内,则潜在可见的声明不是直接可见的。因此,是的。我也找到了LRM规则。考虑在包中声明的组件B也有与架构中声明的接口相同的接口时的情况。对于本例,您是说在精化时,我应该看到work.pack.b。我想知道如何决定优先考虑包组件而不是其他组件?它是特定于工具的还是在VHDL LRM中指定的?抱歉,我不是说如果接口相同,您会看到work.pack.b。我希望本地的“b”。我不能指出一个确切的LRM规则来澄清发生了什么,但在VHDL的其他领域(及其父Ada)的一个基本原则是,局部声明(例如局部变量)通常隐藏一个等效但更远程的声明。在两个选项可见的情况下(例如,来自不同库的函数“+”声明),惯例是隐藏这两个选项,而不是在它们之间做出任意且可能错误的决定。Thanx Brian.在LRM 1076-2008第12.4节使用条款中,状态:为了确定由使用子句在给定位置直接可见哪些声明,请考虑由其范围包含该位置的所有使用子句所标识的声明集。此集合中的任何声明都可能是可见的声明。潜在可见的声明实际上是直接可见的,但以下三种情况除外:A)如果所考虑的位置在声明同形词的直接范围内,则潜在可见的声明不是直接可见的。因此,是的。我也找到了LRM规则。
package pak is
component b is              -- 1st definition of component b.
end component
end pak;

use work.pak.all;          -- 1st definition visible through this package use clause
entity a is
  port (in1 : in std_logic );
end a;

architecture a of a is

component b                   -- 2nd definition of component b.
  port ( in11 : in std_logic);
end component;

begin
  inst : b port map ( in11=> in1);   -- there are two definitions of component b at this instance.
end a;

entity b is
port (in11 : in std_logic);
end b;

architecture b of b is
begin
end b;