CLEANUP: Split top-level TB into multiple files
This commit is contained in:
@ -71,6 +71,8 @@ add_sources "../tb" {
|
||||
psi_ms_daq_daq_dma/psi_ms_daq_daq_dma_tb_case_cmd_full.vhd \
|
||||
psi_ms_daq_daq_dma/psi_ms_daq_daq_dma_tb_case_aligned.vhd \
|
||||
psi_ms_daq_daq_dma/psi_ms_daq_daq_dma_tb.vhd \
|
||||
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.vhd \
|
||||
} -tag tb
|
||||
|
||||
|
@ -19,6 +19,8 @@ library work;
|
||||
use work.psi_tb_txt_util.all;
|
||||
use work.psi_tb_compare_pkg.all;
|
||||
use work.smem_master_types_pkg.all;
|
||||
use work.psi_ms_daq_tb_pkg.all;
|
||||
use work.psi_ms_daq_tb_str0_pkg.all;
|
||||
|
||||
|
||||
------------------------------------------------------------
|
||||
@ -38,7 +40,7 @@ architecture sim of psi_ms_daq_tb is
|
||||
-- Constants
|
||||
constant StrCount_c : integer := 4;
|
||||
constant ClkFreq_c : t_areal := (0=>250.0e6, 1=>125.0e6, 2=>80.0e6, 3=>200.0e6);
|
||||
constant MemSize_c : integer := 16#10000#;
|
||||
|
||||
|
||||
-- Port signals
|
||||
signal Str_Clk : std_logic_vector(StrCount_c-1 downto 0) := (others => '0');
|
||||
@ -59,191 +61,6 @@ architecture sim of psi_ms_daq_tb is
|
||||
signal AcqSmem : ToSmemWr_t;
|
||||
signal Irq : std_logic := '0';
|
||||
|
||||
-- Memory
|
||||
signal Memory : t_aslv8(0 to MemSize_c-1);
|
||||
alias Memory0 : t_aslv8(0 to 16#0FFF#) is Memory(16#1000# to 16#1FFF#);
|
||||
|
||||
function IntAnd( int : in integer;
|
||||
op : in integer) return integer is
|
||||
variable intu, opu : unsigned(31 downto 0);
|
||||
begin
|
||||
intu := to_unsigned(int, 32);
|
||||
opu := to_unsigned(op, 32);
|
||||
return to_integer(intu and opu);
|
||||
end function;
|
||||
|
||||
|
||||
-- *** TMEM Procedures ***
|
||||
procedure TmemWrite32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
wait until rising_edge(clk);
|
||||
rqst.ADD <= std_logic_vector(to_unsigned(address, 24)) and X"FFFFF8";
|
||||
rqst.ENA <= '1';
|
||||
rqst.DATW <= (others => '0');
|
||||
rqst.WE <= (others => '0');
|
||||
if address mod 8 = 0 then
|
||||
rqst.DATW(31 downto 0) <= std_logic_vector(to_unsigned(value, 32));
|
||||
rqst.WE(3 downto 0) <= (others => '1');
|
||||
else
|
||||
rqst.DATW(63 downto 32) <= std_logic_vector(to_unsigned(value, 32));
|
||||
rqst.WE(7 downto 4) <= (others => '1');
|
||||
end if;
|
||||
wait until rising_edge(clk);
|
||||
rqst.ENA <= '0';
|
||||
rqst.WE <= (others => '0');
|
||||
end procedure;
|
||||
|
||||
procedure TmemRead32( address : in integer;
|
||||
value : out integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
wait until rising_edge(clk);
|
||||
rqst.ADD <= std_logic_vector(to_unsigned(address, 24)) and X"FFFFF8";
|
||||
rqst.ENA <= '1';
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
if address mod 8 = 0 then
|
||||
value := to_integer(unsigned(rsp.DATR(31 downto 0)));
|
||||
else
|
||||
value := to_integer(unsigned(rsp.DATR(63 downto 32)));
|
||||
end if;
|
||||
rqst.ENA <= '0';
|
||||
end procedure;
|
||||
|
||||
procedure TmemExpect32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
variable readVal : integer;
|
||||
begin
|
||||
TmemRead32(address, readVal, clk, rqst, rsp);
|
||||
IntCompare(value, readVal, "Unexpected value at address 0x" & to_hstring(to_unsigned(address, 32)));
|
||||
end procedure;
|
||||
|
||||
|
||||
procedure TmemWriteAndRead32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
TmemWrite32(address, value, clk, rqst, rsp);
|
||||
TmemExpect32(address, value, clk, rqst, rsp);
|
||||
end procedure;
|
||||
|
||||
-- *** IRQ Handling ***
|
||||
shared variable Str0NextWin : integer := 0;
|
||||
shared variable Str0WinCheck : integer := 0;
|
||||
shared variable Str0LastTs : integer;
|
||||
|
||||
procedure Str0Handler( 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 winstart, winend : integer;
|
||||
variable winlast : integer;
|
||||
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("");
|
||||
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;
|
||||
case Str0WinCheck is
|
||||
when 0 =>
|
||||
-- Windows full because dat received for quite some time
|
||||
IntCompare(100, wincnt, "WINCNT wrong");
|
||||
-- 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 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");
|
||||
print(to_string(tslo) & " " & to_string(Str0LastTs));
|
||||
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(16#0014#, v, clk, rqst, rsp);
|
||||
v := IntAnd(v, 16#0FE#);
|
||||
TmemWrite32(16#0014#, v, clk, rqst, rsp);
|
||||
TmemRead32(16#0020#, v, clk, rqst, rsp);
|
||||
v := IntAnd(v, 16#0FE#);
|
||||
TmemWrite32(16#0020#, 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;
|
||||
print("");
|
||||
Str0LastTs := tslo;
|
||||
Str0NextWin := (Str0NextWin + 1) mod 3;
|
||||
Str0WinCheck := Str0WinCheck + 1;
|
||||
end loop;
|
||||
|
||||
|
||||
end procedure;
|
||||
|
||||
procedure IrqHandler( signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
@ -265,11 +82,7 @@ architecture sim of psi_ms_daq_tb is
|
||||
end if;
|
||||
end loop;
|
||||
wait until rising_edge(clk);
|
||||
end procedure;
|
||||
|
||||
|
||||
|
||||
|
||||
end procedure;
|
||||
|
||||
|
||||
begin
|
||||
@ -449,22 +262,7 @@ begin
|
||||
begin
|
||||
wait until rising_edge(Str_Clk(0));
|
||||
while TbRunning loop
|
||||
Str_Vld(0) <= '1';
|
||||
if (now > 15 us) and (to_integer(unsigned(Str0_Data)) = 0) then
|
||||
IrqOn := true;
|
||||
end if;
|
||||
case to_integer(unsigned(Str0_Data)) is
|
||||
when 30 | 60 | 90 =>
|
||||
if IrqOn then
|
||||
Str_Trig(0) <= '1';
|
||||
end if;
|
||||
when others => null;
|
||||
end case;
|
||||
wait until rising_edge(Str_Clk(0));
|
||||
Str_Vld(0) <= '0';
|
||||
Str_Trig(0) <= '0';
|
||||
Str0_Data <= std_logic_vector(unsigned(Str0_Data)+1);
|
||||
wait until rising_edge(Str_Clk(0));
|
||||
Str0Sample(Str_Clk(0), Str_Vld(0), Str_Trig(0), Str0_Data);
|
||||
end loop;
|
||||
end process;
|
||||
|
||||
|
150
tb/psi_ms_daq/psi_ms_daq_tb_pkg.vhd
Normal file
150
tb/psi_ms_daq/psi_ms_daq_tb_pkg.vhd
Normal file
@ -0,0 +1,150 @@
|
||||
------------------------------------------------------------
|
||||
-- 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;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- Package Header
|
||||
------------------------------------------------------------
|
||||
package psi_ms_daq_tb_pkg is
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Global Stuff
|
||||
--------------------------------------------------------
|
||||
constant MemSize_c : integer := 16#10000#;
|
||||
signal Memory : t_aslv8(0 to MemSize_c-1);
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Helper Procedures
|
||||
--------------------------------------------------------
|
||||
function IntAnd( int : in integer;
|
||||
op : in integer) return integer;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- TMEM Procedures
|
||||
--------------------------------------------------------
|
||||
procedure TmemWrite32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t);
|
||||
|
||||
procedure TmemRead32( address : in integer;
|
||||
value : out integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t);
|
||||
|
||||
procedure TmemExpect32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t);
|
||||
|
||||
procedure TmemWriteAndRead32( address : in integer;
|
||||
value : in integer;
|
||||
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_pkg is
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Helper Procedures
|
||||
--------------------------------------------------------
|
||||
function IntAnd( int : in integer;
|
||||
op : in integer) return integer is
|
||||
variable intu, opu : unsigned(31 downto 0);
|
||||
begin
|
||||
intu := to_unsigned(int, 32);
|
||||
opu := to_unsigned(op, 32);
|
||||
return to_integer(intu and opu);
|
||||
end function;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- TMEM Procedures
|
||||
--------------------------------------------------------
|
||||
procedure TmemWrite32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
wait until rising_edge(clk);
|
||||
rqst.ADD <= std_logic_vector(to_unsigned(address, 24)) and X"FFFFF8";
|
||||
rqst.ENA <= '1';
|
||||
rqst.DATW <= (others => '0');
|
||||
rqst.WE <= (others => '0');
|
||||
if address mod 8 = 0 then
|
||||
rqst.DATW(31 downto 0) <= std_logic_vector(to_unsigned(value, 32));
|
||||
rqst.WE(3 downto 0) <= (others => '1');
|
||||
else
|
||||
rqst.DATW(63 downto 32) <= std_logic_vector(to_unsigned(value, 32));
|
||||
rqst.WE(7 downto 4) <= (others => '1');
|
||||
end if;
|
||||
wait until rising_edge(clk);
|
||||
rqst.ENA <= '0';
|
||||
rqst.WE <= (others => '0');
|
||||
end procedure;
|
||||
|
||||
procedure TmemRead32( address : in integer;
|
||||
value : out integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
wait until rising_edge(clk);
|
||||
rqst.ADD <= std_logic_vector(to_unsigned(address, 24)) and X"FFFFF8";
|
||||
rqst.ENA <= '1';
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
if address mod 8 = 0 then
|
||||
value := to_integer(unsigned(rsp.DATR(31 downto 0)));
|
||||
else
|
||||
value := to_integer(unsigned(rsp.DATR(63 downto 32)));
|
||||
end if;
|
||||
rqst.ENA <= '0';
|
||||
end procedure;
|
||||
|
||||
procedure TmemExpect32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
variable readVal : integer;
|
||||
begin
|
||||
TmemRead32(address, readVal, clk, rqst, rsp);
|
||||
IntCompare(value, readVal, "Unexpected value at address 0x" & to_hstring(to_unsigned(address, 32)));
|
||||
end procedure;
|
||||
|
||||
|
||||
procedure TmemWriteAndRead32( address : in integer;
|
||||
value : in integer;
|
||||
signal clk : in std_logic;
|
||||
signal rqst : out TmemRqst_t;
|
||||
signal rsp : in TmemResp_t) is
|
||||
begin
|
||||
TmemWrite32(address, value, clk, rqst, rsp);
|
||||
TmemExpect32(address, value, clk, rqst, rsp);
|
||||
end procedure;
|
||||
|
||||
end;
|
197
tb/psi_ms_daq/psi_ms_daq_tb_str0_pkg.vhd
Normal file
197
tb/psi_ms_daq/psi_ms_daq_tb_str0_pkg.vhd
Normal file
@ -0,0 +1,197 @@
|
||||
------------------------------------------------------------
|
||||
-- Description
|
||||
------------------------------------------------------------
|
||||
-- Stream 0 works in ringbuffer mode (without overwrite). It
|
||||
-- produces 8-bit data (modulo counter). IRQs are located at samples
|
||||
-- containing data 30, 60 and 90. IRQs are suppressed until 15 us after
|
||||
-- simulation to see if IRQ enable works correctly.
|
||||
-- The IRQ handler also sets the window sample counter to zero to ensure
|
||||
-- more data can be recorded after the IRQ.
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 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_str0_pkg is
|
||||
|
||||
-- Memory
|
||||
alias Memory0 : t_aslv8(0 to 16#0FFF#) is Memory(16#1000# to 16#1FFF#);
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Persistent State
|
||||
--------------------------------------------------------
|
||||
shared variable Str0NextWin : integer := 0;
|
||||
shared variable Str0WinCheck : integer := 0;
|
||||
shared variable Str0LastTs : integer;
|
||||
shared variable Str0IrqOn : boolean := false;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Data Generation
|
||||
--------------------------------------------------------
|
||||
procedure Str0Sample( signal clk : in std_logic;
|
||||
signal vld : out std_logic;
|
||||
signal trig : out std_logic;
|
||||
signal data : out std_logic_vector(7 downto 0));
|
||||
|
||||
--------------------------------------------------------
|
||||
-- IRQ Handler
|
||||
--------------------------------------------------------
|
||||
procedure Str0Handler( 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_str0_pkg is
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Data Generation
|
||||
--------------------------------------------------------
|
||||
procedure Str0Sample( signal clk : in std_logic;
|
||||
signal vld : out std_logic;
|
||||
signal trig : out std_logic;
|
||||
signal data : out std_logic_vector(7 downto 0)) is
|
||||
begin
|
||||
vld <= '1';
|
||||
if (now > 15 us) and (to_integer(unsigned(data)) = 0) then
|
||||
Str0IrqOn := true;
|
||||
end if;
|
||||
case to_integer(unsigned(data)) is
|
||||
when 30 | 60 | 90 =>
|
||||
if Str0IrqOn then
|
||||
trig <= '1';
|
||||
end if;
|
||||
when others => null;
|
||||
end case;
|
||||
wait until rising_edge(clk);
|
||||
vld <= '0';
|
||||
trig <= '0';
|
||||
data <= std_logic_vector(unsigned(data)+1);
|
||||
wait until rising_edge(clk);
|
||||
end procedure;
|
||||
|
||||
--------------------------------------------------------
|
||||
-- IRQ Handler
|
||||
--------------------------------------------------------
|
||||
procedure Str0Handler( 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 winstart, winend : integer;
|
||||
variable winlast : integer;
|
||||
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("");
|
||||
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;
|
||||
case Str0WinCheck is
|
||||
when 0 =>
|
||||
-- Windows full because dat received for quite some time
|
||||
IntCompare(100, wincnt, "WINCNT wrong");
|
||||
-- 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 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");
|
||||
print(to_string(tslo) & " " & to_string(Str0LastTs));
|
||||
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(16#0014#, v, clk, rqst, rsp);
|
||||
v := IntAnd(v, 16#0FE#);
|
||||
TmemWrite32(16#0014#, v, clk, rqst, rsp);
|
||||
TmemRead32(16#0020#, v, clk, rqst, rsp);
|
||||
v := IntAnd(v, 16#0FE#);
|
||||
TmemWrite32(16#0020#, 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;
|
||||
print("");
|
||||
Str0LastTs := tslo;
|
||||
Str0NextWin := (Str0NextWin + 1) mod 3;
|
||||
Str0WinCheck := Str0WinCheck + 1;
|
||||
end loop;
|
||||
|
||||
|
||||
end procedure;
|
||||
|
||||
end;
|
Reference in New Issue
Block a user