From ce1cb44f8eb7e816d45069e9714a7e46edc1c1eb Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Tue, 1 Aug 2017 11:25:57 +0000
Subject: [PATCH] Improved stable monitor for out_status(4), added
 out_status(3) and increased c_wb_sync_roundtrip_nax by 1.

---
 libraries/io/aduh/src/vhdl/lvdsh_dd_phs4.vhd | 57 +++++++++++++++++---
 1 file changed, 49 insertions(+), 8 deletions(-)

diff --git a/libraries/io/aduh/src/vhdl/lvdsh_dd_phs4.vhd b/libraries/io/aduh/src/vhdl/lvdsh_dd_phs4.vhd
index ff7b5771c1..4bf6d46cda 100644
--- a/libraries/io/aduh/src/vhdl/lvdsh_dd_phs4.vhd
+++ b/libraries/io/aduh/src/vhdl/lvdsh_dd_phs4.vhd
@@ -177,6 +177,9 @@ ARCHITECTURE str OF lvdsh_dd_phs4 IS
   CONSTANT c_wb_fifo_fill_offset    : INTEGER := 2;         -- some offset to adjust the mean fifo fill level
   CONSTANT c_wb_sync_in_latency     : NATURAL := 12;        -- estimated nof dp_clk cycles latency of wb_sync transfer in the in_clk domain based on simulation and measurement on hardware
   CONSTANT c_wb_sync_roundtrip      : NATURAL := c_wb_fifo_fill_offset+g_dp_phs_clk_period/2;  -- achieve this nof dp_clk cycles from getting wb_sync back via dp_sync
+  CONSTANT c_wb_sync_roundtrip_margin : NATURAL := 2;
+  CONSTANT c_wb_sync_roundtrip_max    : NATURAL := c_wb_sync_roundtrip+c_wb_sync_roundtrip_margin;
+  CONSTANT c_wb_sync_roundtrip_min    : NATURAL := c_wb_sync_roundtrip-c_wb_sync_roundtrip_margin;
   CONSTANT c_wb_fifo_fill_level     : NATURAL := c_wb_fifo_fill_offset+c_wb_sync_roundtrip-c_wb_sync_in_latency;  -- expected FIFO fill level on read side  (mean level +- 1 can occur),
   CONSTANT c_wb_fifo_fill_margin    : NATURAL := 2;                         -- some symmetrical FIFO filled margin >= 0, use 0 in theory, use 1 to allow some timing uncertainty in rdusedw of dual clock FIFO
   CONSTANT c_wb_fifo_fill_margin_p  : NATURAL := c_wb_fifo_fill_margin;     -- some FIFO more filled margin >= 0, use 0 or 1 to allow 8 and 9
@@ -196,6 +199,7 @@ ARCHITECTURE str OF lvdsh_dd_phs4 IS
   
   SIGNAL dbg_status_0_out_word_locked       : STD_LOGIC;
   SIGNAL dbg_status_1_out_word_stable       : STD_LOGIC;
+  SIGNAL dbg_status_3_dp_fifo_fill_stable   : STD_LOGIC;
   SIGNAL dbg_status_4_dp_phs_locked         : STD_LOGIC;
   SIGNAL dbg_status_5_wb_roundtrip_stable   : STD_LOGIC;
   SIGNAL dbg_status_6_dp_in_clk_detected    : STD_LOGIC;
@@ -287,6 +291,8 @@ ARCHITECTURE str OF lvdsh_dd_phs4 IS
   SIGNAL fifo_rd_val                 : STD_LOGIC;
   SIGNAL fifo_rd_emp                 : STD_LOGIC;
   SIGNAL fifo_rdusedw                : STD_LOGIC_VECTOR(c_fifo_size_w-1 DOWNTO 0);
+  SIGNAL dp_fifo_fill_lock           : STD_LOGIC;
+  SIGNAL dp_fifo_fill_stable         : STD_LOGIC;
   
   SIGNAL dp_phs_clk_en_vec_evt       : STD_LOGIC;  
   SIGNAL dp_phs_timeout_cnt          : STD_LOGIC_VECTOR(c_dp_dd_phs_timeout_w-1 DOWNTO 0);
@@ -294,6 +300,7 @@ ARCHITECTURE str OF lvdsh_dd_phs4 IS
   SIGNAL dp_phs_timeout              : STD_LOGIC;
   SIGNAL dp_phs_val                  : STD_LOGIC;
   SIGNAL dp_phs_lock_lost            : STD_LOGIC;
+  SIGNAL dp_phs_stable               : STD_LOGIC;
   
   SIGNAL dp_phs_align_restart        : STD_LOGIC;  
   SIGNAL dp_phs_align_restart_extend : STD_LOGIC;
@@ -302,6 +309,7 @@ ARCHITECTURE str OF lvdsh_dd_phs4 IS
   SIGNAL wb_phs_clk                  : STD_LOGIC;
   SIGNAL wb_sync_cap                 : STD_LOGIC;
   SIGNAL wb_cnt                      : STD_LOGIC_VECTOR(c_wb_cnt_w-1 DOWNTO 0);
+  SIGNAL wb_roundtrip_expected       : STD_LOGIC;
   SIGNAL wb_roundtrip_lock           : STD_LOGIC;
   SIGNAL wb_roundtrip_stable         : STD_LOGIC;
   
@@ -641,10 +649,10 @@ BEGIN
   
   nxt_r_dp.dp_word_req_dly(c_word_req_lat-1 DOWNTO 0) <= r_dp.dp_word_req_dly(c_word_req_lat-2 DOWNTO 0) & r_dp.dp_word_req;
   
-  -- Monitor wb_cnt of roundtrip latency
-  wb_roundtrip_lock <= '1' WHEN UNSIGNED(r_dp.wb_cnt_roundtrip)=c_wb_sync_roundtrip ELSE '0';
+  -- Detect expected wb_cnt of roundtrip latency
+  wb_roundtrip_expected <= '1' WHEN UNSIGNED(r_dp.wb_cnt_roundtrip)=c_wb_sync_roundtrip ELSE '0';
 
-  p_dp_word_lock : PROCESS (r_dp, wb_cnt, wb_roundtrip_lock, fifo_rd_emp, fifo_rdusedw)
+  p_dp_word_lock : PROCESS (r_dp, wb_cnt, wb_roundtrip_expected, fifo_rd_emp, fifo_rdusedw)
   BEGIN
     nxt_r_dp.wb_cnt_clr            <= '1';
     nxt_r_dp.wb_cnt_roundtrip      <= (OTHERS=>'0');
@@ -700,7 +708,7 @@ BEGIN
           -- *** Word locked, this is the correct end state for the ALIGNED data processing ***
           
           -- Fine check roundtrip latency during stable word lock
-          IF wb_roundtrip_lock='0' AND r_dp.dp_maintain_phs = '0' THEN
+          IF wb_roundtrip_expected='0' AND r_dp.dp_maintain_phs = '0' THEN
             -- After achieving dp_word_locked, but while dp_maintain_phs is still '0' the wb_cnt_roundtrip must exactly match c_wb_sync_roundtrip.
             nxt_r_dp.dp_word_lock_failed <= '1';             -- word lock lost, so recover via in_rst
           END IF;
@@ -740,7 +748,7 @@ BEGIN
     END IF;
     
     -- Course check roundtrip latency and FIFO fill level at any time
-    IF UNSIGNED(wb_cnt) > c_wb_sync_roundtrip+1 THEN
+    IF UNSIGNED(wb_cnt) > c_wb_sync_roundtrip_max THEN
       nxt_r_dp.dp_word_lock_failed <= '1';                 -- timeout dp_sync, so recover via in_rst
     END IF;
     IF UNSIGNED(fifo_rdusedw) > c_wb_fifo_fill_max THEN
@@ -748,6 +756,13 @@ BEGIN
     END IF;
   END PROCESS;  
   
+  -- Monitor wb_cnt of roundtrip latency, use >min and <max instead of >=min and <=max to over constrain it compared to the checks in p_dp_word_lock
+  wb_roundtrip_lock <= '1' WHEN UNSIGNED(r_dp.wb_cnt_roundtrip)>=c_wb_sync_roundtrip_min AND UNSIGNED(r_dp.wb_cnt_roundtrip)<=c_wb_sync_roundtrip_max ELSE '0';
+
+  -- Monitor fifo_rdusedw, use >min and <max instead of >=min and <=max to over constrain it compared to the checks in p_dp_word_lock
+  dp_fifo_fill_lock <= '1' WHEN UNSIGNED(fifo_rdusedw) > c_wb_fifo_fill_min AND UNSIGNED(fifo_rdusedw) < c_wb_fifo_fill_max ELSE '0';
+  
+  
   ------------------------------------------------------------------------------
   -- Monitor the dp_clk phase alignment
   ------------------------------------------------------------------------------
@@ -756,7 +771,8 @@ BEGIN
   BEGIN
     -- Debug monitor status
     i_out_status               <= (OTHERS=>'0');
-    i_out_status(           4) <= r_dp.dp_phs_locked;                     -- 1 bit
+    i_out_status(           3) <= dp_fifo_fill_stable;                    -- 1 bit
+    i_out_status(           4) <= dp_phs_stable;                          -- 1 bit
     i_out_status(           5) <= wb_roundtrip_stable;                    -- 1 bit
     i_out_status( 7 DOWNTO  6) <= dp_in_clk_stable & dp_in_clk_detected;  -- 2 bit
     i_out_status(15 DOWNTO  8) <= fifo_rdusedw;                           -- c_fifo_size_w = 8
@@ -770,6 +786,7 @@ BEGIN
   sim_dbg_status : IF g_sim=TRUE GENERATE 
     dbg_status_0_out_word_locked       <= r_dp.dp_word_locked;
     dbg_status_1_out_word_stable       <= i_out_word_stable;
+    dbg_status_3_dp_fifo_fill_stable   <= i_out_status(3);
     dbg_status_4_dp_phs_locked         <= i_out_status(4);
     dbg_status_5_wb_roundtrip_stable   <= i_out_status(5);
     dbg_status_6_dp_in_clk_detected    <= i_out_status(6);
@@ -780,23 +797,47 @@ BEGIN
     dbg_status_31_28_dp_raw_phs        <= i_out_status(31 DOWNTO 28) WHEN r_dp.dp_val='1' AND r_dp.le_val='1';  -- latch to view only yhe raw_phs when in lock
   END GENERATE;
   
+  ------------------------------------------------------------------------------
+  -- Stable monitors for out_status
+  ------------------------------------------------------------------------------
+  
   u_common_stable_monitor_word_lock : ENTITY common_lib.common_stable_monitor
   PORT MAP (
     rst          => dp_rst,
     clk          => dp_clk,
     -- MM
     r_in         => r_dp.dp_word_locked,
-    r_stable     => i_out_word_stable,
+    r_stable     => i_out_word_stable,       -- monitors lvdsh_dd_phs4 overalll data output stable (both phs and word)
+    r_stable_ack => out_word_stable_ack
+  );
+  
+  u_common_stable_monitor_phs_lock : ENTITY common_lib.common_stable_monitor
+  PORT MAP (
+    rst          => dp_rst,
+    clk          => dp_clk,
+    -- MM
+    r_in         => r_dp.dp_phs_locked,
+    r_stable     => dp_phs_stable,       -- monitors lvdsh_dd_phs4_align data output stable
     r_stable_ack => out_word_stable_ack
   );
   
+  u_common_stable_monitor_fifo_fill_lock : ENTITY common_lib.common_stable_monitor
+  PORT MAP (
+    rst          => dp_rst,
+    clk          => dp_clk,
+    -- MM
+    r_in         => dp_fifo_fill_lock,
+    r_stable     => dp_fifo_fill_stable,   -- monitors FIFO fill level between min and max
+    r_stable_ack => out_word_stable_ack
+  );
+
   u_common_stable_monitor_wb_cnt_roundtrip : ENTITY common_lib.common_stable_monitor
   PORT MAP (
     rst          => dp_rst,
     clk          => dp_clk,
     -- MM
     r_in         => wb_roundtrip_lock,
-    r_stable     => wb_roundtrip_stable,
+    r_stable     => wb_roundtrip_stable,   -- monitors roundtrip latency of wb_sync --> dp_sync via in_clk domain between +-1
     r_stable_ack => out_word_stable_ack
   );
   
-- 
GitLab