diff --git a/libraries/base/dp/src/vhdl/dp_packet_merge.vhd b/libraries/base/dp/src/vhdl/dp_packet_merge.vhd index 77a3a2dd6b0e5c090398d6099a6c720ca92a97e1..986bcb5c21ebdde4b60dd928b5de99bcfb4e6f90 100644 --- a/libraries/base/dp/src/vhdl/dp_packet_merge.vhd +++ b/libraries/base/dp/src/vhdl/dp_packet_merge.vhd @@ -201,6 +201,7 @@ ARCHITECTURE rtl OF dp_packet_merge IS pkt_cnt : NATURAL RANGE 0 TO g_nof_pkt+1; align_cnt : NATURAL RANGE 0 TO g_nof_pkt+1; busy : STD_LOGIC; + sync : STD_LOGIC; src_out : t_dp_sosi; END RECORD; @@ -324,9 +325,17 @@ BEGIN IF snk_in.sop = '1' THEN IF r.pkt_cnt = 0 THEN v.src_out.sop := '1'; - v.src_out.sync := snk_in.sync; -- only preserve sync when sync interval and nof_pkt interval are aligned, else sync gets lost but could still be recovered from BSN + v.src_out.sync := r.sync; -- use sync from previous merged packet if it occurred on pkt_cnt /= 0. v.src_out.bsn := snk_in.bsn; -- use BSN of first packet for merged packet v.src_out.channel := snk_in.channel; -- use channel of first packet for merged packet + v.sync := '0'; -- reset captured sync. + IF snk_in.sync = '1' THEN + v.src_out.sync := '1'; -- set out sync to '1' if this first block contains the sync. + END IF; + ELSE + IF snk_in.sync = '1' THEN + v.sync := '1'; -- Capture sync if it occurs on a pkt_cnt /= 0 so we can use it in the next merged packet + END IF; END IF; END IF; @@ -359,6 +368,7 @@ BEGIN v.pkt_cnt := 0; v.align_cnt := 0; v.busy := '0'; + v.sync := '0'; v.src_out := c_dp_sosi_rst; END IF; diff --git a/libraries/base/dp/tb/vhdl/tb_dp_packet_merge.vhd b/libraries/base/dp/tb/vhdl/tb_dp_packet_merge.vhd index f37dab7d34f6a13a485ea7a1fd91c31110fd13ed..d3821177509f80c9ee2e0d4134f6eda890c7907e 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_packet_merge.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_packet_merge.vhd @@ -238,9 +238,6 @@ BEGIN proc_dp_verify_data("verify_snk_in.bsn", c_rl, c_unsigned_0, TO_UNSIGNED(c_verify_data_gap,32), clk, verify_en_sop, verify_snk_out.ready, verify_snk_in.sop, verify_snk_in.bsn, prev_verify_snk_in.bsn); proc_dp_verify_data("verify_snk_in.channel", c_rl, c_unsigned_0, TO_UNSIGNED(c_verify_data_gap,32), clk, verify_en_sop, verify_snk_out.ready, verify_snk_in.sop, verify_snk_in.channel, prev_verify_snk_in.channel); - -- Verify that the output sync occurs when expected - proc_dp_verify_sync(c_sync_period, c_sync_offset, clk, verify_en_sop, verify_snk_in.sync, verify_snk_in.sop, verify_snk_in.bsn); - -- Verify output packet ctrl proc_dp_verify_sop_and_eop(clk, verify_snk_in.valid, verify_snk_in.sop, verify_snk_in.eop, verify_hold_sop);