------------------------------------------------------------
-- Copyright: 2011 Integrated Sytems Laboratory, ETH Zurich
--            http://www.iis.ee.ethz.ch/~sha3
------------------------------------------------------------
use std.textio.all;
library ieee;
use ieee.std_logic_textio.all;  -- read and write overloaded for std_logic
use ieee.std_logic_1164.all;
use work.simulstuff.all;
use work.SHA256MainTbPkg.all;
use work.sha_pack.all;
use ieee.numeric_std.all;

-------------------------------------------------------------------------------

entity SHA256MainTb is
  -- a testbench does not connect to any higher level of hierarchy
end SHA256MainTb;

-------------------------------------------------------------------------------

architecture behavioral of SHA256MainTb is

  component SHA256Main
    port (
      MessageInxDI       : in  expmess_arr;
      HInxDI             : in  h_arr;
      CLKxCI             : in  std_logic;
      RSTxRBI            : in  std_logic;
      VALIDOUTxSO        : out std_logic;
      HOutxDO            : out h_arr;
      MessageReadyxSI    : in  std_logic;
      MessageReceivedxSO : out std_logic);
  end component;



  file exprespfile   : text open read_mode is EXPRESP_FILENAME;
  signal MessageInxD : expmess_arr;
  signal HInxD       : h_arr;           -- input values of H
  signal RSTxRB      : std_logic;
  signal VALIDOUTxS  : std_logic;


  signal HOutxD            : h_arr;
  signal MessageReadyxS    : std_logic;
  signal MessageReceivedxS : std_logic;

-------------------------------------------------------------------------------
-- BEGIN
-------------------------------------------------------------------------------
begin

  SHA256Main_1 : SHA256Main
    port map (
      MessageInxDI       => MessageInxD,
      HInxDI             => HInxD,
      CLKxCI             => CLKxC,
      RSTxRBI            => RSTxRB,
      VALIDOUTxSO        => VALIDOUTxS,
      HOutxDO            => HOutxD,
      MessageReadyxSI    => MessageReadyxS,
      MessageReceivedxSO => MessageReceivedxS);

--  ExpResPickup : process
--    variable ResponsexD : responseRecordType;
--  begin

--    PickupLoop : loop  
--      wait until (CLKxC'event and CLKxC = '1') or EndOfSimxS = true;

--      -- leave the loop if there are no more stimuli left
--      exit PickupLoop when EndOfSimxS = true;

--      if VALIDOUTxS = '1' then
--        -- update expected response from file
--        ResponsexD := GetExpectedResponseRecord(exprespfile);
--        ExpResponseRecxD.HxD ResponsexD.HxD;

--      end if;

--   end loop PickupLoop;

--    file_close(exprespfile);  -- close the file
--    wait;
--  end process ExpResPickup;
  

  ClkGen : ClockGenerator(
    ClkxC        => CLKxC,
    CLKPHASELOW  => CLK_PHASE_LOW,
    CLKPHASEHIGH => CLK_PHASE_HIGH);



  -- obtain stimuli and apply it to MUT
  ----------------------------------------------------------------------------
  StimAppli : process
  begin
    
    AppliLoop : while not (endfile(stimulifile)) loop
      wait until CLKxC'event and CLKxC = '1';

      -- apply stimulus to MUT
      StimuliRecxD <= GetStimuliRecord(stimulifile);

      -- wait until time has come for stimulus application
      wait for STIMULI_APPLICATION_TIME;

      MessageInxD    <= StimuliRecxD.MessageInxD;
      HInxD          <= StimuliRecxD.HInxD;
      RSTxRB         <= StimuliRecxD.RSTxRB;
      MessageReadyxS <= StimuliRecxD.MessageReadyxS;
      
    end loop AppliLoop;

    -- tell clock generator to stop at the end of current cycle
    -- because stimuli have been exhausted
    EndOfSimxS <= true;
    -- close the file
    file_close(stimulifile);
    wait;
  end process StimAppli;


  -- acquire actual response from MUT and have it checked
  ----------------------------------------------------------------------------
  RespAcqui : process

    -- variables for accounting of mismatching responses
    variable respmatch       : respMatchArray;
    variable respaccount     : respaccounttype := (0, 0, 0, 0, 0, 0);
    -- variable for counting the lines written to the simulation report
    variable simRepLineCount : natural         := 0;

    variable ResponsexD : responseRecordType;

  begin
    -- This wait statement is only useful if the stimuli file is empty. In that case
    -- EndOfSimxS gets true after one delta delay. Without that wait statement
    -- the following exit statement would be executed before EndOfSimxS gets true.
    wait until CLKxC'event and CLKxC = '0';

    ResponsexD              := GetExpectedResponseRecord(exprespfile);
    ExpResponseRecxD.HOutxD <= ResponsexD.HOutxD;

    AcquiLoop : loop
      -- leave the loop if there are no more stimuli left
      exit AcquiLoop when EndOfSimxS = true;

      wait until CLKxC'event and CLKxC = '1';

      -- wait until time has come for response acquisition
      wait for RESPONSE_ACQUISITION_TIME;

      ActResponseRecxD.HOutxD <= HOutxD;


      if VALIDOUTxS = '1' then
        ResponsexD              := GetExpectedResponseRecord(exprespfile);
        ExpResponseRecxD.HOutxD <= ResponsexD.HOutxD;

        -- compare the actual with the expected responses
        CheckResponse(ActResponseRecxD, ExpResponseRecxD,
                      respmatch, respaccount);

        -- add a trace line to report file
        PutSimulationReportTrace(simreptfile, StimuliRecxD, ActResponseRecxD,
                                 respmatch, respaccount, simRepLineCount);

        -- add extra failure message to report file if necessary
        PutSimulationReportFailure(simreptfile, ExpResponseRecxD, respmatch);

      end if;

    end loop AcquiLoop;

    -- when the present clock cycle is the final one of this run
    -- then establish a simulation report summary and write it to file
    PutSimulationReportSummary(simreptfile, respaccount);
    -- close the file
    file_close(simreptfile);
    file_close(exprespfile);
    report "Simulation run completed!";
    wait;
  end process RespAcqui;
  
end architecture behavioral;

Generated on Tue Nov 22 15:16:34 CET 2011
Home