DEVEL: Implemented stream 2 in top-level TB
This commit is contained in:
@ -75,6 +75,7 @@ add_sources "../tb" {
|
||||
psi_ms_daq/psi_ms_daq_tb_pkg.vhd \
|
||||
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.vhd \
|
||||
} -tag tb
|
||||
|
||||
|
@ -22,6 +22,7 @@ library work;
|
||||
use work.psi_ms_daq_tb_pkg.all;
|
||||
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;
|
||||
|
||||
|
||||
------------------------------------------------------------
|
||||
@ -79,6 +80,7 @@ architecture sim of psi_ms_daq_tb is
|
||||
case i is
|
||||
when 0 => Str0Handler(clk, rqst, rsp);
|
||||
when 1 => Str1Handler(clk, rqst, rsp);
|
||||
when 2 => Str2Handler(clk, rqst, rsp);
|
||||
when others => null;
|
||||
end case;
|
||||
end if;
|
||||
@ -198,9 +200,9 @@ begin
|
||||
-- Disable / re-enable
|
||||
-- Disable during transfer
|
||||
-- Version register!
|
||||
-- RINGBUF (OK), LINEAR (TODO)
|
||||
-- OVERWRITE (TODO), STOP (OK)
|
||||
-- Mode: CONTINUOUS (OK), SINGLE(TODO), MASK(TODO), MANUAL (OK)
|
||||
-- RINGBUF (OK), LINEAR (ONGOING)
|
||||
-- OVERWRITE (ONGOING), STOP (OK)
|
||||
-- Mode: CONTINUOUS (OK), SINGLE(ONGOING), MASK(TODO), MANUAL (OK)
|
||||
|
||||
------------------------------------------------------------
|
||||
-- TMEM Process
|
||||
@ -208,6 +210,7 @@ begin
|
||||
p_tmem : process
|
||||
variable StartTime_v : time;
|
||||
variable Stream1Armed_v : boolean := false;
|
||||
variable Stream2Armed_v : boolean := false;
|
||||
begin
|
||||
wait for 1 us;
|
||||
Tmem_Rst <= '0';
|
||||
@ -224,13 +227,20 @@ begin
|
||||
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 (Single Shot, linear, 1 window, 0x2000-0x3000)
|
||||
-- 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);
|
||||
|
||||
-- Enable
|
||||
TmemWriteAndRead32(16#0000#, 16#0101#, Tosca_Clk, TmemAcq, AcqTmem);
|
||||
@ -249,6 +259,15 @@ begin
|
||||
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;
|
||||
|
||||
end loop;
|
||||
TbRunning <= false;
|
||||
@ -256,6 +275,7 @@ 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;
|
||||
wait;
|
||||
end process;
|
||||
|
||||
@ -292,6 +312,12 @@ begin
|
||||
wait;
|
||||
end process;
|
||||
|
||||
p_str2 : process
|
||||
begin
|
||||
Str2Data(Str_Clk(2), Str_Vld(2), Str_Trig(2), Str2_Data);
|
||||
wait;
|
||||
end process;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- Check Process
|
||||
------------------------------------------------------------
|
||||
|
@ -144,6 +144,8 @@ package body psi_ms_daq_tb_pkg is
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
TmemWrite32(address, value, clk, rqst, rsp);
|
||||
wait for 400 ns;
|
||||
wait until rising_edge(clk);
|
||||
TmemExpect32(address, value, clk, rqst, rsp);
|
||||
end procedure;
|
||||
|
||||
|
145
tb/psi_ms_daq/psi_ms_daq_tb_str2_pkg.vhd
Normal file
145
tb/psi_ms_daq/psi_ms_daq_tb_str2_pkg.vhd
Normal file
@ -0,0 +1,145 @@
|
||||
------------------------------------------------------------
|
||||
-- Description
|
||||
------------------------------------------------------------
|
||||
-- Stream 2 works in siingle recording mode. The data is arriving
|
||||
-- in bursts (samples back-to-back withing bursts) and does
|
||||
-- contain trigger events at the really begining (sample 0).
|
||||
------------------------------------------------------------
|
||||
-- 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_str2_pkg is
|
||||
|
||||
-- Memory
|
||||
alias Memory2 : t_aslv8(0 to 16#0FFF#) is Memory(16#3000# to 16#3FFF#);
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Persistent State
|
||||
--------------------------------------------------------
|
||||
shared variable Str2FrameCnt : integer := 0;
|
||||
shared variable Str2WinCheck : integer := 0;
|
||||
shared variable Str2ExpFrame : integer := 0;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Data Generation
|
||||
--------------------------------------------------------
|
||||
procedure Str2Data( signal clk : in std_logic;
|
||||
signal vld : out std_logic;
|
||||
signal trig : out std_logic;
|
||||
signal data : out std_logic_vector(15 downto 0));
|
||||
|
||||
--------------------------------------------------------
|
||||
-- IRQ Handler
|
||||
--------------------------------------------------------
|
||||
procedure Str2Handler( 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_str2_pkg is
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Data Generation
|
||||
--------------------------------------------------------
|
||||
procedure Str2Data( signal clk : in std_logic;
|
||||
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;
|
||||
trig <= '1';
|
||||
for k in 0 to 199 loop
|
||||
data <= std_logic_vector(to_unsigned(Str2FrameCnt*256+cnt, 16));
|
||||
cnt := cnt + 1;
|
||||
wait until rising_edge(clk);
|
||||
trig <= '0';
|
||||
end loop;
|
||||
Str2FrameCnt := Str2FrameCnt + 1;
|
||||
vld <= '0';
|
||||
wait for 1 us;
|
||||
wait until rising_edge(clk);
|
||||
end loop;
|
||||
end procedure;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- IRQ Handler
|
||||
--------------------------------------------------------
|
||||
procedure Str2Handler( 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 spladdr : integer;
|
||||
variable splNr : integer;
|
||||
variable valRead : unsigned(15 downto 0);
|
||||
variable splInWin : integer;
|
||||
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));
|
||||
-- Check if recording is finished
|
||||
TmemRead32(16#0228#, v, clk, rqst, rsp);
|
||||
if v >= 16#010000# then
|
||||
print("Skipped: Recording still ongoing");
|
||||
else
|
||||
-- Check Data (last 128 samples)
|
||||
splNr := 127;
|
||||
while splNr >= 0 loop
|
||||
-- Calculate window to read
|
||||
if curwin = 0 then
|
||||
curwin := 2;
|
||||
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
|
||||
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;
|
||||
splNr := splNr - 1;
|
||||
end loop;
|
||||
end loop;
|
||||
Str2WinCheck := Str2WinCheck + 1;
|
||||
end if;
|
||||
print("");
|
||||
|
||||
|
||||
end procedure;
|
||||
|
||||
end;
|
Reference in New Issue
Block a user