library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library vunit_lib;
context vunit_lib.vunit_context;
library ssd1306;
library utils;
library i2c_tb;
use i2c_tb.tb_pkg.all;
use i2c_tb.tb_i2c_pkg.all;
use i2c_tb.tb_i2c_slave_pkg.all;
entity counter_tb is
generic (
runner_cfg : string);
end entity counter_tb;
architecture tb of counter_tb is
constant ADDRESS : std_logic_vector(6 downto 0) := "0111100";
constant CLK_PERIOD : time := 10 ns;
signal rst_n : std_logic := '0';
signal rst : std_logic;
signal not_scl : std_logic;
signal err_noack_data, err_noack_address, err_arbitration, err_general : std_logic;
signal bus_busy, dev_busy : std_logic;
signal one : std_logic := '1';
constant SCL_MIN_STABLE_CYCLES : natural := 10;
constant TIMEOUT : time := SCL_MIN_STABLE_CYCLES * CLK_PERIOD * 4;
begin -- architecture tb
uut : entity ssd1306.ssd1306_counter
generic map (
CLK_FREQ => 100,
I2C_CLK_FREQ => 10,
COUNT_FREQ => 5,
DELAY => 1,
EXPECT_ACK => '0',
SCL_MIN_STABLE_CYCLES => SCL_MIN_STABLE_CYCLES)
port map (
clk_i => clk,
rst_i => rst,
start_i => '1',
err_noack_data_o => err_noack_data,
err_noack_address_o => err_noack_address,
err_arbitration_o => err_arbitration,
err_general_o => err_general,
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 6 * 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 for 2 * CLK_PERIOD;
wait until falling_edge(clk);
test_runner_setup(runner, runner_cfg);
while test_suite loop
-- if run("no_check") then
-- wait for 50 ms;
-- end if;
end loop;
test_runner_cleanup(runner);
end process main;
end architecture tb;