library ieee;
use ieee.std_logic_1164.all;
library i2c;
library vunit_lib;
context vunit_lib.vunit_context;
entity startstop_condition_detector_tb is
generic (
runner_cfg : string);
end entity startstop_condition_detector_tb;
architecture tb of startstop_condition_detector_tb is
signal clk : std_logic := '0';
constant CLK_PERIOD : time := 10 ns;
signal rst_n : std_logic := '0';
signal sda, scl : std_logic;
signal start, stop : std_logic;
begin -- architecture tb
uut: entity i2c.startstop_condition_detector
port map (
clk_i => clk,
sda_i => sda,
scl_i => scl,
start_o => start,
stop_o => stop);
clk <= not clk after CLK_PERIOD / 2;
rst_n <= '1' after 2 * CLK_PERIOD;
main: process is
begin -- process
sda <= '1';
wait until rising_edge(clk);
scl <= '1';
wait until rst_n = '1';
wait until falling_edge(clk);
test_runner_setup(runner, runner_cfg);
set_stop_level(failure);
while test_suite loop
if run("scl_high_start_stop") then
-- start
sda <= '0';
wait until rising_edge(clk);
check_equal(start, '1');
check_equal(stop, '0');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '1');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
elsif run("scl_low") then
scl <= '0';
sda <= '0';
wait until falling_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
wait until falling_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
wait until falling_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
elsif run("scl_low_then_high") then
scl <= '0';
sda <= '0';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
wait until rising_edge(clk);
scl <= '1';
wait until rising_edge(clk);
sda <= '0';
wait until rising_edge(clk);
check_equal(start, '1');
check_equal(stop, '0');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '1');
sda <= '1';
wait until rising_edge(clk);
check_equal(start, '0');
check_equal(stop, '0');
sda <= '1';
end if;
end loop;
test_runner_cleanup(runner);
end process main;
end architecture tb;