library ieee;
use ieee.std_logic_1164.all;
library spi;
library vunit_lib;
context vunit_lib.vunit_context;
entity tb_spi_recv is
generic (
runner_cfg : string);
end entity tb_spi_recv;
architecture tb of tb_spi_recv is
signal clk : std_logic := '0';
signal rst : std_logic := '0';
signal pass_clk : std_logic := '0';
signal in_data_bit : std_logic := '0';
signal recv_flag : std_logic;
signal recv_data : std_logic_vector(7 downto 0);
signal uut_clk : std_logic;
begin -- architecture tb
clk <= not clk after 1 ns;
rst <= '1' after 6 ns;
uut_clk <= clk and pass_clk;
uut: entity spi.spi_recv
generic map (
WIDTH => 8)
port map (
clk_i => uut_clk,
rst_in => rst,
data_i => in_data_bit,
recv_o => recv_flag,
recv_data_o => recv_data);
main: process is
begin -- process main
wait until rst = '1';
test_runner_setup(runner, runner_cfg);
show(get_logger(default_checker), display_handler, pass);
while test_suite loop
if run("one_byte") then
wait until falling_edge(clk);
pass_clk <= '1';
for i in 0 to 3 loop
in_data_bit <= '1';
check_equal(recv_flag, '0');
wait until falling_edge(clk);
end loop; -- i
for i in 0 to 3 loop
in_data_bit <= '0';
check_equal(recv_flag, '0');
wait until falling_edge(clk);
end loop; -- i
check_equal(recv_flag, '1');
check_equal(recv_data, std_logic_vector'("11110000"));
wait until falling_edge(clk);
check_equal(recv_flag, '0');
elsif run("more_bytes") then
wait until falling_edge(clk);
pass_clk <= '1';
for j in 0 to 3 loop
for i in 0 to 3 loop
in_data_bit <= '1';
if i /= 0 or j = 0 then
check_equal(recv_flag, '0');
end if;
wait until falling_edge(clk);
end loop; -- i
for i in 0 to 3 loop
in_data_bit <= '0';
check_equal(recv_flag, '0');
wait until falling_edge(clk);
end loop; -- i
in_data_bit <= '1';
check_equal(recv_flag, '1');
check_equal(recv_data, std_logic_vector'("11110000"));
end loop; -- j
end if;
end loop;
test_runner_cleanup(runner);
end process main;
end architecture tb;