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;
测试平台
- test1 : Dut 内部状态为'1'
- test2 : Dut 已在 test1 和 test2 之间重置
- test3:不将 dut 内部状态设置为“1”,因为 C 在进程开始时设置,但在测试之前以某种方式重置为初始状态 (1)。
- test4:不将 dut 内部状态设置为“1”,因为 D 在进程开始时设置,但在测试之前以某种方式重置为初始状态 (U)。
- test5:不将 dut 内部状态设置为“1”,因为 E 是在 loop 开始时设置的,但在测试之前以某种方式重置为初始状态 (U)。这似乎与 the documentation 相反(或者很可能,我不明白)
- test6 : Dut 内部状态已设置,F 未重置。
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 的新值出现。
我不确定您对增量循环的概念以及信号和变量之间的区别了解多少。如果没有,我建议你调查一下。
我对 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;
测试平台
- test1 : Dut 内部状态为'1'
- test2 : Dut 已在 test1 和 test2 之间重置
- test3:不将 dut 内部状态设置为“1”,因为 C 在进程开始时设置,但在测试之前以某种方式重置为初始状态 (1)。
- test4:不将 dut 内部状态设置为“1”,因为 D 在进程开始时设置,但在测试之前以某种方式重置为初始状态 (U)。
- test5:不将 dut 内部状态设置为“1”,因为 E 是在 loop 开始时设置的,但在测试之前以某种方式重置为初始状态 (U)。这似乎与 the documentation 相反(或者很可能,我不明白)
- test6 : Dut 内部状态已设置,F 未重置。
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 的新值出现。
我不确定您对增量循环的概念以及信号和变量之间的区别了解多少。如果没有,我建议你调查一下。