VHDL 分层配置

VHDL Hierarchical Configuration

我正在尝试在我的设计中将库原语的映射从 unisim 更改为 unifast,但仅用于模拟目的。我想在测试平台级别指定配置。

我的设计层次结构如下所示:

entity m1_chip_tb is
end m1_chip_tb;

architecture behavioral of m1_chip_tb is
    ...
    m1: entity work.m1_chip
        m1_clocks: entity work.clock_logic_m1
            mmcm_pix: MMCME2_ADV

我能找到的所有进行 VHDL 配置的示例(包括 Xilinx 网站上的示例)似乎都假设配置适用于本地实例化的实体。但我需要一个从顶层测试平台向下钻取的配置。

这是我尝试使用的:

configuration cfg_xilinx of m1_chip is 
    for rtl
        for m1:clock_logic_m1
            use entity work.clock_logic_m1(rtl);
                for rtl
                    for all:MMCME2
                        use entity unifast.MMCME2;
                    end for;
                end for;
        end for;
    end for;
end cfg_xilinx;

但是我在 m1: 行

上收到错误 "Cannot find component declaration"

顺便说一句,除了 MMCME2_ADV 实例化之外,整个设计都是使用实体实例化编写的。

对于如何在配置定义中正确指定层次结构的任何建议,我将不胜感激。

(需要澄清的是,我在 clock_logic_m1.vhd 文件中指定了 unisim 库。我正在尝试为我的模拟覆盖它);即:

library unisim;
use unisim.vcomponents.all;

您不能使用直接实例化的配置 - 这是主要缺点。但是,如果您不坚持对控件使用配置,则可以使用传播的泛型或在共享包中使用常量来实现您想要的:

g_MMCM_RTL : if gGeneric_or_cConstant generate
    mmcm_rtl : [entity library.]MMCME2_ADV
. . .
end generate g_MMCM_RTL;

g_MMCM_SIM : if not gGeneric_or_cConstant generate
    mmcm_sim : [entity library.]MMCME2
. . . 
end generate g_MMCM_SIM;