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
|