library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;

entity rom_test is
  end rom_test;

architecture rtl of rom_test is

  component clock is
    port(clk: out std_logic);
  end component;

  component dff is
    port(
          clk: in std_logic;
          rst: in std_logic;

          d: in std_logic;
          q: out std_logic
        );
  end component;

  component rom is port (
                          address : in unsigned(15 downto 0);
                          dataOut : out std_logic_vector(15 downto 0)
                        );
  end component;

  signal clk, rst: std_logic;
  signal romout, regq: std_logic_vector(15 downto 0);
  signal addr: unsigned(15 downto 0);

begin
  heartbeat: clock port map(clk);
  dut: rom port map(addr, romout);

  reg:
  for i in 15 downto 0 generate
    regx: dff port map(clk, rst, romout(i), regq(i));
  end generate reg;

  process(regq) begin
    addr <=unsigned(regq);
  end process;

  process
  begin
    rst <= '1';

    wait for 1 ns;
    assert(regq(0)='0') report "Fail rst" severity error;

    rst <= '0';

    wait for 10 ns;
    assert(to_integer(unsigned(regq))=2) report "Fail rom read @0" severity error;

    wait for 10 ns;
    assert(to_integer(unsigned(regq))=4) report "Fail rom read @2" severity error;

    assert false report "Test done." severity note;
    wait;
  end process;
end rtl;
