VHDL 中的组件实例化与实体实例化

Component Instantiation vs Entity Instantiation in VHDL

我有使用 Verilog/SystemVerilog 的经验,但我是 VHDL 的新手,我想弄清楚什么时候应该使用组件实例化或实体实例化。 通过组件实例化,我的意思是在实例化它们之前声明实体组件的传统方式。另一方面,随着 VHDL-93 引入的实体实例化允许您直接声明实体而无需指定组件。 Related Article

在我看来,实体实例化总是更可取,除非您还没有实现架构并且只想定义一个黑盒。

这是我找到的 Related Question,但它确实完全解决了我的疑虑。由于可以为任何实体同时定义通用映射和体系结构:

entity work.MyEntity_E(ARCH) generic map(
...)
port map(
...
);

进行组件实例化的额外灵活性是什么? 无法通过实体实例化完成但可以通过组件实例化完成的事情的最简单示例是什么

VHDL 最初是一种硬件文档语言。不是模拟也不是综合。

我同意组件实例化非常冗长,但如果实体未在同一源文件中声明,则它更具可读性。

此外,在非常大的项目上。它允许分离每个实体的编译。所以改变一个实体并不意味着重新编译整个项目。

并允许轻松地与行为拱交换以进行模拟。即:DRAM 只是 fpga 的一堆端口。或者您可以下载一个 dram 模型并验证您的代码是否按预期工作。每次模拟某些东西时,您无需返回并更改实例化。

我喜欢将 组件 视为 IC 插座。您可以进一步类比,将编译 (分析) 比作组装 PCB,将 细化 比作将芯片放入插座。如果您使用IC插座,即使您还没有订购芯片,您也可以assemble PCB;您可以推迟将芯片放入插座的时间。同样,如果您使用组件:即使与组件对应的实体和架构尚不存在,您也可以编译设计;你可以推迟 binding 到稍后,直到详细说明。

那么,为什么会这样?为什么它们可能还不存在?

i) 这是一个大项目。并不是每个人都完成了他们的街区。但是您仍然可以轻松地编译顶层和 运行 对设计的任一位的模拟。您可以通过 commenting-out/editing 来完成此操作,但使用组件会更容易。

ii) 您已经自动生成了一些 IP。这为您提供了一个用于仿真的行为模型,但没有可综合的模型 - 这个想法是您在流程的后期结合一些自动生成的 IP 物理视图。这对于仿真来说没问题,但是如果有一点遗漏 - 您生成的 IP,您如何编译您的设计以进行综合?

iii) 你在进行递归实例化:你在自身内部实例化一个块。使用 直接实例化 ,您将遇到牢不可破的先有鸡还是先有蛋的情况(又名 循环依赖性 );使用直接实例化,您无法实例化尚未编译的东西,但您无法编译它,因为实例化的实体尚未编译。 组件实例化可以打破这种循环依赖。

iv) 组件实例化还使您能够在设计中的同一位置实例化不同的实体(在 配置 的控制下)。 @user1155120 给出了上述示例:使用组件实例化(和配置)使您能够创建具有不同子块的相同块。

这是在 EDA Playground - https://www.edaplayground.com/x/2QrS.

上比较两者的示例

您可以通过配置(取决于组件实例化)完成的事情之一是使用虚拟组件。

您可以编写依赖于某个理想化实体(此处命名为 x)的 VHDL 描述,并将其映射到具有不同端口信号名称的不同组件:

entity a is
    port (
        in1:   in  bit;
        in2:   in  bit;
        out1:  out bit
    );
end entity;
architecture fum of a is
begin
    out1 <= in1 xor in2;
end architecture;

entity b is
end entity;

architecture foo of b is
    component x is
        port (
            a: in  bit;
            b: in  bit;
            c: out bit
        );
    end component;
    signal a, b, c: bit;
begin
TARG:
    x 
        port map (
            a => a,
            b => b,
            c => c
        );

STIMULI:
    process
    begin
        wait for 2 ns;
        a <= '1';
        wait for 2 ns;
        b <= '1';
        wait for 2 ns;
        a <= '0';
        wait for 2 ns;
        b <= '0';
        wait for 2 ns;
        a <= '1';
        wait for 2 ns;
        wait;
    end process;

end architecture;

configuration fum of b is
    for foo
        for TARG: x use entity work.a
            port map (
                in1 => a,
                in2 => b,
                out1 => c
            );
        end for;
    end for;
end configuration fum;

详细说明和模拟配置给出:

查看 TARG 的端口信号时。

此功能旨在用于将来自不同供应商库的基元映射到标准组件声明。

可移植性库(例如 LPM(参数化模块库))抵消了配置中涉及的感知复杂性,这些库通过使用属性和泛型增加了不同的复杂性,同时标准化了接口名称并减少了库原语的数量.

行为综合已经发展到结构设计规范的两种方法都被淘汰的地步。

FPGA 供应商对显式配置声明的支持也历来落后。您可能会注意到 IEEE Std 1076.6-2004(RTL 综合,现已撤销)需要支持配置声明,隐式配置在详细说明期间提供默认绑定指示。