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