在VHDL中包装和切换类似实体

时间:2010-09-17 03:03:22

标签: vhdl

我想描述一个可以正常运行或被置于测试模式的实体。我的一般设计是包含“真实”实体和测试实体的顶级实体。

我试图找出用VHDL表达这个的最好方法,但我觉得我过于复杂了。

考虑一个小的顶级实体(实际上,还有更多的I / O):

entity toplevelobject is
    port (
        in1 : inout std_logic;
        in2 : inout std_logic;
        out1 : out std_logic;
        out2 : out std_logic;
        testline : in std_logic;
        testclk : in std_logic;
    );

end toplevelobject;

根据“testline”的状态(高均值测试),应该在实际功能和测试模式之间切换。请注意,测试模块实际上使用除clk之外的所有内容作为输出,甚至是in_*

architecture test_passthrough of toplevelobject is
    -- This is the actual module
    component real_module
    port (
        in1 : in std_logic;
        in2 : in std_logic;
        out1 : out std_logic;
        out2 : out std_logic;
        clk : in std_logic;
        -- Note absence of "testline"
    );
    end component;

    -- This is the test module, which will just put the clk
    -- signal out on all pins, or play a tune, or something
    component test_module
    port (
        in1 : out std_logic;
        in2 : out std_logic;
        out1 : out std_logic;
        out2 : out std_logic;
        testclk : in std_logic;
        -- Note absence of "testline"
    );
    end component;

    signal real_in1, real_in2 : std_logic;
    signal real_out1, real_out2 : std_logic;

    signal test_in1, test_in2 : std_logic;
    signal test_out1, test_out2 : std_logic;

begin

    real_0 : real_module port map (
        in1 => real_in1,
        in2 => real_in2,
        out1 => real_out1,
        out2 => real_out2,
        clk => clk,
    );

    test_0 : test_module port map (
        in1 => test_in1,
        in2 => test_in2,
        out1 => test_out1,
        out2 => test_out2,
        testclk => clk,
    );

    -- Ports that are outputs on both don't need
    -- much special attention

    out1 <= real_out1 when testline = '0' else test_out1;
    out2 <= real_out2 when testline = '0' else test_out2;

end test_passthrough;

所以我有几个问题:

  • 对于inout个端口,我是否应该使用case ... when语句打开testline?或者使用if语句的每个I / O的进程?从理论上讲,我认为许多较小的进程是同时执行而不是顺序执行,但它实际上会对仿真或综合产生影响吗?例如:

    passthrough_in1 : process(testline, in1, test_in1) is
    begin
        if testline = '0' then
            real_in1 <= in1;
        else
            in1 <= test_in1;
        end if;
    end process passthrough_in1;
    

... ... VS

    passthrough_all : process(in1, test_in1, in2, test_in2, testline) is

        case testline is
            when '0' =>
                real_in1 <= in1;
                real_in2 <= in2;
            when '1' =>
                in1 <= test_in1;
                in2 <= test_in2;
        end case;

    end process passthrough_all;
  • 这是一种理智的方法还是有更简单的方法?
  • 我对敏感度感到困惑 - 我是否需要passthrough_in1(甚至passthrough_alltestline以外的任何其他内容敏感?
  • 我是否需要real_in1 / test_in1在两个包装实体之间进行选择?或者是否有其他方式可以说“如果testline为高,请将test_module输出in_1连接到toplevelobject I / O in_1

2 个答案:

答案 0 :(得分:1)

如果我理解你的正确你的testmodule驱动(名称错误 - 我假设在实际代码中他们更有意义:) in1,2端口?

如果是这样,你需要做这样的事情:

real_in1 <= in1;
in1 <= test_in1 when testline = '1' else 'Z';

在非测试模式下,in1信号将由'Z'驱动,因此外部正确的in1信号可以覆盖它。

您可以通过各种其他方式(如您描述的过程)来表示这一点,所有这些都应该在模拟器中相同。 “一体化过程”选项的缺点是,您需要保留最终可能最终作为一个巨大的敏感性列表的内容。每个信号执行一个过程只是我上面所做的一个漫长的方式。

要保存一些代码并复制/粘贴工作,您可能会将这两行代码推送到自己的实体中,然后多次实例化 - 在这种情况下,我将实例和端口映射全部放在一行,但这会冒犯一些编码标准......

这一切都假设我已正确理解问题了!

答案 1 :(得分:0)

也许我不完全理解你要做的是什么,但是在典型的VHDL测试平台中:

  • 您的“real_module”代码保持不变。测试时不会对其进行任何更改。
  • 制作了第二个模块,类似于你的“toplevelobject”。这通常称为测试平台模块。
  • toplevelobject testbench实例化real_module。
  • 测试平台通常没有输入,并且实际上不需要输出(取决于使用的情况和测试软件)。
  • 测试平台具有驱动real_module输入的顺序逻辑。
  • 如果您正在使用ModelSim等测试软件,可以随时间绘制real_module的输入和输出,以观察由测试平台驱动的real_module的行为。

您使用的是什么软件?如果对你有任何帮助,我可以在几年前从大学项目中挖掘一个旧的测试平台示例。