From 8972d0e107b5f1188cee33e9c665b3b2c1f1ce2a Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Fri, 8 Apr 2022 15:48:55 +0200
Subject: [PATCH] added sync retention to dp_packet_merge

---
 libraries/base/dp/src/vhdl/dp_packet_merge.vhd   | 12 +++++++++++-
 libraries/base/dp/tb/vhdl/tb_dp_packet_merge.vhd |  3 ---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/libraries/base/dp/src/vhdl/dp_packet_merge.vhd b/libraries/base/dp/src/vhdl/dp_packet_merge.vhd
index 77a3a2dd6b..986bcb5c21 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 f37dab7d34..d382117750 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);
   
-- 
GitLab