Vhdl 为什么在使用组件时会重新定义端口?

Vhdl 为什么在使用组件时会重新定义端口?,vhdl,Vhdl,我正在学习VHDL,发现一些令人困惑的东西。假设您有以下实体: entity alu32 is port(a, b : in STD_LOGIC_VECTOR(31 downto 0); alucontrol : in STD_LOGIC_VECTOR(2 downto 0); result : buffer STD_LOGIC_VECTOR(31 downto 0); zero : out STD_L

我正在学习VHDL,发现一些令人困惑的东西。假设您有以下实体:

entity alu32 is
    port(a, b       : in STD_LOGIC_VECTOR(31 downto 0);
         alucontrol : in STD_LOGIC_VECTOR(2 downto 0);
         result     : buffer STD_LOGIC_VECTOR(31 downto 0);
         zero       : out STD_LOGIC);
end alu32;
当在另一实体的体系结构中将其用作组件时,其定义如下:

component alu32
  port(
        a, b       : in STD_LOGIC_VECTOR(31 downto 0);
        alucontrol : in STD_LOGIC_VECTOR(2 downto 0);
        result     : buffer STD_LOGIC_VECTOR(31 downto 0);
        zero       : out STD_LOGIC
    );
 end component;
component alu32;
我的问题是,为什么我们要重新定义港口?这似乎是一个毫无意义的练习,因为它与实体声明中的完全相同。为什么VHDL设计不允许您简单地使用如下组件:

component alu32
  port(
        a, b       : in STD_LOGIC_VECTOR(31 downto 0);
        alucontrol : in STD_LOGIC_VECTOR(2 downto 0);
        result     : buffer STD_LOGIC_VECTOR(31 downto 0);
        zero       : out STD_LOGIC
    );
 end component;
component alu32;

你可以,因为VHDL-93。您可以使用

Alu_0: entity work.alu32
port map (
    ...
);
在此代码段中,您可以替换要实例化的组件的VHDL库的
work
work
始终是VHDL源所在的当前库


为什么要使用组件声明?首先,如果您想要实例化的不是VHDL,例如Verilog、IP核和netlist,那么它们是必需的。第二,使用配置允许更改端口/实体绑定,但您需要为此声明组件。

您可以,因为VHDL-93。您可以使用

Alu_0: entity work.alu32
port map (
    ...
);
在此代码段中,您可以替换要实例化的组件的VHDL库的
work
work
始终是VHDL源所在的当前库


为什么要使用组件声明?首先,如果您想要实例化的不是VHDL,例如Verilog、IP核和netlist,那么它们是必需的。第二,使用配置允许更改端口/实体绑定,但您需要组件声明。

本质上,语言设计者正尽可能仔细地期待一个。。。不是那样发生的

组件
声明的思想是,它准确地定义了当您实例化它时所期望的内容,因此使用这些组件的实体/体系结构是自一致的,并且可以作为独立于它所使用的组件的任务进行编译和某种程度的测试-甚至在编写这些组件之前

比尔·林奇(Bill Lynch)的评论与此相关,并且在今天很容易被忘记:当编译花费了千倍的时间时,这是一个巨大的生产力胜利

稍后,当您构建总体设计时,将在组件库中搜索该组件,并找到完全匹配的实体(默认配置),或者通过
配置
语句选择特定组件。或者精化失败,将不匹配报告为错误-不可能使用不太合适的零件创建设计。该库可以包含各种“alu32”组件,这些组件具有不同的特性,用于不同的用途(快速、小型、带/不带浮点等)。这发生在“精化”阶段,与软件中的链接阶段大致相同,此时(希望)找到正确的实体/架构,并对照组件的端口检查其端口。这是一种自然的方式,让那些在“TTL IC形式的物理构建块库”中成长的设计师看到设计的发展

然而,在今天的一个典型用例中,我们没有在很大程度上使用组件库,因此示例中的“alu32”可能是同一项目中的另一个文件,编译到您的“工作”库中


在这种情况下,Jonathan Drolet答案中较短、更简单的“直接实体实例化”(1993年引入)是正确的方法。缺点这确实意味着您必须先编写并成功编译“alu32”实体,然后才能对顶层设计进行语法检查(尽管您可以稍后在细化之前编写体系结构)。

本质上,语言设计者正尽可能仔细地期待一个。。。不是那样发生的

组件
声明的思想是,它准确地定义了当您实例化它时所期望的内容,因此使用这些组件的实体/体系结构是自一致的,并且可以作为独立于它所使用的组件的任务进行编译和某种程度的测试-甚至在编写这些组件之前

比尔·林奇(Bill Lynch)的评论与此相关,并且在今天很容易被忘记:当编译花费了千倍的时间时,这是一个巨大的生产力胜利

稍后,当您构建总体设计时,将在组件库中搜索该组件,并找到完全匹配的实体(默认配置),或者通过
配置
语句选择特定组件。或者精化失败,将不匹配报告为错误-不可能使用不太合适的零件创建设计。该库可以包含各种“alu32”组件,这些组件具有不同的特性,用于不同的用途(快速、小型、带/不带浮点等)。这发生在“精化”阶段,与软件中的链接阶段大致相同,此时(希望)找到正确的实体/架构,并对照组件的端口检查其端口。这是一种自然的方式,让那些在“TTL IC形式的物理构建块库”中成长的设计师看到设计的发展

然而,在今天的一个典型用例中,我们没有在很大程度上使用组件库,因此示例中的“alu32”可能是同一项目中的另一个文件,编译到您的“工作”库中


在这种情况下,Jonathan Drolet答案中较短、更简单的“直接实体实例化”(1993年引入)是正确的方法。缺点这确实意味着您必须先编写并成功编译“alu32”实体,然后才能对顶层设计进行语法检查(尽管您可以稍后在细化之前编写架构)。

IEEE Std 1076-2008,6.8组件声明

组件声明声明可在组件实例化语句中使用的虚拟设计实体的接口。组件配置或配置规范可用于将组件实例与驻留在组件中的设计实体相关联