library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library vunit_lib;
context vunit_lib.vunit_context;
library mcu_slave;
library utils;
library i2c_tb;
use i2c_tb.tb_pkg.all;
use i2c_tb.tb_i2c_pkg.all;
use i2c_tb.tb_i2c_master_pkg.all;
entity regs_tb is
generic (
runner_cfg : string);
end entity regs_tb;
architecture tb of regs_tb is
constant ADDRESS : std_logic_vector(6 downto 0) := "1110101";
constant CLK_PERIOD : time := 10 ns;
constant REGS_COUNT : integer := 20;
signal rst_n : std_logic := '0';
signal rst : std_logic;
signal not_scl : std_logic;
signal err_noack : std_logic;
signal bus_busy, dev_busy : std_logic;
signal one : std_logic := '1';
begin -- architecture tb
uut : entity mcu_slave.regs
generic map (
DELAY => 1)
port map (
clk_i => clk,
rst_i => rst,
rst_on => open,
err_noack_o => err_noack,
dev_busy_o => dev_busy,
bus_busy_o => bus_busy,
sda_io => sda,
scl_io => scl
);
sda <= 'H';
scl <= 'H';
not_scl <= not scl;
clk <= not clk after CLK_PERIOD / 2;
rst_n <= '1' after 2 * CLK_PERIOD;
rst <= not rst_n;
-- TODO: allow conditions from master...
-- sda_stability_check: check_stable(clk, one, scl, not_scl, sda);
main: process is
begin -- process main
wait until rst_n = '1';
wait until falling_edge(clk);
test_runner_setup(runner, runner_cfg);
while test_suite loop
if run("write_all_ones_read") then
i2c_master_start(ADDRESS, '0', scl, sda);
-- seek address 0
i2c_master_transmit("00000000", scl, sda);
for i in 0 to REGS_COUNT - 1 loop
i2c_master_transmit("00000001", scl, sda);
end loop; -- i
i2c_master_start(ADDRESS, '1', scl, sda);
for i in 0 to REGS_COUNT - 1 loop
i2c_master_receive("00000001", scl, sda);
end loop; -- i
i2c_master_stop(scl, sda);
elsif run("write_sequence_read") then
i2c_master_start(ADDRESS, '0', scl, sda);
i2c_master_transmit("00000000", scl, sda);
for i in 0 to REGS_COUNT - 1 loop
i2c_master_transmit(std_logic_vector(to_unsigned(i, 8)), scl, sda);
end loop; -- i
i2c_master_stop(scl, sda);
i2c_master_start(ADDRESS, '0', scl, sda);
-- seek address 0
i2c_master_transmit("00000000", scl, sda);
i2c_master_start(ADDRESS, '1', scl, sda);
for i in 0 to REGS_COUNT - 1 loop
i2c_master_receive(std_logic_vector(to_unsigned(i, 8)), scl, sda);
end loop; -- i
i2c_master_stop(scl, sda);
elsif run("write_five_read_all") then
i2c_master_start(ADDRESS, '0', scl, sda);
-- seek address 5
i2c_master_transmit("00000101", scl, sda);
for i in 0 to 4 loop
i2c_master_transmit(std_logic_vector(to_unsigned(i, 8)), scl, sda);
end loop; -- i
i2c_master_stop(scl, sda);
i2c_master_start(ADDRESS, '0', scl, sda);
-- seek address 0
i2c_master_transmit("00000000", scl, sda);
i2c_master_start(ADDRESS, '1', scl, sda);
for i in 0 to 4 loop
i2c_master_receive("00000000", scl, sda);
end loop; -- i
for i in 0 to 4 loop
i2c_master_receive(std_logic_vector(to_unsigned(i, 8)), scl, sda);
end loop; -- i
for i in 10 to REGS_COUNT - 1 loop
i2c_master_receive("00000000", scl, sda);
end loop; -- i
i2c_master_stop(scl, sda);
end if;
end loop;
test_runner_cleanup(runner);
end process main;
end architecture tb;