DEVEL: Implemented handling for starting a command when input is empty

This commit is contained in:
Oliver Bruendler
2018-08-29 13:41:27 +02:00
parent 62c654bc1e
commit 6ef2687cf4
4 changed files with 135 additions and 13 deletions

View File

@ -104,6 +104,7 @@ architecture rtl of psi_ms_daq_daq_dma is
Trigger : std_logic;
DataSft : std_logic_vector(127 downto 0);
NextDone : std_logic;
DataWritten : std_logic;
end record;
signal r, r_next : two_process_r;
@ -161,13 +162,14 @@ begin
v.FirstDma(r.HndlStream) := '0';
v.State := Transfer_s;
v.NextDone := '0';
v.DataWritten := '0';
when Transfer_s =>
-- TF done because of maximum size reached
if r.WrBytes >= r.HndlMaxSize then
v.State := Done_s;
elsif DatFifo_AlmFull = '0' then
if r.NextDone = '0' then
if r.NextDone = '0' and Inp_Vld(r.HndlStream) = '1' then
v.RdBytes := r.RdBytes + unsigned(Inp_Data(r.HndlStream).Bytes);
end if;
v.WrBytes := r.WrBytes + 8;
@ -185,13 +187,16 @@ begin
end if;
v.Trigger := Inp_Data(r.HndlStream).IsTrig;
end if;
if r.NextDone = '1' then
if r.NextDone = '1' or Inp_Vld(r.HndlStream) = '0' then
v.State := Done_s;
end if;
-- Data handling
v.DataSft(63 downto 0) := r.DataSft(127 downto 64);
v.DataSft(8*to_integer(r.HndlSft)+63 downto 8*to_integer(r.HndlSft)) := Inp_Data(r.HndlStream).Data;
v.Mem_DataVld := '1';
if Inp_Vld(r.HndlStream) = '1' or r.HndlSft /= 0 then
v.Mem_DataVld := '1';
v.DataWritten := '1';
end if;
end if;
when Done_s =>
@ -203,13 +208,15 @@ begin
v.RemWrBytes := (others => '0');
end if;
v.RemData := v.DataSft(8*RemSft_v+63 downto 8*RemSft_v);
v.State := Cmd_s;
v.Mem_CmdVld := '1';
v.State := Cmd_s;
if r.DataWritten = '1' then
v.Mem_CmdVld := '1';
end if;
v.RemWen := '1';
v.RemAddr := r.StreamStdlv;
when Cmd_s =>
if Mem_CmdRdy = '1' then
if Mem_CmdRdy = '1' or r.Mem_CmdVld = '0' then
v.State := Idle_s;
v.Mem_CmdVld := '0';
v.RspFifo_Vld := '1';

View File

@ -96,8 +96,6 @@ package body psi_ms_daq_daq_dma_tb_case_aligned is
CheckResp(2, 32, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
WaitAllProc(Clk);
-- Empty Timeout Frame
print(">> TODO: Empty Timeout Frame");
end procedure;
procedure input (

View File

@ -56,6 +56,8 @@ package psi_ms_daq_daq_dma_tb_case_no_data_read is
signal Mem_DatRdy : inout std_logic;
constant Generics_c : Generics_t);
shared variable SubCase : integer := 0;
end package;
------------------------------------------------------------
@ -72,7 +74,51 @@ package body psi_ms_daq_daq_dma_tb_case_no_data_read is
signal DaqSm_Resp_Rdy : inout std_logic;
constant Generics_c : Generics_t) is
begin
assert false report "Case NO_DATA_READ Procedure CONTROL: No Content added yet!" severity warning;
InitCase(Clk, Rst);
print(">> -- No data read --");
-- No Data on first request
print(">> No Data on first request");
InitCase(Clk, Rst);
InitSubCase(0);
ApplyCmd(2, 16#01230000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 0, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
SubCase := 1;
ApplyCmd(2, 16#01231000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 30, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
WaitAllProc(Clk);
SubCase := 0;
-- No Data on second request
wait for 1 us;
print(">> No Data on second request");
InitCase(Clk, Rst);
InitSubCase(1);
ApplyCmd(2, 16#01230000#, 32, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 32, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
ApplyCmd(2, 16#01231000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 0, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
SubCase := 1;
ApplyCmd(2, 16#01232000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 30, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
WaitAllProc(Clk);
SubCase := 0;
-- No Data with leftover bytes
wait for 1 us;
print(">> No Data with leftover bytes");
InitCase(Clk, Rst);
InitSubCase(2);
ApplyCmd(2, 16#01230000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 30, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
ApplyCmd(2, 16#01231000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 2, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
SubCase := 1;
ApplyCmd(2, 16#01232000#, 30, DaqSm_Cmd, DaqSm_Cmd_Vld, Clk);
CheckResp(2, 30, NoEnd_s, DaqSm_Resp, DaqSm_Resp_Vld, DaqSm_Resp_Rdy, Clk);
WaitAllProc(Clk);
SubCase := 0;
end procedure;
procedure input (
@ -82,7 +128,31 @@ package body psi_ms_daq_daq_dma_tb_case_no_data_read is
signal Inp_Data : inout Input2Daq_Data_a;
constant Generics_c : Generics_t) is
begin
assert false report "Case NO_DATA_READ Procedure INPUT: No Content added yet!" severity warning;
-- No Data on first request
WaitForCase(0, Clk);
while SubCase < 1 loop
wait until rising_edge(Clk);
end loop;
ApplyData(2, 30, NoEnd_s, Inp_Vld, Inp_Rdy, Inp_Data, Clk);
ProcDone_V(0) := '1';
-- No Data on second request
WaitForCase(1, Clk);
ApplyData(2, 32, NoEnd_s, Inp_Vld, Inp_Rdy, Inp_Data, Clk);
while SubCase < 1 loop
wait until rising_edge(Clk);
end loop;
ApplyData(2, 30, NoEnd_s, Inp_Vld, Inp_Rdy, Inp_Data, Clk, 32);
ProcDone_V(0) := '1';
-- No Data with leftover bytes
WaitForCase(2, Clk);
ApplyData(2, 32, NoEnd_s, Inp_Vld, Inp_Rdy, Inp_Data, Clk);
while SubCase < 1 loop
wait until rising_edge(Clk);
end loop;
ApplyData(2, 30, NoEnd_s, Inp_Vld, Inp_Rdy, Inp_Data, Clk, 32);
ProcDone_V(0) := '1';
end procedure;
procedure mem_cmd (
@ -93,7 +163,31 @@ package body psi_ms_daq_daq_dma_tb_case_no_data_read is
signal Mem_CmdRdy : inout std_logic;
constant Generics_c : Generics_t) is
begin
assert false report "Case NO_DATA_READ Procedure MEM_CMD: No Content added yet!" severity warning;
-- No Data on first request
WaitForCase(0, Clk);
while SubCase < 1 loop
StdlCompare(0, Mem_CmdVld, "Unexpected memory command");
wait until rising_edge(Clk);
end loop;
CheckMemCmd( 16#01231000#, 30, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
ProcDone_V(1) := '1';
-- No Data on second request
WaitForCase(1, Clk);
CheckMemCmd( 16#01230000#, 32, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
while SubCase < 1 loop
StdlCompare(0, Mem_CmdVld, "Unexpected memory command");
wait until rising_edge(Clk);
end loop;
CheckMemCmd( 16#01232000#, 30, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
ProcDone_V(1) := '1';
-- No Data with leftover bytes
WaitForCase(2, Clk);
CheckMemCmd( 16#01230000#, 30, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
CheckMemCmd( 16#01231000#, 2, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
CheckMemCmd( 16#01232000#, 30, 0, Mem_CmdAddr, Mem_CmdSize, Mem_CmdVld, Mem_CmdRdy, Clk);
ProcDone_V(1) := '1';
end procedure;
procedure mem_dat (
@ -103,7 +197,31 @@ package body psi_ms_daq_daq_dma_tb_case_no_data_read is
signal Mem_DatRdy : inout std_logic;
constant Generics_c : Generics_t) is
begin
assert false report "Case NO_DATA_READ Procedure MEM_DAT: No Content added yet!" severity warning;
-- No Data on first request
WaitForCase(0, Clk);
while SubCase < 1 loop
wait until rising_edge(Clk);
StdlCompare(0, Mem_DatVld, "Unexpected memory data");
end loop;
CheckMemData(30, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 0, "1.1");
ProcDone_V(2) := '1';
-- No Data on second request
WaitForCase(1, Clk);
CheckMemData(32, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 0, "1.0");
while SubCase < 1 loop
wait until rising_edge(Clk);
StdlCompare(0, Mem_DatVld, "Unexpected memory data");
end loop;
CheckMemData(30, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 32, "1.2");
ProcDone_V(2) := '1';
-- No Data with leftover bytes
WaitForCase(2, Clk);
CheckMemData(30, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 0, "1.0");
CheckMemData(2, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 30, "1.1");
CheckMemData(30, 0, Mem_DatData, Mem_DatVld, Mem_DatRdy, Clk, 30+2, "1.2");
ProcDone_V(2) := '1';
end procedure;
end;

View File

@ -76,7 +76,6 @@ package body psi_ms_daq_daq_dma_tb_case_unaligned is
print(">> -- Unaligned --");
print("TODO: Handle empty timeout sample");
print("TODO: Very short TFs (no read from FIFO)");
print("TODO: Handle end of transfer because no more data");
-- End Unaligned