【问题标题】:Multiple behaviours for single entity单个实体的多种行为
【发布时间】:2015-06-15 09:59:47
【问题描述】:

我编写了一个 VHDL 测试平台,其中包含以下内容:

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

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

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

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

【问题讨论】:

    标签: testing process entity vhdl


    【解决方案1】:

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

    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 等。我发现如果将它们与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 => clk,
            a => a,
            b => b
        ); 
    
        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 work.Config_SimpleTest 之类的命令,而不是 sim TestBench 之类的命令。这样可以更轻松地管理包含大量不同测试的测试台,因为您无需编辑任何文件即可运行它们。

    【讨论】:

    • 感谢您的回答。我考虑过使用不同的架构,但在我的情况下,几乎所有东西都在架构中,所以我仍然会有很多双倍的。不过,我不知道您可以将架构放在单独的文件中,这在以后的某个时候应该会有所帮助。 TestControl 实体方法很有趣,我想我以后会去看看它是否方便,但我喜欢这个想法,谢谢。
    • 从事这项工作已有 20 多年了,效果很好。
    • @JimLewis 是你向我展示了这项技术,所以我希望我已经成功地展示了它!
    【解决方案2】:

    可以将泛型添加到测试台实体中,以控制是简单还是 完成了复杂的测试,例如:

    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 模拟器中的通用控制。从而可以编译 一次,然后在运行时选择简单或复杂的测试。

    【讨论】:

    • 感谢您的回答,我去了(至少现在)。在这种情况下,ModelSim 中的通用控件也是一个非常好的主意,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多