-------------------------------------------------------------------------------
-- Title      :  CRC generator test bench
-- Project    :  Bluetooth baseband core
-------------------------------------------------------------------------------
-- File        : crc_gen_tb.vhd
-- Author      : Jamil Khatib  (khatib@ieee.org)
-- Organization: OpenIPCore Project
-- Created     : 2000/12/07
-- Last update : 2000/12/09
-- Platform    : 
-- Simulators  : Modelsim 5.3XE/Windows98
-- Synthesizers: 
-- Target      : 
-- Dependency  : ieee.std_logic_1164
--               bluetooth.components_pkg
--               pck_crc16_d1 Package
-------------------------------------------------------------------------------
-- Description: CRC generator core test bench
-------------------------------------------------------------------------------
-- Copyright (c) 2000 Jamil Khatib
-- 
-- This VHDL design file is an open design; you can redistribute it and/or
-- modify it and/or implement it after contacting the author
-- You can check the draft license at
-- http://www.opencores.org/OIPC/license.shtml

-------------------------------------------------------------------------------
-- Revisions  :
-- Revision Number :   1
-- Version         :   0.1
-- Date            :   7 Dec 2000
-- Modifier        :   Jamil Khatib (khatib@ieee.org)
-- Desccription    :   Created
-- Known bugs      :   
-- To Optimze      :   
-------------------------------------------------------------------------------


library ieee;
use ieee.std_logic_1164.all;

use work.pck_crc16_d1.all;

library bluetooth;
use bluetooth.components_pkg.all;

entity crc_gen_tb is

end crc_gen_tb;

architecture crc_gen_beh_tb of crc_gen_tb is

  signal reset : std_logic := '0';      -- Reset signal
  signal clk   : std_logic := '0';      -- clock signal

  constant init_value : std_logic_vector(15 downto 0) := "1100100100000000";
                                        -- lfst init value

  signal initsignal : std_logic_vector(15 downto 0) := init_value;

  constant bitstream : std_logic_vector(19 downto 0) := "01110110010101100101";

  signal enable : std_logic;            -- crc enable
  signal dout   : std_logic;            -- Dataout
  signal din    : std_logic;            -- DataIn

  signal reg_value : std_logic_vector(15 downto 0) := (others => '0');
                                        -- Regsiter

begin  -- crc_gen_beh_tb


--reset <= '1' after 5 ns;
  clk <= not clk after 10 ns;

  uut : crc_gen_ent
    port map (
      clk     => clk,
      rst     => reset,
      en      => enable,
      DataIn  => din,
      DataOut => dout,
      Init    => initsignal
      );

  process
  begin  -- process
    if reset = '0' then
      wait for 5 ns;

      reset  <= '1';
      enable <= '0';
      din    <= '0';


    else
      wait until clk = '0';
      enable <= '1';

      wait until clk = '1';

      reg_value <= init_value;
--      reg_value <=  nextCRC16_D1( bitstream(i), init_value );


      for i in 0 to bitstream'length-1 loop


        din <= bitstream(i);

        wait until clk = '1';

        assert reg_value(0) = Dout report "Incorrect output, en = 1" severity error;

        reg_value <= nextCRC16_D1( bitstream(i), reg_value );


      end loop;  -- i

      enable <= '0';

      for i in 0 to 15 loop
        din <= '0';

        wait until clk = '1';

        assert reg_value(0) = Dout report "Incorrect output, en = 0" severity error;

        reg_value <= nextCRC16_D1( '0', reg_value );


      end loop;  -- i


    end if;
  end process;


end crc_gen_beh_tb;