DEVEL: Added testbench for stream 3 (trigger mask mode)

This commit is contained in:
Oliver Bruendler
2018-09-04 16:36:39 +02:00
parent 8034aec5e4
commit 5c56188a96
6 changed files with 317 additions and 92 deletions

View File

@ -76,6 +76,7 @@ add_sources "../tb" {
psi_ms_daq/psi_ms_daq_tb_str0_pkg.vhd \
psi_ms_daq/psi_ms_daq_tb_str1_pkg.vhd \
psi_ms_daq/psi_ms_daq_tb_str2_pkg.vhd \
psi_ms_daq/psi_ms_daq_tb_str3_pkg.vhd \
psi_ms_daq/psi_ms_daq_tb.vhd \
} -tag tb

View File

@ -23,6 +23,7 @@ library work;
use work.psi_ms_daq_tb_str0_pkg.all;
use work.psi_ms_daq_tb_str1_pkg.all;
use work.psi_ms_daq_tb_str2_pkg.all;
use work.psi_ms_daq_tb_str3_pkg.all;
------------------------------------------------------------
@ -82,6 +83,7 @@ architecture sim of psi_ms_daq_tb is
when 0 => Str0Handler(clk, rqst, rsp);
when 1 => Str1Handler(clk, rqst, rsp);
when 2 => Str2Handler(clk, rqst, rsp);
when 3 => Str3Handler(clk, rqst, rsp);
when others => null;
end case;
end if;
@ -193,17 +195,6 @@ begin
wait;
end process;
end generate;
------------------------------------------------------------
-- TBD
------------------------------------------------------------
-- No influence when disabled
-- Disable / re-enable
-- Disable during transfer
-- Version register!
-- RINGBUF (OK), LINEAR (ONGOING)
-- OVERWRITE (ONGOING), STOP (OK)
-- Mode: CONTINUOUS (OK), SINGLE(ONGOING), MASK(TODO), MANUAL (OK)
------------------------------------------------------------
-- TMEM Process
@ -213,6 +204,10 @@ begin
variable Stream1Armed_v : boolean := false;
variable Stream2Armed_v : boolean := false;
begin
print("*** Info ***");
print("This testbench does not print any status information by default (only errors).");
print("To change this behavior, change the constant PrintDefault_c in psi_ms_daq_tb_pkg.");
wait for 1 us;
Tmem_Rst <= '0';
Smem_Rst <= '0';
@ -225,6 +220,7 @@ begin
Str0Setup(Tosca_Clk, TmemAcq, AcqTmem);
Str1Setup(Tosca_Clk, TmemAcq, AcqTmem);
Str2Setup(Tosca_Clk, TmemAcq, AcqTmem);
Str3Setup(Tosca_Clk, TmemAcq, AcqTmem);
-- Enable
TmemWriteAndRead32(16#0000#, 16#0101#, Tosca_Clk, TmemAcq, AcqTmem);
@ -242,6 +238,7 @@ begin
Str0Update(Tosca_Clk, TmemAcq, AcqTmem);
Str1Update(Tosca_Clk, TmemAcq, AcqTmem);
Str2Update(Tosca_Clk, TmemAcq, AcqTmem);
Str3Update(Tosca_Clk, TmemAcq, AcqTmem);
end loop;
TbRunning <= false;
@ -249,7 +246,8 @@ begin
-- *** Check end state ***
assert Str0WinCheck >= 4 report "###ERROR###: Stream 0 checks not completed" severity error;
assert Str1WinCheck = 1 report "###ERROR###: Stream 1 checks not completed" severity error;
assert Str2WinCheck = 2 report "###ERROR###: Stream 2 checks not completed " & to_string(Str2WinCheck) severity error;
assert Str2WinCheck = 2 report "###ERROR###: Stream 2 checks not completed" severity error;
assert Str3WinCheck = 2 report "###ERROR###: Stream 3 checks not completed" severity error;
wait;
end process;
@ -292,6 +290,12 @@ begin
wait;
end process;
p_str3 : process
begin
Str3Data(Str_Clk(3), Str_Vld(3), Str_Trig(3), Str3_Data);
wait;
end process;
------------------------------------------------------------
-- Check Process
------------------------------------------------------------

View File

@ -26,7 +26,7 @@ package psi_ms_daq_tb_pkg is
signal Memory : t_aslv8(0 to MemSize_c-1);
constant MaxWindows_c : integer := 16;
constant PrintDefault_c : boolean := true;
constant PrintDefault_c : boolean := false;
--------------------------------------------------------
-- Register MAP

View File

@ -45,6 +45,7 @@ package psi_ms_daq_tb_str0_pkg is
shared variable Str0WinCheck : integer := 0;
shared variable Str0LastTs : integer;
shared variable Str0IrqOn : boolean := false;
shared variable Str0Disabled : boolean := false;
--------------------------------------------------------
-- Data Generation
@ -129,85 +130,91 @@ package body psi_ms_daq_tb_str0_pkg is
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) & " ***", 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(Str0WinSize_c, wincnt, "WINCNT wrong");
-- Check Values
addr := winlast;
for i in 256+30+3-99 to 256+30+3 loop
if addr = winend then
addr := winstart;
else
addr := addr + 1;
end if;
StdlvCompareInt (i mod 256, Memory(addr), "Wrong value at 0x" & to_hstring(to_unsigned(addr,32)), false);
end loop;
when 1 =>
-- Trigger following each other with 30 samples difference
IntCompare(30, wincnt, "WINCNT wrong");
IntCompare(30*2, tslo-Str0LastTs, "TS difference wrong");
-- Check Values
addr := winstart;
for i in 34 to 63 loop
StdlvCompareInt (i, Memory(addr), "Wrong value", false);
addr := addr + 1; -- does never wrap
end loop;
when 2 =>
-- Trigger following each other with 30 samples difference
IntCompare(30, wincnt, "WINCNT wrong");
IntCompare(30*2, tslo-Str0LastTs, "TS difference wrong");
-- Check Values
addr := winstart;
for i in 64 to 93 loop
StdlvCompareInt (i, Memory(addr), "Wrong value", false);
addr := addr + 1; -- does never wrap
end loop;
when 3 =>
-- Full buffer recorded after emptying first buffer
IntCompare(100, wincnt, "WINCNT wrong");
IntCompare((256-2*30)*2, tslo-Str0LastTs, "TS difference wrong");
-- Disable stream IRQ
TmemRead32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
TmemWrite32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
TmemRead32(REG_CONF_STRENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
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
StdlvCompareInt (i mod 256, Memory(addr), "Wrong value", false);
if addr = winend then
addr := winstart;
else
addr := addr + 1;
end if;
end loop;
when others => null;
end case;
if Str0Disabled then
print("Skipped, stream disabled", PrintStr0_c);
print("", PrintStr0_c);
Str0LastTs := tslo;
Str0NextWin := (Str0NextWin + 1) mod 3;
Str0WinCheck := Str0WinCheck + 1;
end loop;
else
while Str0NextWin /= curwin loop
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(Str0WinSize_c, wincnt, "WINCNT wrong");
-- Check Values
addr := winlast;
for i in 256+30+3-99 to 256+30+3 loop
if addr = winend then
addr := winstart;
else
addr := addr + 1;
end if;
StdlvCompareInt (i mod 256, Memory(addr), "Wrong value at 0x" & to_hstring(to_unsigned(addr,32)), false);
end loop;
when 1 =>
-- Trigger following each other with 30 samples difference
IntCompare(30, wincnt, "WINCNT wrong");
IntCompare(30*2, tslo-Str0LastTs, "TS difference wrong");
-- Check Values
addr := winstart;
for i in 34 to 63 loop
StdlvCompareInt (i, Memory(addr), "Wrong value", false);
addr := addr + 1; -- does never wrap
end loop;
when 2 =>
-- Trigger following each other with 30 samples difference
IntCompare(30, wincnt, "WINCNT wrong");
IntCompare(30*2, tslo-Str0LastTs, "TS difference wrong");
-- Check Values
addr := winstart;
for i in 64 to 93 loop
StdlvCompareInt (i, Memory(addr), "Wrong value", false);
addr := addr + 1; -- does never wrap
end loop;
when 3 =>
-- Full buffer recorded after emptying first buffer
IntCompare(100, wincnt, "WINCNT wrong");
IntCompare((256-2*30)*2, tslo-Str0LastTs, "TS difference wrong");
-- Disable stream IRQ
TmemRead32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
TmemWrite32(REG_CONF_IRQENA_ADDR, v, clk, rqst, rsp);
TmemRead32(REG_CONF_STRENA_ADDR, v, clk, rqst, rsp);
v := IntAnd(v, 16#0FE#);
TmemWrite32(REG_CONF_STRENA_ADDR, v, clk, rqst, rsp);
Str0Disabled := true;
-- Check Values
addr := winlast + 1;
for i in 256+30+3-99 to 256+30+3 loop
StdlvCompareInt (i mod 256, Memory(addr), "Wrong value", false);
if addr = winend then
addr := winstart;
else
addr := addr + 1;
end if;
end loop;
when others => null;
end case;
print("", PrintStr0_c);
Str0LastTs := tslo;
Str0NextWin := (Str0NextWin + 1) mod 3;
Str0WinCheck := Str0WinCheck + 1;
end loop;
end if;
end procedure;
--------------------------------------------------------

View File

@ -42,6 +42,7 @@ package psi_ms_daq_tb_str2_pkg is
shared variable Str2SplCnt : integer := 0;
shared variable Str2WinCheck : integer := 0;
shared variable Str2ExpFrame : integer := 0;
shared variable Stream2Armed_v : boolean := false;
--------------------------------------------------------
-- Data Generation
@ -180,7 +181,6 @@ package body psi_ms_daq_tb_str2_pkg is
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

View File

@ -0,0 +1,213 @@
------------------------------------------------------------
-- Description
------------------------------------------------------------
------------------------------------------------------------
-- Libraries
------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.psi_common_math_pkg.all;
use work.psi_common_array_pkg.all;
use work.psi_ms_daq_pkg.all;
library work;
use work.psi_tb_txt_util.all;
use work.psi_tb_compare_pkg.all;
use work.psi_ms_daq_tb_pkg.all;
------------------------------------------------------------
-- Package Header
------------------------------------------------------------
package psi_ms_daq_tb_str3_pkg is
constant PrintStr3_c : boolean := PrintDefault_c;
-- Memory
constant Str3BufStart_c : integer := 16#4000#;
constant Str3WinSize_c : integer := 1024;
constant Str3Windows_c : integer := 3;
constant Str3PostTrig_c : integer := 9;
constant Str3TrigPos_c : integer := 100;
alias Memory3 : t_aslv8(0 to Str3WinSize_c*Str3Windows_c) is Memory(Str3BufStart_c to Str3BufStart_c+Str3WinSize_c*Str3Windows_c);
--------------------------------------------------------
-- Persistent State
--------------------------------------------------------
shared variable Str3ExpFrame : integer := 0;
shared variable Str3FrameCnt : integer := 0;
shared variable Str3SplCnt : integer := 0;
shared variable Str3WinCheck : integer := 0;
shared variable Stream3Armed_v : boolean := false;
--------------------------------------------------------
-- Data Generation
--------------------------------------------------------
procedure Str3Data( signal clk : in std_logic;
signal vld : out std_logic;
signal trig : out std_logic;
signal data : out std_logic_vector(31 downto 0));
--------------------------------------------------------
-- IRQ Handler
--------------------------------------------------------
procedure Str3Handler( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str3Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str3Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t);
end package;
------------------------------------------------------------
-- Package Body
------------------------------------------------------------
package body psi_ms_daq_tb_str3_pkg is
--------------------------------------------------------
-- Data Generation
--------------------------------------------------------
procedure Str3Data( signal clk : in std_logic;
signal vld : out std_logic;
signal trig : out std_logic;
signal data : out std_logic_vector(31 downto 0)) is
begin
while now < 8 us loop
wait until rising_edge(clk);
end loop;
for i in 0 to 9 loop
vld <= '1';
Str3SplCnt := 0;
for k in 0 to 999 loop
data <= std_logic_vector(to_unsigned(Str3FrameCnt*2**16+Str3SplCnt, 32));
if Str3SplCnt = Str3TrigPos_c then
trig <= '1';
else
trig <= '0';
end if;
Str3SplCnt := Str3SplCnt + 1;
wait until rising_edge(clk);
end loop;
Str3FrameCnt := Str3FrameCnt + 1;
vld <= '0';
wait for 1 us;
wait until rising_edge(clk);
end loop;
end procedure;
--------------------------------------------------------
-- IRQ Handler
--------------------------------------------------------
procedure Str3Handler( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
variable v : integer;
variable curwin : integer;
variable wincnt : integer;
variable winlast : integer;
variable spladdr : integer;
variable splNr : integer;
variable valRead : unsigned(15 downto 0);
variable splInWin : integer;
variable isRecording : boolean;
begin
print("------------ Stream 3 Handler ------------", PrintStr3_c);
HlGetMaxLvl(3, clk, rqst, rsp, v);
print("MAXLVL: " & to_string(v), PrintStr3_c);
HlGetPtr(3, clk, rqst, rsp, v);
print("PTR: " & to_string(v), PrintStr3_c);
HlGetCurWin(3, clk, rqst, rsp, curwin);
print("CURWIN: " & to_string(curwin), PrintStr3_c);
-- Calculate window to read
if curwin = 0 then
curwin := Str3Windows_c-1;
else
curwin := curwin-1;
end if;
-- Check Data from this frame
splNr := Str3TrigPos_c+Str3PostTrig_c;
-- Read window data (Post-Trigger, from this window)
print("check post-trigger", PrintStr3_c);
HlGetWinLast(3, curwin, clk, rqst, rsp, winlast);
print("WINLAST: " & to_string(winlast), PrintStr3_c);
spladdr := winlast;
while splNr >= 0 loop
StdlvCompareInt(splNr, Memory(spladdr+1) & Memory(spladdr), "Sample " & to_string(Str3ExpFrame) & ":" & to_string(splNr) & " wrong CNT", false);
StdlvCompareInt(Str3ExpFrame, Memory(spladdr+3) & Memory(spladdr+2), "Sample " & to_string(Str3ExpFrame) & ":" & to_string(splNr) & " wrong FRAME", false);
-- Wraparound
if spladdr = Str3BufStart_c+curwin*Str3WinSize_c then
spladdr := Str3BufStart_c+(curwin+1)*Str3WinSize_c-4;
-- Normal Counting
else
spladdr := spladdr - 4;
end if;
splNr := splNr - 1;
end loop;
-- Read window data (Pre-Trigger, from last window)
print("check pre-trigger", PrintStr3_c);
splNr := 999;
while spladdr /= winlast loop
StdlvCompareInt(splNr, Memory(spladdr+1) & Memory(spladdr), "Sample " & to_string(Str3ExpFrame-1) & ":" & to_string(splNr) & " wrong CNT", false);
StdlvCompareInt(Str3ExpFrame-1, Memory(spladdr+3) & Memory(spladdr+2), "Sample " & to_string(Str3ExpFrame-1) & ":" & to_string(splNr) & " wrong FRAME", false);
-- Wraparound
if spladdr = Str3BufStart_c+curwin*Str3WinSize_c then
spladdr := Str3BufStart_c+(curwin+1)*Str3WinSize_c-4;
-- Normal Counting
else
spladdr := spladdr - 4;
end if;
splNr := splNr - 1;
end loop;
Str3WinCheck := Str3WinCheck + 1;
print("", PrintStr3_c);
end procedure;
--------------------------------------------------------
-- Setup
--------------------------------------------------------
procedure Str3Setup( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
HlCheckMaxLvl(3, 0, clk, rqst, rsp);
HlSetPostTrig(3, Str3PostTrig_c, clk, rqst, rsp);
HlSetMode(3, VAL_MODE_RECM_TRIGMASK, clk, rqst, rsp);
HlConfStream( str => 3, bufstart => Str3BufStart_c, ringbuf => true, overwrite => true, wincnt => Str3Windows_c, winsize => Str3WinSize_c,
clk => clk, rqst => rqst, rsp => rsp);
end procedure;
--------------------------------------------------------
-- Update
--------------------------------------------------------
procedure Str3Update( signal clk : in std_logic;
signal rqst : out TmemRqst_t;
signal rsp : in TmemResp_t) is
begin
if ((Str3FrameCnt = 2) or (Str3FrameCnt = 7))
and not Stream3Armed_v then
HlSetMode(3, VAL_MODE_RECM_TRIGMASK + VAL_MODE_ARM, clk, rqst, rsp);
Stream3Armed_v := true;
Str3ExpFrame := Str3FrameCnt;
elsif Str3FrameCnt = 6 then
Stream3Armed_v := false;
end if;
end procedure;
end;