CLEANUP: Cleanup top level TB

This commit is contained in:
Oliver Bruendler
2018-09-04 15:22:19 +02:00
parent 7e4a621f24
commit 8034aec5e4
5 changed files with 536 additions and 116 deletions

View File

@ -37,7 +37,8 @@ end entity;
architecture sim of psi_ms_daq_tb is
-- TB Control
signal TbRunning : boolean := true;
signal TbRunning : boolean := true;
signal PrintIrq_c : boolean := PrintDefault_c;
-- Constants
constant StrCount_c : integer := 4;
@ -70,7 +71,7 @@ architecture sim of psi_ms_daq_tb is
variable v : integer;
variable slv : std_logic_vector(31 downto 0);
begin
print("###################################### IRQ Detected #########################################");
print("###################################### IRQ Detected #########################################", PrintIrq_c);
wait until rising_edge(clk);
TmemRead32(16#0010#, v, clk, rqst, rsp);
slv := std_logic_vector(to_unsigned(v, 32));
@ -103,7 +104,7 @@ begin
StreamClkFreq_g => ClkFreq_c,
StreamTsFifoDepth_g => (0=>16, 1=>16, 2=>16, 3=>16),
StreamUseTs_g => (0=>true, 1=>true, 2=>true, 3=>false),
MaxWindows_g => 16,
MaxWindows_g => work.psi_ms_daq_tb_pkg.MaxWindows_c,
MinBurstSize_g => 16,
MaxBurstSize_g => 128
)
@ -220,27 +221,10 @@ begin
TmemExpect32(16#0010#, 0, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0014#, 16#000F#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0020#, 16#000F#, Tosca_Clk, TmemAcq, AcqTmem);
-- Stream 0 (Continuous Recording, 3 Window, Ringbuffer, 0x1000-0x2000)
TmemExpect32(16#0200#, 0, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0204#, 3, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0208#, 16#0000#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1000#, 16#00020001#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1004#, 16#1000#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1008#, 100, Tosca_Clk, TmemAcq, AcqTmem);
-- Stream 1 (Manual Mode, linear, 1 window, 0x2000-0x3000)
TmemExpect32(16#0210#, 0, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0214#, 250, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0218#, 16#0003#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1020#, 16#00000000#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1024#, 16#2000#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1028#, 500, Tosca_Clk, TmemAcq, AcqTmem);
-- Stream 2 (Single Mode, linear, overwrite, 3 windows)
TmemExpect32(16#0220#, 0, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0224#, 127, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#0228#, 16#0002#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1040#, 16#00020100#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1044#, 16#3000#, Tosca_Clk, TmemAcq, AcqTmem);
TmemWriteAndRead32(16#1048#, 256, Tosca_Clk, TmemAcq, AcqTmem);
-- Stream Setup
Str0Setup(Tosca_Clk, TmemAcq, AcqTmem);
Str1Setup(Tosca_Clk, TmemAcq, AcqTmem);
Str2Setup(Tosca_Clk, TmemAcq, AcqTmem);
-- Enable
TmemWriteAndRead32(16#0000#, 16#0101#, Tosca_Clk, TmemAcq, AcqTmem);
@ -254,20 +238,10 @@ begin
if Irq = '1' then
IrqHandler(Tosca_Clk, TmemAcq, AcqTmem);
end if;
-- ARM Stream 1 after 100 samples
if unsigned(Str1_Data) = 99 and not Stream1Armed_v then
Stream1Armed_v := true;
TmemWrite32(16#0218#, 16#0103#, Tosca_Clk, TmemAcq, AcqTmem);
end if;
-- ARM Stream 2 after 3 bursts
if ((Str2FrameCnt = 2) or (Str2FrameCnt = 12)) and
(unsigned(Str2_Data(7 downto 0)) >= 80) and (unsigned(Str2_Data(7 downto 0)) <= 150) and not Stream2Armed_v then
Stream2Armed_v := true;
TmemWriteAndRead32(16#0228#, 16#010102#, Tosca_Clk, TmemAcq, AcqTmem);
Str2ExpFrame := Str2FrameCnt + 1;
elsif Str2FrameCnt = 11 then
Stream2Armed_v := false;
end if;
-- Regular actions
Str0Update(Tosca_Clk, TmemAcq, AcqTmem);
Str1Update(Tosca_Clk, TmemAcq, AcqTmem);
Str2Update(Tosca_Clk, TmemAcq, AcqTmem);
end loop;
TbRunning <= false;

View File

@ -22,14 +22,60 @@ package psi_ms_daq_tb_pkg is
--------------------------------------------------------
-- Global Stuff
--------------------------------------------------------
constant MemSize_c : integer := 16#10000#;
signal Memory : t_aslv8(0 to MemSize_c-1);
constant MemSize_c : integer := 16#10000#;
signal Memory : t_aslv8(0 to MemSize_c-1);
constant MaxWindows_c : integer := 16;
constant PrintDefault_c : boolean := true;
--------------------------------------------------------
-- Register MAP
--------------------------------------------------------
constant REG_CONF_REGION : integer := 16#0000#;
constant REG_CONF_GCFG_ADDR : integer := REG_CONF_REGION+16#000#;
constant REG_CONF_GSTAT_ADDR : integer := REG_CONF_REGION+16#004#;
constant REG_CONF_IRQVEC_ADDR : integer := REG_CONF_REGION+16#010#;
constant REG_CONF_IRQENA_ADDR : integer := REG_CONF_REGION+16#014#;
constant REG_CONF_STRENA_ADDR : integer := REG_CONF_REGION+16#020#;
constant REG_CONF_Xn_STEP : integer := 16#10#;
constant REG_CONF_MAXLVLn : integer := 16#200#;
constant REG_CONF_POSTTRIGn : integer := 16#204#;
constant REG_CONF_MODEn : integer := 16#208#;
constant VAL_MODE_RECM_CONT : integer := 0*2**0;
constant VAL_MODE_RECM_TRIGMASK : integer := 1*2**0;
constant VAL_MODE_RECM_SINGLE : integer := 2*2**0;
constant VAL_MODE_RECM_MANUAL : integer := 3*2**0;
constant VAL_MODE_ARM : integer := 1*2**8;
constant VAL_MODE_RECORDING : integer := 1*2**16;
constant REG_CTX_REGION : integer := 16#1000#;
constant REG_CTX_Xn_STEP : integer := 16#20#;
constant REG_CTX_SCFGn : integer := 16#00#;
constant VAL_SCFG_RINGBUF : integer := 1*2**0;
constant VAL_SCFG_OVERWRITE : integer := 1*2**8;
constant SFT_SCFG_WINCNT : integer := 16;
constant SFT_SCFG_WINCUR : integer := 24;
constant MSK_SCFG_WINCUR : integer := 16#1F000000#;
constant REG_CTX_BUFSTARTn : integer := 16#04#;
constant REG_CTX_WINSIZEn : integer := 16#08#;
constant REG_CTX_PTRn : integer := 16#0C#;
constant REG_WIN_REGION : integer := 16#4000#;
constant REG_WIN_STRn_STEP : integer := MaxWindows_c*16#10#;
constant REG_WIN_WINn_STEP : integer := 16#10#;
constant REG_WIN_WINCNT : integer := 16#00#;
constant REG_WIN_WINLAST : integer := 16#04#;
constant REG_WIN_TSLO : integer := 16#08#;
constant REG_WIN_TSHI : integer := 16#0C#;
--------------------------------------------------------
-- Helper Procedures
--------------------------------------------------------
function IntAnd( int : in integer;
op : in integer) return integer;
procedure print( str : in string;
ena : in boolean);
--------------------------------------------------------
-- TMEM Procedures
@ -57,7 +103,95 @@ package psi_ms_daq_tb_pkg is
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- High Level Procedures
--------------------------------------------------------
procedure HlCheckMaxLvl( str : in integer;
expLevel : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
procedure HlSetPostTrig( str : in integer;
val : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
procedure HlSetMode( str : in integer;
val : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
procedure HlConfStream( str : in integer;
bufstart : in integer;
ringbuf : in boolean;
overwrite : in boolean;
wincnt : in integer;
winsize : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
procedure HlIsRecording( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out boolean);
procedure HlGetPtr( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlGetMaxLvl( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlGetCurWin( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlGetWinCnt( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlClrWinCnt( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
procedure HlGetWinLast( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlGetTsLo( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
procedure HlGetTsHi( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer);
end package;
@ -78,6 +212,14 @@ package body psi_ms_daq_tb_pkg is
opu := to_unsigned(op, 32);
return to_integer(intu and opu);
end function;
procedure print( str : in string;
ena : in boolean) is
begin
if ena then
print(str);
end if;
end procedure;
--------------------------------------------------------
-- TMEM Procedures
@ -148,5 +290,172 @@ package body psi_ms_daq_tb_pkg is
wait until rising_edge(clk);
TmemExpect32(address, value, clk, rqst, rsp);
end procedure;
--------------------------------------------------------
-- High Level Procedures
--------------------------------------------------------
procedure HlCheckMaxLvl( str : in integer;
expLevel : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
TmemExpect32(REG_CONF_MAXLVLn+REG_CONF_Xn_STEP*str, expLevel, clk, rqst, rsp);
end procedure;
procedure HlSetPostTrig( str : in integer;
val : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
TmemWriteAndRead32(REG_CONF_POSTTRIGn+REG_CONF_Xn_STEP*str, val, clk, rqst, rsp);
end procedure;
procedure HlSetMode( str : in integer;
val : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
TmemWrite32(REG_CONF_MODEn+REG_CONF_Xn_STEP*str, val, clk, rqst, rsp);
end procedure;
procedure HlConfStream( str : in integer;
bufstart : in integer;
ringbuf : in boolean;
overwrite : in boolean;
wincnt : in integer;
winsize : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
variable v : integer := 0;
begin
TmemWriteAndRead32( REG_CTX_REGION+REG_CTX_BUFSTARTn+REG_CTX_Xn_STEP*str,
bufstart, clk, rqst, rsp);
TmemWriteAndRead32( REG_CTX_REGION+REG_CTX_WINSIZEn+REG_CTX_Xn_STEP*str,
winsize, clk, rqst, rsp);
if ringbuf then
v := v + VAL_SCFG_RINGBUF;
end if;
if overwrite then
v := v + VAL_SCFG_OVERWRITE;
end if;
v := v + (2**SFT_SCFG_WINCNT)*(wincnt-1);
TmemWriteAndRead32( REG_CTX_REGION+REG_CTX_SCFGn+REG_CTX_Xn_STEP*str,
v, clk, rqst, rsp);
end procedure;
procedure HlIsRecording( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out boolean) is
variable v : integer := 0;
begin
TmemRead32( REG_CONF_REGION+REG_CONF_MODEn+REG_CONF_Xn_STEP*str,
v, clk, rqst, rsp);
if IntAnd(v, VAL_MODE_RECORDING) /= 0 then
val := true;
else
val := false;
end if;
end procedure;
procedure HlGetPtr( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
begin
TmemRead32( REG_CTX_REGION+REG_CTX_PTRn+REG_CTX_Xn_STEP*str,
val, clk, rqst, rsp);
end procedure;
procedure HlGetMaxLvl( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
begin
TmemRead32( REG_CONF_REGION+REG_CONF_MAXLVLn+REG_CONF_Xn_STEP*str,
val, clk, rqst, rsp);
end procedure;
procedure HlGetCurWin( str : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
variable v : integer;
begin
TmemRead32( REG_CTX_REGION+REG_CTX_SCFGn+REG_CTX_Xn_STEP*str,
v, clk, rqst, rsp);
v := IntAnd(v, MSK_SCFG_WINCUR);
v := v / (2**SFT_SCFG_WINCUR);
val := v;
end procedure;
procedure HlGetWinCnt( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
variable v : integer;
begin
TmemRead32( REG_WIN_REGION+REG_WIN_WINCNT+REG_WIN_STRn_STEP*str+REG_WIN_WINn_STEP*win,
val, clk, rqst, rsp);
end procedure;
procedure HlClrWinCnt( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
variable v : integer;
begin
TmemWrite32( REG_WIN_REGION+REG_WIN_WINCNT+REG_WIN_STRn_STEP*str+REG_WIN_WINn_STEP*win,
0, clk, rqst, rsp);
end procedure;
procedure HlGetWinLast( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
variable v : integer;
begin
TmemRead32( REG_WIN_REGION+REG_WIN_WINLAST+REG_WIN_STRn_STEP*str+REG_WIN_WINn_STEP*win,
val, clk, rqst, rsp);
end procedure;
procedure HlGetTsLo( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
variable v : integer;
begin
TmemRead32( REG_WIN_REGION+REG_WIN_TSLO+REG_WIN_STRn_STEP*str+REG_WIN_WINn_STEP*win,
val, clk, rqst, rsp);
end procedure;
procedure HlGetTsHi( str : in integer;
win : in integer;
signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t;
val : out integer) is
variable v : integer;
begin
TmemRead32( REG_WIN_REGION+REG_WIN_TSHi+REG_WIN_STRn_STEP*str+REG_WIN_WINn_STEP*win,
val, clk, rqst, rsp);
end procedure;
end;

View File

@ -30,8 +30,13 @@ library work;
------------------------------------------------------------
package psi_ms_daq_tb_str0_pkg is
constant PrintStr0_c : boolean := PrintDefault_c;
-- Memory
alias Memory0 : t_aslv8(0 to 16#0FFF#) is Memory(16#1000# to 16#1FFF#);
constant Str0BufStart_c : integer := 16#1000#;
constant Str0WinSize_c : integer := 100;
constant Str0Windows_c : integer := 3;
alias Memory0 : t_aslv8(0 to Str0WinSize_c*Str0Windows_c) is Memory(Str0BufStart_c to Str0BufStart_c+Str0WinSize_c*Str0Windows_c);
--------------------------------------------------------
-- Persistent State
@ -54,7 +59,21 @@ package psi_ms_daq_tb_str0_pkg is
--------------------------------------------------------
procedure Str0Handler( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str0Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str0Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
end package;
@ -104,30 +123,29 @@ package body psi_ms_daq_tb_str0_pkg is
variable addr : integer;
variable tslo : integer;
begin
print("------------ Stream 0 Handler ------------");
TmemRead32(16#0200#, v, clk, rqst, rsp);
print("MAXLVL: " & to_string(v));
TmemRead32(16#1000#, v, clk, rqst, rsp);
curwin := v/(2**24);
print("CURWIN: " & to_string(curwin));
print("");
print("------------ Stream 0 Handler ------------", PrintStr0_c);
HlGetMaxLvl(0, clk, rqst, rsp, v);
print("MAXLVL: " & to_string(v), PrintStr0_c);
HlGetCurWin(0, clk, rqst, rsp, curwin);
print("CURWIN: " & to_string(curwin), PrintStr0_c);
print("", PrintStr0_c);
while Str0NextWin /= curwin loop
print("*** Window " & to_string(Str0NextWin) & " / Number: " & to_string(Str0WinCheck) & " ***");
TmemRead32(16#4000#+Str0NextWin*16#10#, wincnt, clk, rqst, rsp);
print("WINCNT: " & to_string(wincnt));
TmemWrite32(16#4000#+Str0NextWin*16#10#, 0, clk, rqst, rsp); -- reset window counter
TmemRead32(16#4004#+Str0NextWin*16#10#, winlast, clk, rqst, rsp);
print("WINLAST: " & to_string(winlast));
TmemRead32(16#4008#+Str0NextWin*16#10#, tslo, clk, rqst, rsp);
print("WINTSLO: " & to_string(tslo));
TmemRead32(16#400C#+Str0NextWin*16#10#, v, clk, rqst, rsp);
print("WINTSHI: " & to_string(v));
winstart := 16#1000# + Str0NextWin*100;
winend := winstart + 99;
print("*** Window " & to_string(Str0NextWin) & " / Number: " & to_string(Str0WinCheck) & " ***", PrintStr0_c);
HlGetWinCnt(0, Str0NextWin, clk, rqst, rsp, wincnt);
print("WINCNT: " & to_string(wincnt), PrintStr0_c);
HlClrWinCnt(0, Str0NextWin, clk, rqst, rsp);
HlGetWinLast(0, Str0NextWin, clk, rqst, rsp, winlast);
print("WINLAST: " & to_string(winlast), PrintStr0_c);
HlGetTsLo(0, Str0NextWin, clk, rqst, rsp, tslo);
print("WINTSLO: " & to_string(tslo), PrintStr0_c);
HlGetTsHi(0, Str0NextWin, clk, rqst, rsp, v);
print("WINTSHI: " & to_string(v), PrintStr0_c);
winstart := Str0BufStart_c + Str0NextWin*Str0WinSize_c;
winend := winstart + Str0WinSize_c - 1;
case Str0WinCheck is
when 0 =>
-- Windows full because dat received for quite some time
IntCompare(100, wincnt, "WINCNT wrong");
IntCompare(Str0WinSize_c, wincnt, "WINCNT wrong");
-- Check Values
addr := winlast;
@ -166,12 +184,12 @@ package body psi_ms_daq_tb_str0_pkg is
IntCompare(100, wincnt, "WINCNT wrong");
IntCompare((256-2*30)*2, tslo-Str0LastTs, "TS difference wrong");
-- Disable stream IRQ
TmemRead32(16#0014#, v, clk, rqst, rsp);
TmemRead32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
TmemWrite32(16#0014#, v, clk, rqst, rsp);
TmemRead32(16#0020#, v, clk, rqst, rsp);
TmemWrite32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
TmemRead32(REG_CONF_STRENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
TmemWrite32(16#0020#, v, clk, rqst, rsp);
TmemWrite32(REG_CONF_STRENA_ADDR, v, clk, rqst, rsp);
-- Check Values
addr := winlast + 1;
for i in 256+30+3-99 to 256+30+3 loop
@ -185,13 +203,34 @@ package body psi_ms_daq_tb_str0_pkg is
when others => null;
end case;
print("");
print("", PrintStr0_c);
Str0LastTs := tslo;
Str0NextWin := (Str0NextWin + 1) mod 3;
Str0WinCheck := Str0WinCheck + 1;
end loop;
end procedure;
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str0Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
HlCheckMaxLvl(0, 0, clk, rqst, rsp);
HlSetPostTrig(0, 3, clk, rqst, rsp);
HlSetMode(0, VAL_MODE_RECM_CONT, clk, rqst, rsp);
HlConfStream( str => 0, bufstart => Str0BufStart_c, ringbuf => true, overwrite => false, wincnt => Str0Windows_c, winsize => Str0WinSize_c,
clk => clk, rqst => rqst, rsp => rsp);
end procedure;
end procedure;
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str0Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
end;
end;

View File

@ -26,13 +26,19 @@ library work;
------------------------------------------------------------
package psi_ms_daq_tb_str1_pkg is
constant PrintStr1_c : boolean := PrintDefault_c;
-- Memory
alias Memory1 : t_aslv8(0 to 16#0FFF#) is Memory(16#2000# to 16#2FFF#);
constant Str1BufStart_c : integer := 16#2000#;
constant Str1WinSize_c : integer := 500;
constant Str1Windows_c : integer := 1;
alias Memory1 : t_aslv8(0 to Str1WinSize_c*Str1Windows_c) is Memory(Str1BufStart_c to Str1BufStart_c+Str1WinSize_c*Str1Windows_c);
--------------------------------------------------------
-- Persistent State
--------------------------------------------------------
shared variable Str1WinCheck : integer := 0;
shared variable Str1WinCheck : integer := 0;
shared variable Str1DataCnt : integer := 0;
--------------------------------------------------------
-- Data Generation
@ -47,7 +53,22 @@ package psi_ms_daq_tb_str1_pkg is
--------------------------------------------------------
procedure Str1Handler( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str1Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str1Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
end package;
@ -64,7 +85,6 @@ package body psi_ms_daq_tb_str1_pkg is
signal vld : out std_logic;
signal trig : out std_logic;
signal data : out std_logic_vector(15 downto 0)) is
variable cnt : integer := 0;
begin
while now < 10 us loop
wait until rising_edge(clk);
@ -72,8 +92,8 @@ package body psi_ms_daq_tb_str1_pkg is
for i in 0 to 19 loop
vld <= '1';
for k in 0 to 49 loop
data <= std_logic_vector(to_unsigned(cnt, 16));
cnt := cnt + 1;
data <= std_logic_vector(to_unsigned(Str1DataCnt, 16));
Str1DataCnt := Str1DataCnt + 1;
wait until rising_edge(clk);
end loop;
vld <= '0';
@ -94,21 +114,20 @@ package body psi_ms_daq_tb_str1_pkg is
variable winlast : integer;
variable valRead : unsigned(15 downto 0);
begin
print("------------ Stream 1 Handler ------------");
TmemRead32(16#0210#, v, clk, rqst, rsp);
print("MAXLVL: " & to_string(v));
TmemRead32(16#102C#, v, clk, rqst, rsp);
print("PTR: " & to_string(v));
TmemRead32(16#1020#, v, clk, rqst, rsp);
curwin := v/(2**24);
print("CURWIN: " & to_string(curwin));
print("------------ Stream 1 Handler ------------", PrintStr1_c);
HlGetMaxLvl(1, clk, rqst, rsp, v);
print("MAXLVL: " & to_string(v), PrintStr1_c);
HlGetPtr(1, clk, rqst, rsp, v);
print("PTR: " & to_string(v), PrintStr1_c);
HlGetCurWin(1, clk, rqst, rsp, curwin);
print("CURWIN: " & to_string(curwin), PrintStr1_c);
IntCompare(0, curwin, "CURWIN wrong");
-- Check window content
TmemRead32(16#4100#, wincnt, clk, rqst, rsp);
print("WINCNT: " & to_string(wincnt));
IntCompare(250, wincnt, "WINCNT wrong");
TmemRead32(16#4104#, winlast, clk, rqst, rsp);
print("WINLAST: " & to_string(winlast));
HlGetWinCnt(1, 0, clk, rqst, rsp, wincnt);
print("WINCNT: " & to_string(wincnt), PrintStr1_c);
IntCompare(250, wincnt, "WINCNT wrong");
HlGetWinLast(1, 0, clk, rqst, rsp, winlast);
print("WINLAST: " & to_string(winlast), PrintStr1_c);
IntCompare(16#2000#+498, winlast, "WINLAST wrong");
for spl in 0 to 249 loop
valRead(7 downto 0) := unsigned(Memory1(spl*2));
@ -116,9 +135,37 @@ package body psi_ms_daq_tb_str1_pkg is
-- first 100 samples are before arming
StdlvCompareInt (spl+100, std_logic_vector(valRead), "Wrong value", false);
end loop;
print("");
print("", PrintStr1_c);
Str1WinCheck := Str1WinCheck + 1;
end procedure;
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str1Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
HlCheckMaxLvl(1, 0, clk, rqst, rsp);
HlSetPostTrig(1, 250, clk, rqst, rsp);
HlSetMode(1, VAL_MODE_RECM_MANUAL, clk, rqst, rsp);
HlConfStream( str => 1, bufstart => Str1BufStart_c, ringbuf => false, overwrite => false, wincnt => Str1Windows_c, winsize => Str1WinSize_c,
clk => clk, rqst => rqst, rsp => rsp);
end procedure;
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str1Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
variable Stream1Armed_v : boolean := false;
begin
-- ARM recorder at required point in time
if Str1DataCnt = 99 and not Stream1Armed_v then
Stream1Armed_v := true;
HlSetMode(1, VAL_MODE_RECM_MANUAL + VAL_MODE_ARM, clk, rqst, rsp);
end if;
end;
end;

View File

@ -26,13 +26,20 @@ library work;
------------------------------------------------------------
package psi_ms_daq_tb_str2_pkg is
constant PrintStr2_c : boolean := PrintDefault_c;
-- Memory
alias Memory2 : t_aslv8(0 to 16#0FFF#) is Memory(16#3000# to 16#3FFF#);
constant Str2BufStart_c : integer := 16#3000#;
constant Str2WinSize_c : integer := 256;
constant Str2Windows_c : integer := 3;
constant Str2PostTrig_c : integer := 127;
alias Memory2 : t_aslv8(0 to Str2WinSize_c*Str2Windows_c) is Memory(Str2BufStart_c to Str2BufStart_c+Str2WinSize_c*Str2Windows_c);
--------------------------------------------------------
-- Persistent State
--------------------------------------------------------
shared variable Str2FrameCnt : integer := 0;
shared variable Str2SplCnt : integer := 0;
shared variable Str2WinCheck : integer := 0;
shared variable Str2ExpFrame : integer := 0;
@ -49,7 +56,21 @@ package psi_ms_daq_tb_str2_pkg is
--------------------------------------------------------
procedure Str2Handler( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str2Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str2Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
end package;
@ -66,18 +87,17 @@ package body psi_ms_daq_tb_str2_pkg is
signal vld : out std_logic;
signal trig : out std_logic;
signal data : out std_logic_vector(15 downto 0)) is
variable cnt : integer := 0;
begin
while now < 8.5 us loop
wait until rising_edge(clk);
end loop;
for i in 0 to 19 loop
vld <= '1';
cnt := 0;
Str2SplCnt := 0;
trig <= '1';
for k in 0 to 199 loop
data <= std_logic_vector(to_unsigned(Str2FrameCnt*256+cnt, 16));
cnt := cnt + 1;
data <= std_logic_vector(to_unsigned(Str2FrameCnt*256+Str2SplCnt, 16));
Str2SplCnt := Str2SplCnt + 1;
wait until rising_edge(clk);
trig <= '0';
end loop;
@ -101,34 +121,34 @@ package body psi_ms_daq_tb_str2_pkg is
variable splNr : integer;
variable valRead : unsigned(15 downto 0);
variable splInWin : integer;
variable isRecording : boolean;
begin
print("------------ Stream 2 Handler ------------");
TmemRead32(16#020#, v, clk, rqst, rsp);
print("MAXLVL: " & to_string(v));
TmemRead32(16#104C#, v, clk, rqst, rsp);
print("PTR: " & to_string(v));
TmemRead32(16#1040#, v, clk, rqst, rsp);
curwin := v/(2**24);
print("CURWIN: " & to_string(curwin));
print("------------ Stream 2 Handler ------------", PrintStr2_c);
HlGetMaxLvl(2, clk, rqst, rsp, v);
print("MAXLVL: " & to_string(v), PrintStr2_c);
HlGetPtr(2, clk, rqst, rsp, v);
print("PTR: " & to_string(v), PrintStr2_c);
HlGetCurWin(2, clk, rqst, rsp, curwin);
print("CURWIN: " & to_string(curwin), PrintStr2_c);
-- Check if recording is finished
TmemRead32(16#0228#, v, clk, rqst, rsp);
if v >= 16#010000# then
print("Skipped: Recording still ongoing");
HlIsRecording(2, clk, rqst, rsp, isRecording);
if isRecording then
print("Skipped: Recording still ongoing", PrintStr2_c);
else
-- Check Data (last 128 samples)
splNr := 127;
splNr := Str2PostTrig_c;
while splNr >= 0 loop
-- Calculate window to read
if curwin = 0 then
curwin := 2;
curwin := Str2Windows_c-1;
else
curwin := curwin-1;
end if;
-- Read window data
print("check window " & to_string(curwin));
TmemRead32(16#4204#+curwin*16#10#, spladdr, clk, rqst, rsp);
print("WINLAST: " & to_string(spladdr));
while (splNr >= 0) and (spladdr >= 16#3000#+curwin*256) loop
print("check window " & to_string(curwin), PrintStr2_c);
HlGetWinLast(2, curwin, clk, rqst, rsp, spladdr);
print("WINLAST: " & to_string(spladdr), PrintStr2_c);
while (splNr >= 0) and (spladdr >= Str2BufStart_c+curwin*Str2WinSize_c) loop
StdlvCompareInt(splNr, Memory(spladdr), "Sample " & to_string(Str2ExpFrame) & ":" & to_string(splNr) & " wrong CNT", false);
StdlvCompareInt(Str2ExpFrame, Memory(spladdr+1), "Sample " & to_string(Str2ExpFrame) & ":" & to_string(splNr) & " wrong FRAME", false);
spladdr := spladdr - 2;
@ -137,9 +157,40 @@ package body psi_ms_daq_tb_str2_pkg is
end loop;
Str2WinCheck := Str2WinCheck + 1;
end if;
print("");
end procedure;
print("", PrintStr2_c);
end procedure;
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str2Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
HlCheckMaxLvl(2, 0, clk, rqst, rsp);
HlSetPostTrig(2, Str2PostTrig_c, clk, rqst, rsp);
HlSetMode(2, VAL_MODE_RECM_SINGLE, clk, rqst, rsp);
HlConfStream( str => 2, bufstart => Str2BufStart_c, ringbuf => false, overwrite => true, wincnt => Str2Windows_c, winsize => Str2WinSize_c,
clk => clk, rqst => rqst, rsp => rsp);
end procedure;
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str2Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
variable Stream2Armed_v : boolean := false;
begin
-- ARM Stream 2 after 3 bursts
if ((Str2FrameCnt = 2) or (Str2FrameCnt = 12)) and
(Str2SplCnt >= 80) and (Str2SplCnt <= 150) and not Stream2Armed_v then
Stream2Armed_v := true;
HlSetMode(2, VAL_MODE_RECM_SINGLE + VAL_MODE_ARM, clk, rqst, rsp);
Str2ExpFrame := Str2FrameCnt + 1;
elsif Str2FrameCnt = 11 then
Stream2Armed_v := false;
end if;
end;
end;