From b019188148305d34e78f3fbb98435e3d1177d843 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Romain=20Bron=C3=A8s?=
 <romain.broucquart@synchrotron-soleil.fr>
Date: Thu, 14 Dec 2023 09:52:52 +0100
Subject: [PATCH] fix Error flags

* There were pulses, broken when added a CDC because the pulse was to
  short
* Change of behavior, It is now sticky flags. The register is in the
  inner clock domain, to the CDC handshake is simplier.
---
 hdl/combpm_protocol_electron.vhd | 128 ++++++++++++++++++++-----------
 hdl/top_combpm_electron.vhd      |  36 +++++----
 rdl/combpm.rdl                   |   5 ++
 3 files changed, 106 insertions(+), 63 deletions(-)

diff --git a/hdl/combpm_protocol_electron.vhd b/hdl/combpm_protocol_electron.vhd
index c36c6ac..16c3b95 100644
--- a/hdl/combpm_protocol_electron.vhd
+++ b/hdl/combpm_protocol_electron.vhd
@@ -20,15 +20,16 @@ entity combpm_protocol_electron is
         m_axis_m2s         : out t_bpmpacket_axis_m2s;
 
         -- Status and control interface
-        soft_reset         : in std_logic;                      -- Reset all counters.
-        frame_seq_cnt      : out std_logic_vector(15 downto 0); -- Number of frame in last sequence.
-        frame_valid_cnt    : out std_logic_vector(31 downto 0); -- Count of valid frames.
-        frame_invalid_cnt  : out std_logic_vector(31 downto 0); -- Count of invalid frames.
-        frame_valid_rate   : out std_logic_vector(31 downto 0); -- Valid frame rate.
-        frame_invalid_rate : out std_logic_vector(31 downto 0); -- Invalid frame rate.
-        cnt_seq_mismatch   : out std_logic;                     -- Pulse for number of frame in sequence mismatch.
-        seq_discontinuity  : out std_logic;                     -- Pulse for discontinuity in sequence number.
-        frame_error        : out std_logic                      -- Pulse for frame error.
+        soft_reset              : in std_logic;                      -- Reset all counters.
+        frame_seq_cnt           : out std_logic_vector(15 downto 0); -- Number of frame in last sequence.
+        frame_valid_cnt         : out std_logic_vector(31 downto 0); -- Count of valid frames.
+        frame_invalid_cnt       : out std_logic_vector(31 downto 0); -- Count of invalid frames.
+        frame_valid_rate        : out std_logic_vector(31 downto 0); -- Valid frame rate.
+        frame_invalid_rate      : out std_logic_vector(31 downto 0); -- Invalid frame rate.
+        flag_cnt_seq_mismatch   : out std_logic;                     -- Number of frame in sequence mismatch.
+        flag_seq_discontinuity  : out std_logic;                     -- Discontinuity in sequence number.
+        flag_frame_error        : out std_logic;                     -- Frame error.
+        flag_reset              : in std_logic                       -- Reset all flags.
     );
 end entity combpm_protocol_electron;
 
@@ -46,47 +47,82 @@ architecture rtl of combpm_protocol_electron is
     ------------------------
     -- SIGNAL DECLARATION --
     ------------------------
-    signal packet_reg        :  std_logic_vector(14*16-1 downto 0);   -- Register to hold one packet
-
-    signal flag_sop_inc      :  std_logic;
-    signal flag_sop          :  std_logic;
-    signal flag_eop          :  std_logic;
-    signal flag_dummy        :  std_logic;
-    signal flag_rsvd         :  std_logic;
-    signal flag_crc          :  std_logic;
-    signal flag_all          :  std_logic;
-    signal flag_frame        :  std_logic;
-
-    signal packet_bpmid      :  std_logic_vector(9 downto 0);
-    signal packet_startframe :  std_logic;
-    signal packet_timestamp  :  std_logic_vector(15 downto 0);
-    signal packet_xpos       :  std_logic_vector(31 downto 0);
-    signal packet_ypos       :  std_logic_vector(31 downto 0);
-    signal packet_crc        :  std_logic_vector(31 downto 0);
-
-    signal crc_result        :  std_logic_vector(31 downto 0);
-    signal xorinv_crc_reg    :  std_logic_vector(31 downto 0);
-    signal inv_crc_reg       :  std_logic_vector(31 downto 0);
-    signal crc_reg           :  std_logic_vector(31 downto 0);
-    signal lfsr_c            :  std_logic_vector(31 downto 0);
-    signal crc_cnt           :  unsigned(3 downto 0);
-    signal d                 :  std_logic_vector(15 downto 0);
-
-    signal last_seq          :  std_logic_vector(15 downto 0);
-
-    signal last_cnt_seq_r    :  unsigned(15 downto 0);
-    signal cnt_frame_seq_r   :  unsigned(15 downto 0);
-    signal cnt_valid_r       :  unsigned(31 downto 0);
-    signal cnt_invalid_r     :  unsigned(31 downto 0);
-    signal rate_valid_r      :  unsigned(31 downto 0);
-    signal rate_invalid_r    :  unsigned(31 downto 0);
-
-    signal packet            : t_bpmpacket;
-    signal m_axi_tvalid      : std_logic;
+    signal packet_reg               :  std_logic_vector(14*16-1 downto 0);   -- Register to hold one packet
+
+    signal flag_sop_inc             :  std_logic;
+    signal flag_sop                 :  std_logic;
+    signal flag_eop                 :  std_logic;
+    signal flag_dummy               :  std_logic;
+    signal flag_rsvd                :  std_logic;
+    signal flag_crc                 :  std_logic;
+    signal flag_all                 :  std_logic;
+    signal flag_frame               :  std_logic;
+
+    signal packet_bpmid             :  std_logic_vector(9 downto 0);
+    signal packet_startframe        :  std_logic;
+    signal packet_timestamp         :  std_logic_vector(15 downto 0);
+    signal packet_xpos              :  std_logic_vector(31 downto 0);
+    signal packet_ypos              :  std_logic_vector(31 downto 0);
+    signal packet_crc               :  std_logic_vector(31 downto 0);
+
+    signal crc_result               :  std_logic_vector(31 downto 0);
+    signal xorinv_crc_reg           :  std_logic_vector(31 downto 0);
+    signal inv_crc_reg              :  std_logic_vector(31 downto 0);
+    signal crc_reg                  :  std_logic_vector(31 downto 0);
+    signal lfsr_c                   :  std_logic_vector(31 downto 0);
+    signal crc_cnt                  :  unsigned(3 downto 0);
+    signal d                        :  std_logic_vector(15 downto 0);
+
+    signal last_seq                 :  std_logic_vector(15 downto 0);
+
+    signal last_cnt_seq_r           :  unsigned(15 downto 0);
+    signal cnt_frame_seq_r          :  unsigned(15 downto 0);
+    signal cnt_valid_r              :  unsigned(31 downto 0);
+    signal cnt_invalid_r            :  unsigned(31 downto 0);
+    signal rate_valid_r             :  unsigned(31 downto 0);
+    signal rate_invalid_r           :  unsigned(31 downto 0);
+
+    signal packet                   : t_bpmpacket;
+    signal m_axi_tvalid             : std_logic;
+
+    signal cnt_seq_mismatch         : std_logic;
+    signal seq_discontinuity        : std_logic;
+    signal frame_error              : std_logic;
 
 
 begin
 
+
+    ------------------------
+    -- STICKY ERROR FLAGS --
+    ------------------------
+    p_stickerr:process(clk, rst_n)
+    begin
+        if rst_n = '0' then
+            flag_cnt_seq_mismatch           <= '0';
+            flag_seq_discontinuity          <= '0';
+            flag_frame_error                <= '0';
+        elsif rising_edge(clk) then
+
+            if flag_reset = '1' then
+                flag_cnt_seq_mismatch       <= '0';
+                flag_seq_discontinuity      <= '0';
+                flag_frame_error            <= '0';
+            else
+                if cnt_seq_mismatch = '1' then
+                    flag_cnt_seq_mismatch   <= '1';
+                end if;
+                if seq_discontinuity = '1' then
+                    flag_seq_discontinuity  <= '1';
+                end if;
+                if frame_error = '1' then
+                    flag_frame_error        <= '1';
+                end if;
+            end if;
+        end if;
+    end process;
+
+
     ---------------------
     -- PACKET REGISTER --
     ---------------------
diff --git a/hdl/top_combpm_electron.vhd b/hdl/top_combpm_electron.vhd
index 6a7b869..6b28583 100644
--- a/hdl/top_combpm_electron.vhd
+++ b/hdl/top_combpm_electron.vhd
@@ -79,6 +79,7 @@ architecture struct of top_combpm_electron is
     signal cnt_seq_mismatch   : std_logic;
     signal seq_discontinuity  : std_logic;
     signal frame_error        : std_logic;
+    signal flag_reset         : std_logic;
 
     signal gt_datarx          : std_logic_vector(15 downto 0);
     signal gt_powergood       : std_logic;
@@ -247,23 +248,24 @@ begin
     --------------------------------------
     protocol_inst: entity work.combpm_protocol_electron
     port map(
-        rst_n              => sync_resetn,
-        clk                => usrclk,
-        pps                => pps_resync,
-        gt_datarx          => gt_datarx,
-
-        m_axis_m2s         => m_axis_decoded_m2s,
-
-        mc_time            => mc_time,
-        soft_reset         => addrmap_w.RESET.SOFTRESET.data(0),
-        frame_seq_cnt      => frame_seq_cnt,
-        frame_valid_cnt    => frame_valid_cnt,
-        frame_invalid_cnt  => frame_invalid_cnt,
-        frame_valid_rate   => frame_valid_rate,
-        frame_invalid_rate => frame_invalid_rate,
-        cnt_seq_mismatch   => cnt_seq_mismatch,
-        seq_discontinuity  => seq_discontinuity,
-        frame_error        => frame_error
+        rst_n                   => sync_resetn,
+        clk                     => usrclk,
+        pps                     => pps_resync,
+        gt_datarx               => gt_datarx,
+
+        m_axis_m2s              => m_axis_decoded_m2s,
+
+        mc_time                 => mc_time,
+        soft_reset              => addrmap_w.RESET.SOFTRESET.data(0),
+        frame_seq_cnt           => frame_seq_cnt,
+        frame_valid_cnt         => frame_valid_cnt,
+        frame_invalid_cnt       => frame_invalid_cnt,
+        frame_valid_rate        => frame_valid_rate,
+        frame_invalid_rate      => frame_invalid_rate,
+        flag_cnt_seq_mismatch   => cnt_seq_mismatch,
+        flag_seq_discontinuity  => seq_discontinuity,
+        flag_frame_error        => frame_error,
+        flag_reset              => addrmap_w.RESET_ERROR.SOFTRESET.data(0)
     );
 
     ---------------
diff --git a/rdl/combpm.rdl b/rdl/combpm.rdl
index 8fabb38..7910dda 100644
--- a/rdl/combpm.rdl
+++ b/rdl/combpm.rdl
@@ -63,6 +63,11 @@ addrmap combpm {
         field {desc="Sequence frame discontinuity";} SEQFRAMEDISCONT;
     } PROTOCOL_ERROR;
 
+    reg  {
+        default sw = rw; default hw = r;
+        field {desc="Reset error flags";} SOFTRESET;
+    } RESET_ERROR;
+
     reg  {
         default sw = rw; default hw = r;
         field {desc="Soft reset";} SOFTRESET;
-- 
GitLab