vunit,测试用例之间的重置条件是什么

vunit, what are reset conditions between test case

我对 vunit 测试非常困惑,尤其是测试之间的 link 以及它们的重置方式。

请看下一个最小的例子:

被测设备

设备有一个内部状态,当输入变为 1 时锁存 1

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

entity dut is
    port(
        A : in  std_logic;
        B : out std_logic := '0'
    );
end entity;

architecture RTL of dut is
begin
    -- will latch when A goes to '1'
    -- stay 1 forever
    B <= '1' when A = '1';
end architecture;

测试平台

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

library vunit_lib;
use vunit_lib.run_pkg.all;
use vunit_lib.check_pkg.all;

library libdut;
use libdut.all;

entity some_tb is
    generic (runner_cfg : string);
end entity;

architecture arch of some_tb is
    signal A, B, C : std_logic := '0';
    signal D, E, F : std_logic;
begin
    invdut: entity dut port map (A => A, B => B);

    F <= '1';

    main: process begin
        test_runner_setup(runner, runner_cfg);
        C <= '1';
        D <= '1';

        while test_suite loop
            E <= '1';

            if run("test 1") then
                check_equal(B, '0', "test 1.1");
                A <= '1';
                wait for 1 ns;
                check_equal(A, '1', "test 1.2");
            elsif run("test 2") then
                check_equal(A, '0', "test 2.1");
                check_equal(B, '0', "test 2.2");
            elsif run("test 3") then
                A <= C;
                wait for 1 ns;
                check_equal(B, '0', "test 3.1");
            elsif run("test 4") then
                A <= D;
                wait for 1 ns;
                check_equal(A, 'U', "test 4.1");
                check_equal(B, '0', "test 4.2");
            elsif run("test 5") then
                A <= E;
                wait for 1 ns;
                check_equal(A, 'U', "test 5.1");
                check_equal(B, '0', "test 5.2");
            elsif run("test 6") then
                A <= F;
                wait for 1 ns;
                check_equal(A, '1', "test 6.1");
                check_equal(B, '1', "test 6.2");
            end if;
        end loop;

        test_runner_cleanup(runner); -- Simulation ends here
        wait;
    end process;
end architecture;

Vunit 文件

#!/usr/bin/env python3

from pathlib import Path
from vunit import VUnit

SRC_PATH = Path(__file__).parent / "src"
TEST_PATH = Path(__file__).parent / "test"

def create_testsuite(project):
    lib = project.add_library("libdut")
    lib.add_source_files(SRC_PATH / "*.vhdl")

    libuart_test = project.add_library("libdut_test")
    libuart_test.add_source_files(TEST_PATH / "*.vhdl")

问题

这对我来说似乎很随意。我会把多个问题合二为一,因为它们很可能是紧密相关的。

信号什么时候重置? 每个测试 运行 是在不同的模拟中还是它们“串联”并有可能产生副作用? 在最重要的情况下,为什么会有循环?

默认情况下,VUnit 将 运行 每个测试用例单独模拟,但可以使用 run_all_in_same_sim 属性更改此行为。此处描述了这样做的基本原理:https://vunit.github.io/run/user_guide.html#running-test-cases-independently

让循环允许此选项,但还有其他原因,如 https://vunit.github.io/run/user_guide.html#running-a-vunit-testbench-standalone. In general, https://vunit.github.io/run/user_guide.html 中所述,是有关 VUnit 执行详细信息的良好来源。

您的信号分配未按预期工作的原因是增量循环。当在测试 5 中为 A 分配 E 时,它在与为 E 分配 1 相同的增量循环中完成,因为两次分配之间没有任何消耗时间。当 A 赋值 E 时,E 的新值不存在。相反,A 获得了 E (U) 的先前值。

测试 5 和测试 6 的区别在于,在 test_runner_setup 过程完成之前,F 被赋值为 1。一个过程可能会消耗时间,在这种情况下,至少会消耗增量循环。当 A 被赋值 F 时,F 的新值出现。

我不确定您对增量循环的概念以及信号和变量之间的区别了解多少。如果没有,我建议你调查一下。