~ruther/vhdl-spi

6d6f0d480de810a2fe0d2c946ae9c61b6a85c4c6 — František Boháček 1 year, 7 months ago f38c6a3
tests: add tests for shift registers
2 files changed, 139 insertions(+), 0 deletions(-)

A testbench/tb_piso_shift_register.vhd
A testbench/tb_sipo_shift_register.vhd
A testbench/tb_piso_shift_register.vhd => testbench/tb_piso_shift_register.vhd +75 -0
@@ 0,0 1,75 @@
library spi;
library ieee;
use ieee.std_logic_1164.all;

library vunit_lib;
context vunit_lib.vunit_context;

entity tb_piso_shift_register is
  generic (runner_cfg : string);
end entity;

architecture tb of tb_piso_shift_register is
  signal data_i : std_logic_vector(7 downto 0);
  signal store_i : std_logic := '0';
  signal clk : std_logic := '0';
  signal q_o : std_logic;
begin
  uut: entity spi.piso_shift_register
    generic map (
      WIDTH => 8)
    port map (
      store_i  => store_i,
      data_i   => data_i,
      clk_i  => clk,
      q_o      => q_o);

  clk <= not clk after 1 ns;

  main: process
  begin
    -- test whole shift process
    test_runner_setup(runner, runner_cfg);
    show(get_logger(default_checker), display_handler, pass);

    while test_suite loop
      if run("just_once") then
        wait until falling_edge(clk);
        data_i <= "10101010";
        store_i <= '1';
        wait until falling_edge(clk);
        store_i <= '0';

        for i in 0 to 3 loop
          check_equal(q_o, '1');
          wait until falling_edge(clk);
          check_equal(q_o, '0');
          wait until falling_edge(clk);
        end loop;  -- i
      elsif run("reload_in_middle") then
    -- load some data, read few, load again, read...
        wait until falling_edge(clk);
        data_i <= "11001100";
        store_i <= '1';
        wait until falling_edge(clk);
        store_i <= '0';
        check_equal(q_o, '1');
        wait until falling_edge(clk);
        check_equal(q_o, '1');
        wait until falling_edge(clk);
        check_equal(q_o, '0');
        store_i <= '1';
        data_i <= "11111111";

        for i in 0 to 7 loop
          wait until falling_edge(clk);
          store_i <= '0';
          check_equal(q_o, '1');
        end loop;  -- i
      end if;
    end loop;

    wait until falling_edge(clk);
    test_runner_cleanup(runner);
  end process;
end architecture;

A testbench/tb_sipo_shift_register.vhd => testbench/tb_sipo_shift_register.vhd +64 -0
@@ 0,0 1,64 @@
library ieee;
use ieee.std_logic_1164.all;

library spi;

library vunit_lib;
context vunit_lib.vunit_context;

entity tb_sipo_shift_register is

  generic (
    runner_cfg : string);

end entity tb_sipo_shift_register;

architecture tb of tb_sipo_shift_register is
  signal clk : std_logic := '0';

  signal data_i : std_logic := '0';
  signal q_o : std_logic_vector(7 downto 0);
begin  -- architecture tb
  uut: entity spi.sipo_shift_register
    generic map (
      WIDTH => 8)
    port map (
      clk_i  => clk,
      data_i =>  data_i,
      q_o =>  q_o);

  clk <= not clk after 1 ns;

  main: process is
  begin  -- process main
    test_runner_setup(runner, runner_cfg);
    show(get_logger(default_checker), display_handler, pass);

    while test_suite loop
      if run("just_one") then
        wait until falling_edge(clk);
        data_i <= '1';
        wait until falling_edge(clk);
        data_i <= '0';
        for i in 0 to 6 loop
            wait until falling_edge(clk);
        end loop;  -- i

        check_equal(q_o, std_logic_vector'("10000000"));
      elsif run("one zero") then
        for i in 0 to 3 loop
            wait until falling_edge(clk);
            data_i <= '1';
            wait until falling_edge(clk);
            data_i <= '0';
        end loop;  -- i

        wait until falling_edge(clk);
        check_equal(q_o, std_logic_vector'("10101010"));
      end if;
    end loop;

    test_runner_cleanup(runner);
  end process main;

end architecture tb;

Do not follow this link