------------------------------------------------------------
-- Copyright: 2010 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.echoTbPkg.all;
use ieee.numeric_std.all;
-------------------------------------------------------------------------------
entity echoTb is
-- a testbench does not connect to any higher level of hierarchy
end echoTb;
-------------------------------------------------------------------------------
architecture behavioral of echoTb is
component echo
port (
DataInxDI : in std_logic_vector(1535 downto 0);
LastxSI : in std_logic;
InENxSI : in std_logic;
DataOutxDO : out std_logic_vector(255 downto 0);
OutEnxSO : out std_logic;
CLKxCI : in std_logic;
RSTxRBI : in std_logic);
end component;
file exprespfile : text open read_mode is EXPRESP_FILENAME;
signal InENxS, OutEnxS, RSTxRB : std_logic;
-------------------------------------------------------------------------------
-- BEGIN
-------------------------------------------------------------------------------
begin
MutInst: echo
port map (
DataInxDI => StimuliRecxD.DataInxD,
LastxSI => StimuliRecxD.LastxS,
InENxSI => InENxS,
DataOutxDO => ActResponseRecxD.DataOutxD,
OutEnxSO => OutEnxS,
CLKxCI => CLKxC,
RSTxRBI => RSTxRB);
ClkGen : ClockGenerator(
ClkxC => CLKxC,
CLKPHASELOW => CLK_PHASE_LOW,
CLKPHASEHIGH => CLK_PHASE_HIGH );
-- obtain stimuli and apply it to MUT
----------------------------------------------------------------------------
StimAppli : 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
-- first the reset phase
StimuliRecxD.DataInxD <= (others => '0');
StimuliRecxD.LastxS <= '0';
InENxS <= '0';
RSTxRB <= '0';
wait for 12 ns;
RSTxRB <= '1';
AppliLoop : while not (endfile(stimulifile)) loop
wait until CLKxC'event and CLKxC = '1';
-- wait until time has come for stimulus application
wait for STIMULI_APPLICATION_TIME;
-- apply stimulus to MUT
StimuliRecxD <= GetStimuliRecord(stimulifile);
-- Also read the response we will check later
ResponsexD := GetExpectedResponseRecord(exprespfile);
ExpResponseRecxD.DataOutxD <= ResponsexD.DataOutxD;
InENxS <= '1';
-- wait at least a clock
-- assumes the output will not come in one clock cycle
-- which for ECHO is true
wait until CLKxC'event and CLKxC = '1';
wait for STIMULI_APPLICATION_TIME;
InENxS <= '0';
wait for RESPONSE_ACQUISITION_TIME - STIMULI_APPLICATION_TIME;
RespLoop: while OutEnxS = '0' loop
wait until CLKxC'event and CLKxC = '1';
wait for RESPONSE_ACQUISITION_TIME;
end loop RespLoop;
-- 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);
-- this loop assumes that there is a cycle difference between
-- data calculation finished and new data applied. The circuit itself
-- can work faster, however, I was too lazy forthe testbecnh at the
-- moment.
end loop AppliLoop;
-- 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);
file_close(stimulifile);
-- tell clock generator to stop at the end of current cycle
-- because stimuli have been exhausted
EndOfSimxS <= true;
report "Simulation run completed!";
wait;
end process StimAppli;
end architecture behavioral;