DEVEL: Implemented stream 2 in top-level TB

This commit is contained in:
Oliver Bruendler
2018-09-04 13:05:23 +02:00
parent 6ee4dfe4c2
commit fca85cbfd7
4 changed files with 178 additions and 4 deletions

View File

@ -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

View File

@ -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
------------------------------------------------------------

View File

@ -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;

View 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;