From 73b66c59c2c63fa3a4e141b115adbb2044a74038 Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Mon, 21 Jun 2021 16:28:18 +0200
Subject: [PATCH] processed review comments; Improved dp_sync_recover restart
 process.

---
 .../vhdl/node_sdp_adc_input_and_timing.vhd    |  6 +-
 .../sdp/src/vhdl/node_sdp_filterbank.vhd      | 20 +++----
 .../base/dp/src/vhdl/dp_bsn_source_v2.vhd     | 12 ++--
 .../base/dp/src/vhdl/dp_sync_recover.vhd      | 57 +++++++++++++------
 .../base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd |  4 +-
 .../base/dp/tb/vhdl/tb_dp_sync_recover.vhd    | 56 ++++++++++--------
 .../base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd | 12 +++-
 7 files changed, 100 insertions(+), 67 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
index 92adf98987..ab3d08b91f 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
@@ -125,7 +125,7 @@ ARCHITECTURE str OF node_sdp_adc_input_and_timing IS
   SIGNAL rx_sysref                  : STD_LOGIC; 
 
   SIGNAL arst                       : STD_LOGIC;
-  SIGNAL i_dp_bsn_source_restart    : STD_LOGIC;
+  SIGNAL rx_bsn_source_restart      : STD_LOGIC;
 
   -- Sosis and sosi arrays
   SIGNAL rx_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);         
@@ -258,7 +258,7 @@ BEGIN
     -- Streaming clock domain
     bs_sosi           => bs_sosi,
 
-    restart           => i_dp_bsn_source_restart
+    bs_restart        => rx_bsn_source_restart
   );
 
   u_bsn_trigger_wg : ENTITY dp_lib.mms_dp_bsn_scheduler
@@ -478,7 +478,7 @@ BEGIN
   PORT MAP (
     rst     => arst,
     wr_clk  => rx_clk,
-    wr_dat(0)  => i_dp_bsn_source_restart,
+    wr_dat(0)  => rx_bsn_source_restart,
     wr_req  => bs_sosi.valid,
     rd_clk  => dp_clk,
     rd_dat(0)  => dp_bsn_source_restart,
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
index 7085d70265..69356104b2 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
@@ -123,9 +123,9 @@ ARCHITECTURE str OF node_sdp_filterbank IS
   SIGNAL dp_selector_out_sosi_arr       : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
   SIGNAL scope_sosi_arr                 : t_dp_sosi_integer_arr(c_sdp_S_pn-1 DOWNTO 0);
   
-  SIGNAL selector_en             : STD_LOGIC;
-  SIGNAL subband_calibrated_flag : STD_LOGIC;
-  SIGNAL i_dp_bsn_source_restart : STD_LOGIC;
+  SIGNAL selector_en                : STD_LOGIC;
+  SIGNAL subband_calibrated_flag    : STD_LOGIC;
+  SIGNAL dp_bsn_source_restart_pipe : STD_LOGIC;
 BEGIN
   ---------------------------------------------------------------
   -- SPECTRAL INVERSION 
@@ -162,18 +162,16 @@ BEGIN
     END LOOP;
   END PROCESS;
 
-  -- pipeline bsn restart signal
-  u_common_pipeline : ENTITY common_lib.common_pipeline
+  -- pipeline bsn restart signal to keep dp_bsn_source_restart aligned with si_sosi_arr
+  u_common_pipeline_sl : ENTITY common_lib.common_pipeline_sl
   GENERIC MAP (
-    g_pipeline  => c_si_pipeline,
-    g_in_dat_w  => 1,
-    g_out_dat_w => 1
+    g_pipeline  => c_si_pipeline
   )
   PORT MAP (
     rst        => dp_rst,
     clk        => dp_clk,
-    in_dat(0)  => dp_bsn_source_restart,
-    out_dat(0) => i_dp_bsn_source_restart
+    in_dat     => dp_bsn_source_restart,
+    out_dat    => dp_bsn_source_restart_pipe
   ); 
 
   -- PFB 
@@ -198,7 +196,7 @@ BEGIN
     fil_sosi_arr       => wpfb_unit_fil_sosi_arr, 
     out_sosi_arr       => wpfb_unit_out_sosi_arr,
  
-    dp_bsn_source_restart => i_dp_bsn_source_restart
+    dp_bsn_source_restart => dp_bsn_source_restart_pipe
   );
   
   -- Output PFB streams
diff --git a/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
index 3a5c02ea9e..66598b4d33 100644
--- a/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
@@ -58,7 +58,7 @@ ENTITY dp_bsn_source_v2 IS
     dp_on_pps               : IN  STD_LOGIC;
 
     dp_on_status            : OUT STD_LOGIC;
-    restart                 : OUT STD_LOGIC;
+    bs_restart              : OUT STD_LOGIC;
  
     nof_clk_per_sync        : IN  STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := TO_UVEC(g_nof_clk_per_sync, c_word_w);
     bsn_init                : IN  STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0) := (OTHERS=>'0');
@@ -103,7 +103,7 @@ ARCHITECTURE rtl OF dp_bsn_source_v2 IS
  
   SIGNAL i_dp_on_status     : STD_LOGIC;
   SIGNAL nxt_dp_on_status   : STD_LOGIC;
-  SIGNAL nxt_restart        : STD_LOGIC;
+  SIGNAL nxt_bs_restart     : STD_LOGIC;
 
   SIGNAL nxt_bsn_time_offset_cnt : STD_LOGIC_VECTOR(g_bsn_time_offset_w-1 DOWNTO 0);
   SIGNAL bsn_time_offset_cnt     : STD_LOGIC_VECTOR(g_bsn_time_offset_w-1 DOWNTO 0);
@@ -134,7 +134,7 @@ BEGIN
     nxt_clk_cnt                 <= INCR_UVEC(clk_cnt, 1);
     nxt_sync                    <= sync;
     nxt_dp_on_status            <= i_dp_on_status;
-    nxt_restart                 <= '0';
+    nxt_bs_restart              <= '0';
     nxt_bsn_time_offset_cnt     <= bsn_time_offset_cnt;
     nxt_current_bsn_time_offset <= bsn_time_offset;
 
@@ -191,7 +191,7 @@ BEGIN
           nxt_sync <= '0';
         END IF;
         IF i_dp_on_status = '0' THEN -- transition from 0 to 1 is a (re)start
-          nxt_restart <= '1';
+          nxt_bs_restart <= '1'; -- bs_restart indicates a restart as a pulse on the sop (and sync if dp_on_pps is used).
         END IF;
 
       WHEN s_dp_on =>
@@ -227,7 +227,7 @@ BEGIN
       sync           <= '0'; 
       block_size_cnt <= (OTHERS=>'0');
       i_dp_on_status <= '0';
-      restart        <= '0';
+      bs_restart     <= '0';
       bsn_time_offset_cnt <= (OTHERS=>'0');
     ELSIF rising_edge(clk) THEN
       prev_state     <= state;
@@ -237,7 +237,7 @@ BEGIN
       sync           <= nxt_sync;
       block_size_cnt <= nxt_block_size_cnt;
       i_dp_on_status <= nxt_dp_on_status;
-      restart        <= nxt_restart;
+      bs_restart     <= nxt_bs_restart;
       bsn_time_offset_cnt <= nxt_bsn_time_offset_cnt;
       i_current_bsn_time_offset <= nxt_current_bsn_time_offset;
     END IF;
diff --git a/libraries/base/dp/src/vhdl/dp_sync_recover.vhd b/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
index 6aa801b3e9..5c8b24ce8b 100644
--- a/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
+++ b/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
@@ -25,10 +25,13 @@
 --  . A data counter is used to count the valids from the input "val" and compare to g_nof_data_per_block to generate sop/eop.
 --  . A block counter is used generate the BSN 
 --  . The BSN at sync of in_sosi is captured to determine when to generate the sync at the output.
---  . out_sosi.valid is directly connected to val.
+--  . IN val is used to indicate when to start outputting the control signals. val is also used for out_sosi.valid, these are connected as wires, so no latency.
+--  . IN restart is used to restart the counters. On the restart pulse the in_sosi.bsn is used as the initial value for the bsn counter. 
 -- Remarks:
 --  . The val input signal should be connected to the desired valid of the output. It determines when 
---    the first block will start.
+--    the first block will start after a (re)start.
+--  . It is assumed that the restart pulse is synchornous with in_sosi.sop (if it would have a sop)
+--  . IN val should have at least a latency of 1 compared to in_sosi.
 -------------------------------------------------------------------------------
 
 LIBRARY IEEE, common_lib;
@@ -49,7 +52,7 @@ ENTITY dp_sync_recover IS
     dp_clk     : IN  STD_LOGIC;
     
     in_sosi    : IN  t_dp_sosi := c_dp_sosi_rst;
-    val        : IN  STD_LOGIC; -- valid at the output
+    val        : IN  STD_LOGIC; -- desired valid of the output
     restart    : IN  STD_LOGIC := '0'; -- pulse to restart bsn counter
     -- Streaming source
     out_sosi   : OUT t_dp_sosi
@@ -60,13 +63,17 @@ END dp_sync_recover;
 ARCHITECTURE rtl OF dp_sync_recover IS
 
   TYPE t_reg IS RECORD  -- local registers
-    bsn_at_sync : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
-    data_cnt    : NATURAL RANGE 0 TO g_nof_data_per_block;
-    out_bsn     : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
-    out_sosi    : t_dp_sosi;
+    bsn_at_sync        : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
+    bsn_before_restart : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
+    bsn_at_restart     : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
+    restart            : STD_LOGIC;
+    started            : STD_LOGIC;
+    data_cnt           : NATURAL RANGE 0 TO g_nof_data_per_block;
+    out_bsn            : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0);
+    out_sosi           : t_dp_sosi;
   END RECORD;
 
-  CONSTANT c_reg_rst  : t_reg := ( (OTHERS => '0'), 0, (OTHERS => '0'), c_dp_sosi_rst);  
+  CONSTANT c_reg_rst  : t_reg := ( (OTHERS => '0'), (OTHERS => '0'), (OTHERS => '0'), '0', '0', 0, (OTHERS => '0'), c_dp_sosi_rst);  
 
   -- Define the local registers in t_reg record
   SIGNAL r         : t_reg;
@@ -93,31 +100,47 @@ BEGIN
     v.out_sosi.valid := val;
     v.out_sosi.bsn   := r.out_sosi.bsn;
 
-    IF restart = '1' THEN -- set initial BSN
-      v.out_bsn  := in_sosi.bsn;
-      v.data_cnt := c_reg_rst.data_cnt;
+    IF r.restart = '0' AND restart = '0' THEN -- keep track of last bsn before restart
+      v.bsn_before_restart := in_sosi.bsn;
     END IF;
 
-    IF in_sosi.sync = '1' THEN
+    IF in_sosi.sync = '1' THEN -- capture bsn at sync
       v.bsn_at_sync  := in_sosi.bsn; 
     END IF;
 
     IF val = '1' THEN
       v.data_cnt := r.data_cnt + 1;
-      IF r.data_cnt = 0 THEN
+      IF r.data_cnt = 0 THEN -- generate sop + bsn
         v.out_sosi.sop := '1';
-        v.out_bsn := STD_LOGIC_VECTOR(UNSIGNED(r.out_bsn) + 1);
+        v.out_bsn := STD_LOGIC_VECTOR(UNSIGNED(r.out_bsn) + 1); -- increase block counter
         v.out_sosi.bsn := r.out_bsn;
-        IF r.out_bsn = r.bsn_at_sync THEN
+        IF r.out_bsn = r.bsn_at_sync THEN -- generate sync pulse
           v.out_sosi.sync := '1';
         END IF;
       END IF;
-      IF r.data_cnt = g_nof_data_per_block-1 THEN
+      IF r.data_cnt = g_nof_data_per_block-1 THEN --reset data counter and generate eop.
         v.data_cnt := 0;
         v.out_sosi.eop := '1';
       END IF;
     END IF;
- 
+
+    -- overwrite v.out_bsn if a restart has occurd.
+    IF restart = '1' THEN -- Capture BSN at restart
+      v.bsn_at_restart  := in_sosi.bsn; -- initial bsn value
+      v.restart := '1';
+      IF r.started = '0' OR r.out_sosi.bsn = r.bsn_before_restart THEN -- if restarted for the first time or if the restart should happen at the current bsn use the in_sosi.bsn immidiatly.
+        v.started := '1';
+        v.restart := '0'; 
+        v.out_bsn := in_sosi.bsn;
+      END IF;
+    END IF;
+
+    -- If the latency is larger than one block, it is needed wait with the restart until the last block has arrived. 
+    IF r.restart = '1' AND r.out_sosi.bsn = r.bsn_before_restart THEN -- set bsn to initial value after restart
+      v.out_bsn := r.bsn_at_restart;
+      v.restart := '0';
+    END IF;
+
     nxt_r <= v;
   END PROCESS;  
 
diff --git a/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
index e79af9f0ae..bc82cda1f4 100644
--- a/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
@@ -52,7 +52,7 @@ ENTITY mms_dp_bsn_source_v2 IS
     -- Streaming clock domain
     bs_sosi           : OUT t_dp_sosi;
 
-    restart           : OUT STD_LOGIC  -- pulse to indicate if the bsn_source has restarted
+    bs_restart           : OUT STD_LOGIC  -- pulse to indicate if the bsn_source has restarted
   );
 END mms_dp_bsn_source_v2;
 
@@ -117,7 +117,7 @@ BEGIN
     dp_on                   => dp_on,
     dp_on_pps               => dp_on_pps,
     dp_on_status            => dp_on_status,
-    restart                 => restart,
+    bs_restart              => bs_restart,
     bsn_init                => bsn_init,
     nof_clk_per_sync        => nof_clk_per_sync,
     bsn_time_offset         => bsn_time_offset,
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd b/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd
index 59dc24775b..3df2c6b6a0 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd
@@ -24,7 +24,8 @@
 -- Description: The tb verifies:
 --  . data valid gaps between blocks
 --  . data valid gaps within blocks
---  . output sop, eop, valid, bsn and sync 
+--  . output sop, eop, valid, bsn and sync
+--  . restarts of the dut using IN restart of the dut
 -- Usage:
 -- > as 8
 -- > run -all
@@ -51,7 +52,8 @@ ENTITY tb_dp_sync_recover IS
     g_gap_size_during_block  : NATURAL := 0;
     g_gap_size_between_block : NATURAL := 0;
     g_init_bsn               : NATURAL := 23;
-    g_rep_at_restart         : NATURAL := 3;
+    g_bsn_at_restart         : NATURAL := 40; -- the bsn index at which to restart the dut.
+    g_dut_latency            : NATURAL := 25;
     g_nof_repeat             : NATURAL := 14
   );
 END tb_dp_sync_recover;
@@ -59,8 +61,6 @@ END tb_dp_sync_recover;
 
 ARCHITECTURE tb OF tb_dp_sync_recover IS
 
-  CONSTANT c_dut_latency         : NATURAL := 5;
-  
   CONSTANT c_dp_clk_period       : TIME := 5 ns;
 
   SIGNAL tb_end                    : STD_LOGIC := '0';
@@ -73,8 +73,8 @@ ARCHITECTURE tb OF tb_dp_sync_recover IS
   SIGNAL restart                   : STD_LOGIC := '0';
 
   -- Verification
-  SIGNAL dly_valid_arr             : STD_LOGIC_VECTOR(0 TO c_dut_latency) := (OTHERS=>'0');
-  SIGNAL dly_ref_sosi_arr          : t_dp_sosi_arr(0 TO c_dut_latency) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL dly_valid_arr             : STD_LOGIC_VECTOR(0 TO g_dut_latency) := (OTHERS=>'0');
+  SIGNAL dly_ref_sosi_arr          : t_dp_sosi_arr(0 TO g_dut_latency) := (OTHERS => c_dp_sosi_rst);
   SIGNAL exp_sync                  : STD_LOGIC := '0';
   SIGNAL out_hold_sop              : STD_LOGIC := '0';
   SIGNAL exp_size                  : NATURAL := g_nof_data_per_block;
@@ -90,6 +90,7 @@ BEGIN
   ------------------------------------------------------------------------------
   
   p_stimuli : PROCESS
+   VARIABLE v_bsn : NATURAL;
   BEGIN
     proc_common_wait_until_low(dp_clk, rst);
     proc_common_wait_some_cycles(dp_clk, 5);
@@ -99,14 +100,14 @@ BEGIN
       ref_sosi.sync  <= '1';
       ref_sosi.sop   <= '1';
       ref_sosi.valid <= '1';
-      IF I = 0 OR I = g_rep_at_restart THEN
-        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn);
+      v_bsn := g_init_bsn + I * g_nof_blk_per_sync;
+      IF v_bsn = g_bsn_at_restart OR I = 0 THEN
+        v_bsn := g_init_bsn;
         restart <= '1';
-      ELSIF I > g_rep_at_restart THEN
-        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + (I - g_rep_at_restart) * g_nof_blk_per_sync);
-      ELSE
-        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + I * g_nof_blk_per_sync);
+      ELSIF v_bsn > g_bsn_at_restart THEN
+        v_bsn := 2*g_init_bsn + I * g_nof_blk_per_sync - g_bsn_at_restart;
       END IF;
+      ref_sosi.bsn   <= TO_DP_BSN(v_bsn);
       proc_common_wait_some_cycles(dp_clk, 1);
       ref_sosi.sync  <= '0';
       ref_sosi.sop   <= '0';
@@ -128,16 +129,21 @@ BEGIN
       
       -- Generate next blocks after sync
       FOR J IN 0 TO g_nof_blk_per_sync-2 LOOP
+        v_bsn := g_init_bsn + I * g_nof_blk_per_sync + J + 1;
         ref_sosi.sop   <= '1';
         ref_sosi.valid <= '1';
-        IF I >= g_rep_at_restart THEN
-          ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + (I - g_rep_at_restart) * g_nof_blk_per_sync + J + 1);
-        ELSE
-          ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + I * g_nof_blk_per_sync + J + 1);
+        IF v_bsn = g_bsn_at_restart THEN
+          v_bsn := 2*g_init_bsn + I * g_nof_blk_per_sync + J + 1 - g_bsn_at_restart;
+          restart <= '1';
+        ELSIF v_bsn > g_bsn_at_restart THEN
+          v_bsn := 2*g_init_bsn + I * g_nof_blk_per_sync + J + 1 - g_bsn_at_restart;
         END IF;
+
+        ref_sosi.bsn   <= TO_DP_BSN(v_bsn);
         proc_common_wait_some_cycles(dp_clk, 1);
         ref_sosi.sync  <= '0';
         ref_sosi.sop   <= '0';
+        restart        <= '0';
 
         -- Optionally apply valid='0' during block of data
         ref_sosi.valid <= '0';
@@ -178,7 +184,7 @@ BEGIN
 
     -- Streaming sink
     in_sosi       => ref_sosi,
-    val           => dly_ref_sosi_arr(c_dut_latency).valid,
+    val           => dly_ref_sosi_arr(g_dut_latency).valid,
     restart       => restart,
     -- Streaming source
     out_sosi      => out_sosi
@@ -190,15 +196,15 @@ BEGIN
   -- . use some general Verification means from tb_dp_pkg.vhd, dp_stream_verify.vhd
   ------------------------------------------------------------------------------
   dly_ref_sosi_arr(0)                  <= ref_sosi;
-  dly_ref_sosi_arr(1 TO c_dut_latency) <= dly_ref_sosi_arr(0 TO c_dut_latency-1) WHEN rising_edge(dp_clk);
+  dly_ref_sosi_arr(1 TO g_dut_latency) <= dly_ref_sosi_arr(0 TO g_dut_latency-1) WHEN rising_edge(dp_clk);
 
   p_exp_sync : PROCESS(dp_clk)
     VARIABLE blk_cnt : NATURAL := 0;
   BEGIN
     IF rising_edge(dp_clk) THEN
       exp_sync <= '0'; 
-      IF dly_ref_sosi_arr(c_dut_latency-1).sop = '1' THEN
-        IF dly_ref_sosi_arr(c_dut_latency-1).sync = '1' OR blk_cnt >= g_nof_blk_per_sync-1 THEN
+      IF dly_ref_sosi_arr(g_dut_latency-1).sop = '1' THEN
+        IF dly_ref_sosi_arr(g_dut_latency-1).sync = '1' OR blk_cnt >= g_nof_blk_per_sync-1 THEN
           blk_cnt := 0;
           exp_sync <= '1';
         ELSE
@@ -211,11 +217,11 @@ BEGIN
   p_verify_out_sosi : PROCESS(dp_clk)
   BEGIN
     IF rising_edge(dp_clk) THEN
-      ASSERT out_sosi.valid = dly_ref_sosi_arr(c_dut_latency).valid REPORT "Wrong out_sosi.valid" SEVERITY ERROR;
-      ASSERT out_sosi.sop   = dly_ref_sosi_arr(c_dut_latency).sop   REPORT "Wrong out_sosi.sop"   SEVERITY ERROR;
-      ASSERT out_sosi.eop   = dly_ref_sosi_arr(c_dut_latency).eop   REPORT "Wrong out_sosi.eop"   SEVERITY ERROR;
-      ASSERT out_sosi.bsn   = dly_ref_sosi_arr(c_dut_latency).bsn   REPORT "Wrong out_sosi.bsn"   SEVERITY ERROR;
-      ASSERT out_sosi.sync  = dly_ref_sosi_arr(c_dut_latency).sync  REPORT "Wrong out_sosi.sync"  SEVERITY ERROR;
+      ASSERT out_sosi.valid = dly_ref_sosi_arr(g_dut_latency).valid REPORT "Wrong out_sosi.valid" SEVERITY ERROR;
+      ASSERT out_sosi.sop   = dly_ref_sosi_arr(g_dut_latency).sop   REPORT "Wrong out_sosi.sop"   SEVERITY ERROR;
+      ASSERT out_sosi.eop   = dly_ref_sosi_arr(g_dut_latency).eop   REPORT "Wrong out_sosi.eop"   SEVERITY ERROR;
+      ASSERT out_sosi.bsn   = dly_ref_sosi_arr(g_dut_latency).bsn   REPORT "Wrong out_sosi.bsn"   SEVERITY ERROR;
+      ASSERT out_sosi.sync  = dly_ref_sosi_arr(g_dut_latency).sync  REPORT "Wrong out_sosi.sync"  SEVERITY ERROR;
     END IF;
   END PROCESS;
   
diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd
index e790f7ef80..e91f031941 100644
--- a/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd
@@ -42,10 +42,16 @@ BEGIN
 --    g_gap_size_during_block  : NATURAL := 0;
 --    g_gap_size_between_block : NATURAL := 0;
 --    g_init_bsn               : NATURAL := 23;
---    g_rep_at_restart         : NATURAL := 3;
+--    g_bsn_at_restart         : NATURAL := 40; -- the bsn index at which to restart the dut.
+--    g_dut_latency            : NATURAL := 25;
 --    g_nof_repeat             : NATURAL := 14
 
-  u_no_gaps            : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 32, 0, 0, 8, 3, 14);
-  u_gap                : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 32, 1, 3, 8, 3, 14);
+  u_no_gaps            : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 0, 0, 3, 50,     10,  14);
+  u_gap                : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 50,     10,  14);
+  u_restart_at_sync    : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 2*8+3,  10,  14);
+  u_restart_at_sync_hi : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 2*8+3,  100, 14);
+  u_restart_at_sync_lo : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 2*8+3,  1,   14);
+  u_high_latency       : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 50,     100, 14);
+  u_low_latency        : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 8, 1, 3, 3, 50,     1,   14);
   
 END tb;
-- 
GitLab