From dd8fb87849a67883c4a5f62002231745d4e819e2 Mon Sep 17 00:00:00 2001
From: Daniel van der Schuur <schuur@astron.nl>
Date: Fri, 22 Oct 2021 10:20:36 +0200
Subject: [PATCH] Moved non-generic checking for sync from dp_stream_pkg
 function to st_histogram. Test benches still pass OK.

---
 libraries/base/dp/src/vhdl/dp_stream_pkg.vhd |  8 ++--
 libraries/dsp/st/src/vhdl/st_histogram.vhd   | 46 +++++++++-----------
 2 files changed, 23 insertions(+), 31 deletions(-)

diff --git a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
index 2e5506c6f6..2f0b97c6a1 100644
--- a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
+++ b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
@@ -1528,11 +1528,9 @@ PACKAGE BODY dp_stream_pkg IS
     VARIABLE result : BOOLEAN;
   BEGIN
     result := FALSE;
-    IF snk_in_a.sync = '0' THEN -- Don't compare across sync periods
-      IF snk_in_a.valid='1' AND snk_in_b.valid='1' THEN
-        IF snk_in_a.data(data_w-1 DOWNTO 0) = snk_in_b.data(data_w-1 DOWNTO 0) THEN
-          result := TRUE;
-        END IF;
+    IF snk_in_a.valid='1' AND snk_in_b.valid='1' THEN
+      IF snk_in_a.data(data_w-1 DOWNTO 0) = snk_in_b.data(data_w-1 DOWNTO 0) THEN
+        result := TRUE;
       END IF;
     END IF;
     RETURN result;
diff --git a/libraries/dsp/st/src/vhdl/st_histogram.vhd b/libraries/dsp/st/src/vhdl/st_histogram.vhd
index f505eddf53..d4b03cbe95 100644
--- a/libraries/dsp/st/src/vhdl/st_histogram.vhd
+++ b/libraries/dsp/st/src/vhdl/st_histogram.vhd
@@ -96,7 +96,6 @@ LIBRARY IEEE, common_lib, mm_lib, technology_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
-USE common_lib.common_str_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE technology_lib.technology_select_pkg.ALL;
 
@@ -238,19 +237,15 @@ BEGIN
   -- . With a RAM read->write latency of 3 cycles (c_ram_rd_wr_latency), we need 
   --   a shift register of 4 words (0,1,2,3) deep to prevent simultaneous 
   --   read/writes on the RAM.
-  --   . Element 3 is only and output register
+  --   . Element 3 is only an output register, elements 0,1,2 are compared for
+  --     matching data.
   -- . A sequence of duplicate data could cross a sync period:
-  --   . We need to stop&restart counting duplicates on a sync, don't count
-  --     across sync periods to ensure exactly correct bin values in each sync 
-  --     interval
-  --     . We can still get a read on cycle n and a write on cycle n+2 on the 
-  --       same address, but that does not matter as the read,write will be on
-  --       different RAM blocks (1 RAM block per sync period).
-  --     . snk_in_reg_arr(0).sync='1' : Don't compare with older snk_in_reg_arr(1)
-  --       and (2)
-  --     . snk_in_reg_arr(1).sync='1' : Don't compare with older (2)
-  --     . snk_in_reg_arr(2).sync='1' : OK to compare with both (1) and (0)
-  -- . Input : snk_in
+  --   . Don't count across sync periods to ensure exactly correct bin values
+  --     in each sync interval.
+  --   . We can still get a read on cycle n and a write on cycle n+2 on the 
+  --     same address, but that does not matter as the read,write will be on
+  --     different RAM blocks (1 RAM block per sync period).
+  -- . Input : snk_in, snk_in_data
   -- . Output: snk_in_reg
   -------------------------------------------------------------------------------
   p_nxt_snk_in_reg_arr: PROCESS(snk_in, snk_in_data, snk_in_reg_arr) IS
@@ -271,22 +266,21 @@ BEGIN
       nxt_snk_in_reg_arr(0).channel <= TO_DP_CHANNEL(1);
 
       -- Overwrite channel field (=count) when duplicate data is found
-      IF func_dp_data_match(snk_in_reg_arr(0), snk_in_reg_arr(1), snk_in_reg_arr(2), g_data_w) THEN
-        nxt_snk_in_reg_arr(1).valid   <= '0';
-        nxt_snk_in_reg_arr(1).channel <= TO_DP_CHANNEL(0);
-        nxt_snk_in_reg_arr(2).valid   <= '0'; 
-        nxt_snk_in_reg_arr(2).channel <= TO_DP_CHANNEL(0);
-        nxt_snk_in_reg_arr(3).channel <= TO_DP_CHANNEL(3); -- 0,1,2 match: put count=3 here
-      ELSIF func_dp_data_match(snk_in_reg_arr(1), snk_in_reg_arr(2), g_data_w) THEN
-        nxt_snk_in_reg_arr(2).valid   <= '0';
-        nxt_snk_in_reg_arr(2).channel <= TO_DP_CHANNEL(0);
-        nxt_snk_in_reg_arr(3).channel <= TO_DP_CHANNEL(2); -- 1,2 match: put count=2 here
-      ELSIF func_dp_data_match(snk_in_reg_arr(0), snk_in_reg_arr(2), g_data_w) THEN
-        IF snk_in_reg_arr(1).sync='0' THEN
+      -- . Check all possible matches apart from 0==1: simply wait until 0==1 shifts to 1==2.
+      IF func_dp_data_match(snk_in_reg_arr(0), snk_in_reg_arr(1), snk_in_reg_arr(2), g_data_w) AND (snk_in_reg_arr(0).sync='0' AND snk_in_reg_arr(1).sync='0') THEN
+          nxt_snk_in_reg_arr(1).valid   <= '0';
+          nxt_snk_in_reg_arr(1).channel <= TO_DP_CHANNEL(0);
+          nxt_snk_in_reg_arr(2).valid   <= '0'; 
+          nxt_snk_in_reg_arr(2).channel <= TO_DP_CHANNEL(0);
+          nxt_snk_in_reg_arr(3).channel <= TO_DP_CHANNEL(3); -- 0,1,2 match: put count=3 here
+      ELSIF func_dp_data_match(snk_in_reg_arr(1), snk_in_reg_arr(2), g_data_w) AND snk_in_reg_arr(1).sync='0' THEN
+          nxt_snk_in_reg_arr(2).valid   <= '0';
+          nxt_snk_in_reg_arr(2).channel <= TO_DP_CHANNEL(0);
+          nxt_snk_in_reg_arr(3).channel <= TO_DP_CHANNEL(2); -- 1,2 match: put count=2 here
+      ELSIF func_dp_data_match(snk_in_reg_arr(0), snk_in_reg_arr(2), g_data_w) AND (snk_in_reg_arr(0).sync='0' AND snk_in_reg_arr(1).sync='0') THEN
           nxt_snk_in_reg_arr(1).valid   <= '0';
           nxt_snk_in_reg_arr(1).channel <= TO_DP_CHANNEL(0);
           nxt_snk_in_reg_arr(3).channel <= TO_DP_CHANNEL(2); -- 0,2 match: put count=2 here
-        END IF;
       END IF;
     END IF;
   END PROCESS;
-- 
GitLab