From d81b2cd17636aae11fb20763b58e389bc3712596 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Thu, 6 Oct 2022 12:29:13 +0200
Subject: [PATCH] Register ref_sync to ease timing closure for ref_sync fanout
 to (many) dp_bsn_monitor_v2 instances.

---
 .../base/dp/src/vhdl/dp_bsn_monitor_v2.vhd    | 20 ++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/libraries/base/dp/src/vhdl/dp_bsn_monitor_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_monitor_v2.vhd
index 452e97f76a..b45e247c30 100644
--- a/libraries/base/dp/src/vhdl/dp_bsn_monitor_v2.vhd
+++ b/libraries/base/dp/src/vhdl/dp_bsn_monitor_v2.vhd
@@ -104,6 +104,7 @@ ARCHITECTURE rtl OF dp_bsn_monitor_v2 IS
   SIGNAL nxt_valid                   : STD_LOGIC;
   SIGNAL sop                         : STD_LOGIC;
   SIGNAL nxt_sop                     : STD_LOGIC;
+  SIGNAL sync_reg                    : STD_LOGIC;
   SIGNAL sync                        : STD_LOGIC;
   SIGNAL nxt_sync                    : STD_LOGIC;
   SIGNAL bsn                         : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0);
@@ -162,20 +163,19 @@ BEGIN
   nxt_mon_nof_sop      <= nof_sop      WHEN sync='1' ELSE i_mon_nof_sop;
   nxt_mon_nof_err      <= nof_err      WHEN sync='1' ELSE i_mon_nof_err;
   nxt_mon_nof_valid    <= nof_valid    WHEN sync='1' ELSE i_mon_nof_valid;
-  nxt_mon_latency      <= latency      WHEN sync='1' ELSE i_mon_latency;
+  nxt_mon_latency      <= latency      WHEN sync_reg='1' ELSE i_mon_latency;  -- use sync_reg due to ref_sync_reg
 
   nof_sop   <= cnt_sop;   
   nof_err   <= cnt_err;
   nof_valid <= cnt_valid; 
   latency   <= cnt_latency;
 
-  -- Register ref_sync to ease timing closure for ref_sync fanout to (many) dp_bsn_monitor_v2 instances
-  -- TODO if needed:
-  --   Registering ref_sync assumes ref_sunc occurs before in_sosi.sync. When ref_sync = in_sosi.sync,
-  --   then also the impact of registering ref_sync with respect to in_sosi and in_siso needs to be
-  --   verified.
-  --ref_sync_reg <= ref_sync WHEN rising_edge(clk);
-  ref_sync_reg <= ref_sync;
+  -- Register ref_sync to ease timing closure for ref_sync fanout to (many) dp_bsn_monitor_v2
+  -- instances. The ref_sync_reg is used to restart cnt_latency. Therefore the sync_reg
+  -- (instead of sync) is needed to capture latency (= cnt_latency) not too early, so capture
+  -- cnt_latency at or after the cnt_latency has restarted.
+  sync_reg <= sync WHEN rising_edge(clk);
+  ref_sync_reg <= ref_sync WHEN rising_edge(clk);
 
   u_sync_timeout_cnt : ENTITY common_lib.common_counter
   GENERIC MAP (
@@ -216,6 +216,7 @@ BEGIN
       sop                       <= '0';
       err                       <= '0';
       sync                      <= '0';
+      sync_reg                  <= '0';
       bsn                       <= (OTHERS=>'0');
       -- output
       mon_evt                   <= '0';
@@ -236,7 +237,8 @@ BEGIN
       sop                       <= nxt_sop;
       err                       <= nxt_err;
       sync                      <= nxt_sync;
-      bsn                       <= nxt_bsn;  
+      sync_reg                  <= sync;
+      bsn                       <= nxt_bsn;
       -- output
       mon_evt                   <= nxt_mon_evt;
       sync_timeout              <= nxt_sync_timeout;
-- 
GitLab