OpenCores
URL https://opencores.org/ocsvn/wrimm/wrimm/trunk

Subversion Repositories wrimm

[/] [wrimm/] [trunk/] [WrimmTestBench.vhd] - Diff between revs 7 and 8

Show entire file | Details | Blame | View Log

Rev 7 Rev 8
Line 4... Line 4...
--See wrimm subversion project for version history
--See wrimm subversion project for version history
 
 
library ieee;
library ieee;
  use ieee.NUMERIC_STD.all;
  use ieee.NUMERIC_STD.all;
  use ieee.std_logic_1164.all;
  use ieee.std_logic_1164.all;
 
  use std.textio.all;
 
 
  use work.WrimmPackage.all;
  use work.WrimmPackage.all;
 
 
entity wrimm_top_tb is
entity WrimmTestBench is
end wrimm_top_tb;
end WrimmTestBench;
 
 
architecture TB_ARCHITECTURE of wrimm_top_tb is
architecture TbArch of WrimmTestBench is
  component wrimm_top
 
 
  component Wrimm is
  port(
  port(
    WishboneClock       : in  std_logic;
      WbClk             : in  std_logic;
    WishboneReset       : out std_logic;
      WbRst             : out std_logic;
    MasterPStrobe       : in  std_logic;
      WbMasterIn        : in  WbMasterOutArray; --Signals from Masters
    MasterPWrEn         : in  std_logic;
      WbMasterOut       : out WbSlaveOutArray;  --Signals to Masters
    MasterPCyc          : in  std_logic;
      --WbSlaveIn         : out WbMasterOutArray;
    MasterPAddr         : in  WbAddrType;
      --WbSlaveOut        : in  WbSlaveOutArray;
    MasterPDataToSlave  : in  WbDataType;
      StatusRegs        : in  StatusArrayType;
    MasterPAck          : out std_logic;
      SettingRegs       : out SettingArrayType;
    MasterPErr          : out std_logic;
      SettingRsts       : in  SettingArrayBitType;
    MasterPRty          : out std_logic;
      Triggers          : out TriggerArrayType;
    MasterPDataFrSlave  : out WbDataType;
      TriggerClr        : in  TriggerArrayType;
    MasterQStrobe       : in  std_logic;
      rstZ              : in  std_logic);        --Asynchronous reset
    MasterQWrEn         : in  std_logic;
  end component Wrimm;
    MasterQCyc          : in  std_logic;
 
    MasterQAddr         : in  WbAddrType;
  signal wbMastersOut           : WbSlaveOutArray;
    MasterQDataToSlave  : in  WbDataType;
  signal wbMastersIn            : WbMasterOutArray;
    MasterQAck          : out std_logic;
  signal statusRegs             : StatusArrayType;
    MasterQErr          : out std_logic;
  signal settingRegs            : SettingArrayType;
    MasterQRty          : out std_logic;
  signal settingRsts            : SettingArrayBitType;
    MasterQDataFrSlave  : out WbDataType;
  signal triggers               : TriggerArrayType;
    StatusRegA          : in  std_logic_vector(0 to 7);
  signal triggerClrs            : TriggerArrayType;
    StatusRegB          : in  std_logic_vector(0 to 7);
 
    StatusRegC          : in  std_logic_vector(0 to 7);
 
    SettingRegX         : out std_logic_vector(0 to 7);
 
    SettingRstX         : in  std_logic;
 
    SettingRegY         : out std_logic_vector(0 to 7);
 
    SettingRstY         : in  std_logic;
 
    SettingRegZ         : out std_logic_vector(0 to 7);
 
    SettingRstZ         : in  std_logic;
 
    TriggerRegR         : out std_logic;
 
    TriggerClrR         : in  std_logic;
 
    TriggerRegS         : out std_logic;
 
    TriggerClrS         : in  std_logic;
 
    TriggerRegT         : out std_logic;
 
    TriggerClrT         : in  std_logic;
 
    rstZ                : in  std_logic);
 
  end component;
 
 
 
  signal WishboneClock        : std_logic;
 
  signal MasterPStrobe        : std_logic;
 
  signal MasterPWrEn          : std_logic;
 
  signal MasterPCyc           : std_logic;
 
  signal MasterPAddr          : WbAddrType;
 
  signal MasterPDataToSlave   : WbDataType;
 
  signal MasterQStrobe        : std_logic;
 
  signal MasterQWrEn          : std_logic;
 
  signal MasterQCyc           : std_logic;
 
  signal MasterQAddr          : WbAddrType;
 
  signal MasterQDataToSlave   : WbDataType;
 
  signal StatusRegA           : std_logic_vector(0 to 7);
 
  signal StatusRegB           : std_logic_vector(0 to 7);
 
  signal StatusRegC           : std_logic_vector(0 to 7);
 
  signal SettingRstX          : std_logic;
 
  signal SettingRstY          : std_logic;
 
  signal SettingRstZ          : std_logic;
 
  signal TriggerClrR          : std_logic;
 
  signal TriggerClrS          : std_logic;
 
  signal TriggerClrT          : std_logic;
 
  signal rstZ                 : std_logic;
  signal rstZ                 : std_logic;
  signal WishboneReset        : std_logic;
  signal WishboneClock          : std_logic;
  signal MasterPAck           : std_logic;
  signal WishBoneReset          : std_logic;
  signal MasterPErr           : std_logic;
 
  signal MasterPRty           : std_logic;
 
  signal MasterPDataFrSlave   : WbDataType;
 
  signal MasterQAck           : std_logic;
 
  signal MasterQErr           : std_logic;
 
  signal MasterQRty           : std_logic;
 
  signal MasterQDataFrSlave   : WbDataType;
 
  signal SettingRegX          : std_logic_vector(0 to 7);
 
  signal SettingRegY          : std_logic_vector(0 to 7);
 
  signal SettingRegZ          : std_logic_vector(0 to 7);
 
  signal TriggerRegR          : std_logic;
 
  signal TriggerRegS          : std_logic;
 
  signal TriggerRegT          : std_logic;
 
 
 
  constant clkPeriod          : time := 0.01 us; --100 MHz
  constant clkPeriod          : time := 0.01 us; --100 MHz
 
 
begin
begin
  UUT : wrimm_top
 
    port map (
 
      WishboneClock         => WishboneClock,
 
      WishboneReset         => WishboneReset,
 
      MasterPStrobe         => MasterPStrobe,
 
      MasterPWrEn           => MasterPWrEn,
 
      MasterPCyc            => MasterPCyc,
 
      MasterPAddr           => MasterPAddr,
 
      MasterPDataToSlave    => MasterPDataToSlave,
 
      MasterPAck            => MasterPAck,
 
      MasterPErr            => MasterPErr,
 
      MasterPRty            => MasterPRty,
 
      MasterPDataFrSlave    => MasterPDataFrSlave,
 
      MasterQStrobe         => MasterQStrobe,
 
      MasterQWrEn           => MasterQWrEn,
 
      MasterQCyc            => MasterQCyc,
 
      MasterQAddr           => MasterQAddr,
 
      MasterQDataToSlave    => MasterQDataToSlave,
 
      MasterQAck            => MasterQAck,
 
      MasterQErr            => MasterQErr,
 
      MasterQRty            => MasterQRty,
 
      MasterQDataFrSlave    => MasterQDataFrSlave,
 
      StatusRegA            => StatusRegA,
 
      StatusRegB            => StatusRegB,
 
      StatusRegC            => StatusRegC,
 
      SettingRegX           => SettingRegX,
 
      SettingRstX           => SettingRstX,
 
      SettingRegY           => SettingRegY,
 
      SettingRstY           => SettingRstY,
 
      SettingRegZ           => SettingRegZ,
 
      SettingRstZ           => SettingRstZ,
 
      TriggerRegR           => TriggerRegR,
 
      TriggerClrR           => TriggerClrR,
 
      TriggerRegS           => TriggerRegS,
 
      TriggerClrS           => TriggerClrS,
 
      TriggerRegT           => TriggerRegT,
 
      TriggerClrT           => TriggerClrT,
 
      rstZ                  => rstZ);
 
 
 
  procClk: process
  procClk: process
  begin
  begin
    if WishBoneClock='1' then
    if WishBoneClock='1' then
      WishBoneClock <= '0';
      WishBoneClock <= '0';
    else
    else
Line 148... Line 62...
    wait for 10 ns;
    wait for 10 ns;
    rstZ  <= '1';
    rstZ  <= '1';
    wait;
    wait;
  end process procRstZ;
  end process procRstZ;
 
 
  procWbMasterP: process
  instWrimm: Wrimm
 
  port map(
 
    WbClk             => WishboneClock,
 
    WbRst             => WishboneReset,
 
    WbMasterIn        => wbMastersIn,
 
    WbMasterOut       => wbMastersOut,
 
    --WbSlaveIn       => ,
 
    --WbSlaveOut      => ,
 
    StatusRegs        => statusRegs,
 
    SettingRegs       => settingRegs,
 
    SettingRsts       => settingRsts,
 
    Triggers          => triggers,
 
    TriggerClr        => triggerClrs,
 
    rstZ              => rstZ);
 
 
 
  procStatusStim: process(WishboneClock) is
 
          variable statusCount : unsigned (0 to WbDataBits-1) := (Others=>'0');
  begin
  begin
    MasterPStrobe <= '0';
                if rising_edge(WishboneClock) then
    MasterPWrEn   <= '0';
                        loopStatusAssign: for i in StatusFieldType loop
    MasterPCyc    <= '0';
                                statusRegs(i) <= std_logic_vector(statusCount);
    MasterPAddr   <= x"0";
                                statusCount     := statusCount + 1;     --actual values don't matter, just generating unique values.
    MasterPDataToSlave <= x"00";
                        end loop loopStatusAssign;
    wait for clkPeriod / 10;
                end if; --Clk
    wait for clkPeriod * 5;
        end process procStatusStim;
    MasterPStrobe <= '1';
 
    MasterPWrEn   <= '1';
        procStatusVerify: process(WishboneClock) is
    MasterPCyc    <= '1';
                variable L : line;
    MasterPAddr   <= x"6";
        begin
    MasterPDataToSlave <= x"55";
                if rising_edge(WishBoneClock) then
    wait for clkPeriod * 2;
                        loopMasters: for i in WbMasterType loop
    MasterPStrobe <= '0';
                                if wbMastersOut(i).Ack='1' and wbMastersIn(i).WrEn='0' then --valid Ack to Read request
    MasterPWrEn   <= '0';
                                        loopStatusRegs: for j in StatusFieldType loop
    MasterPCyc    <= '0';
                                                        if StatusParams(j).Address=wbMastersIn(i).Addr then             --correct address
    MasterPAddr   <= x"0";
                                                                report "Evaluating Status Read" severity NOTE;
    MasterPDataToSlave <= x"00";
                                                                assert (statusRegs(j)=wbMastersOut(i).data) report "Invalid Status Register Read" severity Warning;
    wait for clkPeriod * 10;
                                                        end if;
    MasterPStrobe <= '1';
                                        end loop loopStatusRegs;
    MasterPWrEn   <= '1';
                                end if; -- valid Ack
    MasterPCyc    <= '1';
                        end loop loopMasters;
    MasterPAddr   <= x"6";
                end if; --Clk
    MasterPDataToSlave <= x"99";
        end process procStatusVerify;
    wait for clkPeriod * 2;
 
    MasterPStrobe <= '0';
        procSettingResets: process(WishboneClock) is
    MasterPWrEn   <= '0';
                variable resetVector    : unsigned(0 to settingRsts'length-1) := (Others=>'0');
    MasterPCyc    <= '0';
                variable resetCount             : integer := 0;
    MasterPAddr   <= x"0";
                variable resetIndex             : integer := 0;
    MasterPDataToSlave <= x"00";
 
    wait;
 
  end process procWbMasterP;
 
  procWbMasterQ: process
 
  begin
  begin
    MasterQStrobe <= '0';
                if rising_edge(WishboneClock) then
    MasterQWrEn   <= '0';
                        if resetCount=20 then
    MasterQCyc    <= '0';
                                resetCount      := 0;
    MasterQAddr   <= x"0";
                                resetVector := resetVector+1;
    MasterQDataToSlave <= x"00";
                                resetIndex      := 0;
    wait for clkPeriod / 10;
                                loopSetRsts: for i in SettingFieldType loop
    wait for clkPeriod * 8;
                                        settingRsts(i)  <= resetVector(resetIndex);
    MasterQStrobe <= '1';
                                        resetIndex := resetIndex + 1;
    MasterQWrEn   <= '1';
                                end loop loopSetRsts;
    MasterQCyc    <= '1';
                        else
    MasterQAddr   <= x"6";
                                resetCount      := resetCount + 1;
    MasterQDataToSlave <= x"77";
                                settingRsts     <= (Others=>'0');
    wait for clkPeriod * 2;
                        end if;
    MasterQStrobe <= '0';
                end if; --Clk
    MasterQWrEn   <= '0';
        end process procSettingResets;
    MasterQCyc    <= '0';
 
    MasterQAddr   <= x"0";
        procSettingMonitor: process(WishboneClock,rstZ) is
    MasterQDataToSlave <= x"00";
                variable settingTBRegs  : SettingArrayType;
    wait for clkPeriod * 2;
        begin
    assert false report "Test Complete" severity warning;
                if (rstZ='0') then
  end process procWbMasterQ;
                        loopSettingRstZ: for i in SettingFieldType loop
 
                                settingTBRegs(i) := SettingParams(i).Default;
end TB_ARCHITECTURE;
                        end loop loopSettingRstZ;
 
                elsif rising_edge(WishboneClock) then
configuration TESTBENCH_FOR_wrimm_top of wrimm_top_tb is
                        loopSettingRegsCheck : for k in SettingFieldType loop
  for TB_ARCHITECTURE
                                assert (settingTBRegs(k)=settingRegs(k))        report "Setting Reg Mismatch" severity Warning;
    for UUT : wrimm_top
                        end loop loopSettingRegsCheck;
      use entity work.wrimm_top(structure);
                        loopMasters: for i in WbMasterType loop                                                                                                 --valid Ack
    end for;
                                if wbMastersOut(i).Ack='1' then
  end for;
                                        if wbMastersIn(i).WrEn='1' then                                                                                                                 -- Write request
end TESTBENCH_FOR_wrimm_top;
                                                loopSettingWriteRegs: for j in SettingFieldType loop
 
                                                        if SettingParams(j).Address=wbMastersIn(i).Addr then            --valid setting address
 
                                                                report "Writing Setting Reg";
 
                                                                settingTBRegs(j) := wbMastersIn(i).data;
 
                                                        end if; --Address match
 
                                                end loop loopSettingWriteRegs;
 
                                        else                                                                                                                                                                                                                            -- Read request
 
                                                loopSettingReadRegs: for j in SettingFieldType loop
 
                                                        if SettingParams(j).Address=wbMastersIn(i).Addr then            --valid setting address
 
                                                                report "Reading Setting Reg";
 
                                                                assert (wbMastersOut(i).data=settingTBRegs(j)) report "Setting Read Mismatch" severity Warning;
 
                                                        end if; --Address match
 
                                                end loop loopSettingReadRegs;
 
                                        end if; --WrEn
 
                                end if; --Ack to write
 
                        end loop loopMasters;
 
                        loopSettingResets: for i in SettingFieldType loop
 
                                if settingRsts(i)='1' then
 
                                        settingTBRegs(i) := SettingParams(i).Default;
 
                                end if;
 
                        end loop loopSettingResets;
 
                end if; --Clk
 
        end process procSettingMonitor;
 
 
 
  procMasterStim: process(WishboneClock,rstZ) is
 
    variable rCount             : unsigned(0 to WbAddrBits) := (Others=>'0');
 
    variable rData              : unsigned(0 to WbDataBits-1) := (Others=>'0');
 
    variable burstCount : integer := 5;
 
    variable idleCount  : integer := 4;
 
  begin
 
    if rising_edge(WishboneClock) then
 
                        rData                           := rData + 1;
 
      if WbMastersOut(Q).Ack='1' or WbMastersOut(Q).Rty='1' or WbMastersOut(Q).Err='1' then
 
        rCount                  := rCount + 1;
 
              burstCount        := burstcount - 1;
 
              if burstCount=0 then
 
                      idleCount := 3;
 
                    end if;
 
      elsif idleCount=0 then
 
        if burstCount=0 then
 
          burstCount := 4;
 
        end if;
 
      else
 
        idleCount := idleCount - 1;
 
      end if;
 
 
 
                        wbMastersIn(Q).Data <= std_logic_vector(rData);
 
            wbMastersIn(Q).Addr <= std_logic_vector(rCount(1 to WbAddrBits));
 
            wbMastersIn(Q).WrEn <= rCount(0);    --read then write
 
            if burstCount=0 then
 
                                wbMastersIn(Q).Strobe <= '0';
 
                          wbMastersIn(Q).Cyc            <= '0';
 
                        else
 
                                wbMastersIn(Q).Strobe <= '1';
 
                                wbMastersIn(Q).Cyc              <= '1';
 
                  end if;
 
    end if; --Clk
 
  end process procMasterStim;
 
 
 
end TbArch;
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.