单个实体的多个行为

时间:2015-06-15 09:59:47

标签: testing process entity vhdl

我写了一个VHDL Testbench,其中包含以下内容:

  • 大量信号声明
  • UUT实例化/端口映射
  • 大量的单行并发作业
  • 各种小流程
  • 实际上刺激UUT的一个主要(大)过程。

一切都很好,除了我想要两种不同类型的刺激(让我们说一个简单的刺激和一个更复杂的刺激),所以我做的是我创建了两个测试平台,除了主要的大过程之外,它们都有共同点。 但是我觉得它不是很方便,因为我总是需要更新两者,例如,当我对UUT端口映射进行更改时。不酷。

我真的不想合并我的两个主要进程,因为它看起来像地狱,我不能在同一个架构中同时声明两个进程(我可能最终得到一个很长的文件而且我不会他们理论上可以访问相同的信号。)

所以我真的想保留一个“独特的文件”方法,但只针对那个特定的过程。有没有办法解决这个问题,还是我注定要失败?

2 个答案:

答案 0 :(得分:2)

这似乎是使用同一实体的多个体系结构会有所帮助的示例。你有一个文件:

entity TestBench
end TestBench;

architecture SimpleTest of TestBench is
    -- You might have a component declaration for the UUT here
begin
    -- Test bench code here
end SimpleTest;

您可以轻松添加其他架构。您可以在单独的文件中包含体系结构。您还可以使用直接实体实例化来避免UUT的组件声明(如果UUT发生更改,则需要将工作量减半):

architecture AnotherTest of TestBench is
begin
    -- Test bench code here
    UUT : entity work.MyDesign (Behavioral)
    port map (
        -- Port map as usual
    ); 
end AnotherTest ;

这不会保存重复的代码,但至少会删除其中一个端口映射列表。

如果您的UUT端口映射中有很多信号,那么另一点是,如果您尝试将更多信号转换为矢量,这可能会更容易。例如,您可能有许多相同类型的串行输出连接到电路板上的不同芯片。我见过很多人会将这些名称命名为SPI_CS_SENSORSSPI_CS_CPUSPI_CS_FRONT_PANEL等。我发现如果VHDL合并到SPI_CS (2 downto 0),它会使VHDL更易于管理,将信号映射到电路图指定的设备。我想这只是偏好,但如果你有真正庞大的端口列表,也许这种方法可能会有所帮助。

使用TestControl实体

更复杂的方法将涉及使用测试控制实体来实现所有刺激。在最简单的层面上,这将是您感兴趣的UUT所有信号的端口。更复杂的测试平台将有一个测试控制实体,其接口可以控制总线功能模型,其中包含运动所需的实际引脚摆动你的设计。您可以使用一个文件声明此实体,例如TestControl_Entity.vhd

entity TestControl is
port (
    clk : out std_logic;
    UUTInput : out std_logic;
    UUTOutput : in std_logic
);

然后您有一个或多个架构文件,例如TestControl_SimpleTest.vhd

architecture SimpleTest of TestControl is
begin
    -- Stimulus for simple test
end SimpleTest;

您的顶级测试平台看起来像是:

entity TestBench
end TestBench;

architecture Behavioral of TestBench is
    signal clk : std_logic;
    signal a : std_logic;
    signal b : std_logic;
begin

    -- Common processes like clock generation could go here

    UUT : entity work.MyDesign (Behavioral)
    port map (
        clk : in std_logic;
        a : in std_logic;
        b : out std_logic
    ); 

    TestControl_inst : entity work.TestControl (SimpleTest)
    port map (
        clk => clk,
        UUTInput => a,
        UUTOutput => b
    ); 
end SimpleTest;

您现在可以通过更改为TestControl选择的体系结构来更改测试。

使用配置

如果您有许多不同的测试,则可以使用配置来更轻松地选择它们。为此,首先需要使测试控件实体实例化使用组件声明而不是直接实例化。然后,在每个测试控制体系结构文件的末尾,创建配置:

use work.all;

configuration Config_SimpleTest of TestBench is
    for Behavioral
        for TestControl_inst : TestControl
            use entity work.TestControl (TestControl_SimpleTest);
        end for;
    end for;
end Config_SimpleTest;

现在,当您想要模拟时,您可以模拟配置,因此您可以运行类似sim TestBench的命令而不是像sim work.Config_SimpleTest这样的命令。这样可以更轻松地管理具有大量不同测试的测试平台,因为您无需编辑任何文件即可运行它们。

答案 1 :(得分:1)

可以将通用添加到测试平台实体,以控制是否简单或 完成复杂的测试,如:

entity tb is
  generic(
    test : positive := 1);  -- 1: Simple, 2: Complex
end entity;


library ieee;
use ieee.std_logic_1164.all;

architecture syn of tb is
  -- Superset of declarations for simple and complex testing
begin

  simple_g : if test = 1 generate
    process is  -- Simple test process
    begin
      -- ... Simple testing
      wait;
    end process;
  end generate;

  complex_g : if test = 2 generate
    process is  -- Complex test process
    begin
      -- ... Complex testing
      wait;
    end process;
  end generate;

end architecture;

缺点是声明不能成为有条件的,所以 声明必须是信号的超集和两者的其他控制 简单而复杂的测试。

模拟器可以通过选项控制通用值,例如-G 用于ModelSim模拟器中的通用控件。由此可以编译 一次,并在运行时选择简单或复杂的测试。