【问题标题】:Component Instantiation vs Entity Instantiation in VHDLVHDL 中的组件实例化与实体实例化
【发布时间】:2016-07-13 18:23:05
【问题描述】:

我有使用 Verilog/SystemVerilog 的经验,但我是 VHDL 新手,我正试图弄清楚何时应该使用组件实例化或实体实例化。 组件实例化是指在实例化实体组件之前声明实体组件的传统方式。另一方面,VHDL-93 引入的实体实例化允许您直接声明实体而无需指定组件。 Related Article

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

这是我找到的Related Question,但它确实完全解决了我的疑问。因为可以为任何实体定义通用映射和架构:

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

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

【问题讨论】:

  • 使用实体实例化,您必须先编写实体,然后才能编译此文件...使用组件,您可以推迟该步骤,直到您链接(详细)设计。
  • 对,这就是我所说的“在我看来,实体实例化总是更可取,除非你还没有实现架构并且你只想定义一个黑盒子”。我现在意识到那句话不是很清楚。不过还有什么其他好处?我列出的文章声称组件实例化方法更灵活,我不明白为什么。
  • IEEE Std 1076-2008 6.8 组件声明“组件声明声明了一个与虚拟设计实体的接口,该接口可用于组件实例化语句。组件配置或配置规范可用于关联具有驻留在库中的设计实体的组件实例。”

标签: vhdl


【解决方案1】:

我喜欢把一个组件想象成一个IC插座。您可以通过将编译(分析)比作组装 PCB 并将 精化比作将芯片放入插槽中来进一步进行类比。如果您使用IC插座,即使您还没有订购芯片,也可以组装PCB;您可以推迟将芯片放入插座中。同样,如果您使用组件:即使与组件对应的实体和架构尚不存在,您也可以编译设计;您可以将绑定推迟到以后,直到详细说明。

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

i) 这是一个大项目。并不是每个人都完成了他们的街区。但是您仍然可以轻松地编译顶层并在设计的任一部分上运行仿真。您可以通过注释掉/编辑来做到这一点,但使用组件会更容易。

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

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

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

这是一个在EDA Playground - https://www.edaplayground.com/x/2QrS 上比较两者的示例。

【讨论】:

  • Re: iii,分析(库中的对象 - 编译)和精化(链接和加载)之间存在区别。在满足 IEEE Std 1076-2008 13.5 分析顺序之前,您无法详细说明“在给定设计单元中引用名称的主要单元应在分析给定设计单元之前进行分析。”在默认绑定指示的情况下,缺少可见实体声明不符合分析顺序的配置声明 (7.3.3)。配置声明(主要单元)同样无法详细说明。在分析中,问题在于可见性。
  • @user1155120 我没有考虑过场景 iii)。我可以看到如何将其用于对网络或类似网络进行排序。我正在阅读有关配置的信息,它们在 Verilog 中是否有任何等价物?
【解决方案2】:

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

您可以编写依赖于某个理想化实体(此处命名为 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 综合,现已撤销)需要对配置声明的支持,而隐式配置在细化期间提供默认绑定指示。

【讨论】:

  • +1 表示可以在配置中使用 port map。我的 VHDL 设计人员不知道这是可能的。
【解决方案3】:

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

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

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

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

【讨论】:

  • 我了解假定在可读性和编译方面的好处。让我感到困惑的是,我链接的 articles 提到组件实例化更强大,因为它允许您更详细地配置实体。什么是我不能用实体实例化,但我可以用组件实例化?
  • 阅读this 了解配置
  • A DES 模型使用 4 个相同的组件配置,除了 S Box (ROM)。如果没有组件配置,则需要四个独特的架构,每个架构都唯一地实例化两个 S 框。组件配置可以实现更紧凑、更容易创建或维护描述以及特定组件对虚拟组件的替换。您还可以将实例化的组件(例如原语)映射到不同的库,并在配置规范绑定指示中提供它们的通用和端口映射。
  • "VHDL 最初是一种硬件文档语言。"你能提供一个参考吗?
  • @user1155120 不记得我第一次听说它是在哪里,但Wikipedia's 版本匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多