From 301b584d39d2cef4cd9c8ad1f0a7cf00598c9dee Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Thu, 12 Feb 2015 09:54:36 +0000
Subject: [PATCH] Use proc from tb_diag_pkg. Added verify g_mm_broadcast_tx.

---
 .../base/diag/tb/vhdl/tb_mms_diag_seq.vhd     | 320 +++++-------------
 1 file changed, 92 insertions(+), 228 deletions(-)

diff --git a/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd b/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
index 51388d04a3..b996da705d 100644
--- a/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
+++ b/libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
@@ -29,7 +29,6 @@
 
 LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.STD_LOGIC_1164.ALL;    
-USE IEEE.STD_LOGIC_UNSIGNED.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_lfsr_sequences_pkg.ALL;
@@ -38,183 +37,30 @@ USE common_lib.tb_common_mem_pkg.ALL;
 USE common_lib.tb_common_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE dp_lib.tb_dp_pkg.ALL;
+USE work.tb_diag_pkg.ALL;
 
 ENTITY tb_mms_diag_seq IS
   GENERIC (   
     -- general
-    g_flow_control_verify  : t_dp_flow_control_enum := e_active;  -- always active, random or pulse flow control
+    g_flow_control_verify  : t_dp_flow_control_enum := e_active;  -- always active or random flow control
     -- specific
-    g_data_w               : NATURAL  := 40;   -- >= g_seq_dat_w
-    g_seq_dat_w            : NATURAL  := 32
+    g_nof_streams          : NATURAL := 2;
+    g_mm_broadcast_tx      : BOOLEAN := TRUE;
+    g_data_w               : NATURAL := 40;  -- >= g_seq_dat_w
+    g_seq_dat_w            : NATURAL := 32
   );
 END ENTITY tb_mms_diag_seq;
 
 ARCHITECTURE str of tb_mms_diag_seq IS
 
-  CONSTANT c_nof_streams          : NATURAL := 1;
-  
   CONSTANT mm_clk_period          : TIME := 8 ns;    -- 125 MHz
   CONSTANT dp_clk_period          : TIME := 5 ns;    -- 200 MHz
-
-  PROCEDURE proc_readback(SIGNAL clk     : IN  STD_LOGIC;
-                          SIGNAL tx_miso : IN  t_mem_miso;
-                          SIGNAL tx_mosi : OUT t_mem_mosi;
-                          SIGNAL rx_miso : IN  t_mem_miso;
-                          SIGNAL rx_mosi : OUT t_mem_mosi;
-                          SIGNAL tx_init : OUT STD_LOGIC_VECTOR;
-                          SIGNAL tx_ctrl : OUT STD_LOGIC_VECTOR;
-                          SIGNAL rx_ctrl : OUT STD_LOGIC_VECTOR) IS
-  BEGIN
-    -- read back Tx data init
-    proc_mem_mm_bus_rd(1, clk, tx_miso, tx_mosi);
-    proc_mem_mm_bus_rd_latency(1, clk);
-    tx_init <= tx_miso.rddata(c_word_w-1 DOWNTO 0);
-    -- read back Tx control
-    proc_mem_mm_bus_rd(0, clk, tx_miso, tx_mosi);
-    proc_mem_mm_bus_rd_latency(1, clk);
-    tx_ctrl <= tx_miso.rddata(c_word_w-1 DOWNTO 0);
-    -- read back Rx control
-    proc_mem_mm_bus_rd(0, clk, rx_miso, rx_mosi);
-    proc_mem_mm_bus_rd_latency(1, clk);
-    rx_ctrl <= rx_miso.rddata(c_word_w-1 DOWNTO 0);
-  END proc_readback;
-
-  PROCEDURE proc_enable_tx(CONSTANT c_pattern : IN  STRING;    -- "PSRG", "CNTR"
-                           CONSTANT c_tx_init : IN  NATURAL;
-                           SIGNAL   mm_clk    : IN  STD_LOGIC;
-                           SIGNAL   dp_clk    : IN  STD_LOGIC;
-                           SIGNAL   tx_miso   : IN  t_mem_miso;  -- tx ctrl
-                           SIGNAL   tx_mosi   : OUT t_mem_mosi;
-                           SIGNAL   rx_miso   : IN  t_mem_miso;  -- rx ctrl
-                           SIGNAL   rx_mosi   : OUT t_mem_mosi;
-                           SIGNAL   tx_init : OUT STD_LOGIC_VECTOR;  -- readback
-                           SIGNAL   tx_ctrl : OUT STD_LOGIC_VECTOR;
-                           SIGNAL   rx_ctrl : OUT STD_LOGIC_VECTOR) IS
-    CONSTANT c_en   : NATURAL := 1;
-    VARIABLE v_sel  : NATURAL;
-    VARIABLE v_ctlr : NATURAL;
-  BEGIN
-    IF c_pattern="PSRG" THEN
-      v_sel  := 0;  -- pseudo random data
-    ELSE
-      v_sel  := 1;  -- counter data
-    END IF;
-    v_ctlr := v_sel * 2 + c_en;  -- bits [1:0]
-    -- Enable Tx
-    proc_mem_mm_bus_wr(0, v_ctlr, mm_clk, tx_miso, tx_mosi);
-    proc_mem_mm_bus_wr(1, c_tx_init, mm_clk, tx_miso, tx_mosi);
-    proc_common_wait_some_cycles(mm_clk, dp_clk, 10);  -- wait for clock domain crossing
-    proc_readback(mm_clk, tx_miso, tx_mosi, rx_miso, rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-  END proc_enable_tx;
-  
-  PROCEDURE proc_enable_rx(CONSTANT c_pattern : IN  STRING;    -- "PSRG", "CNTR"
-                           SIGNAL   mm_clk    : IN  STD_LOGIC;
-                           SIGNAL   dp_clk    : IN  STD_LOGIC;
-                           SIGNAL   tx_miso   : IN  t_mem_miso;  -- tx ctrl
-                           SIGNAL   tx_mosi   : OUT t_mem_mosi;
-                           SIGNAL   rx_miso   : IN  t_mem_miso;  -- rx ctrl
-                           SIGNAL   rx_mosi   : OUT t_mem_mosi;
-                           SIGNAL   tx_init : OUT STD_LOGIC_VECTOR;  -- readback
-                           SIGNAL   tx_ctrl : OUT STD_LOGIC_VECTOR;
-                           SIGNAL   rx_ctrl : OUT STD_LOGIC_VECTOR) IS
-    CONSTANT c_en   : NATURAL := 1;
-    VARIABLE v_sel  : NATURAL;
-    VARIABLE v_ctlr : NATURAL;
-  BEGIN
-    IF c_pattern="PSRG" THEN
-      v_sel  := 0;  -- pseudo random data
-    ELSE
-      v_sel  := 1;  -- counter data
-    END IF;
-    v_ctlr := v_sel * 2 + c_en;  -- bits [1:0]
-    proc_mem_mm_bus_wr(0, v_ctlr, mm_clk, rx_miso, rx_mosi);
-    proc_common_wait_some_cycles(mm_clk, dp_clk, 10);  -- wait for clock domain crossing
-    proc_readback(mm_clk, tx_miso, tx_mosi, rx_miso, rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-  END proc_enable_rx;
-  
-  PROCEDURE proc_disable_tx(SIGNAL   mm_clk  : IN  STD_LOGIC;
-                            SIGNAL   dp_clk  : IN  STD_LOGIC;
-                            SIGNAL   tx_miso : IN  t_mem_miso;  -- tx ctrl
-                            SIGNAL   tx_mosi : OUT t_mem_mosi;
-                            SIGNAL   rx_miso : IN  t_mem_miso;  -- rx ctrl
-                            SIGNAL   rx_mosi : OUT t_mem_mosi;
-                            SIGNAL   tx_init : OUT STD_LOGIC_VECTOR;  -- readback
-                            SIGNAL   tx_ctrl : OUT STD_LOGIC_VECTOR;
-                            SIGNAL   rx_ctrl : OUT STD_LOGIC_VECTOR) IS
-  BEGIN
-    proc_mem_mm_bus_wr(0, 0, mm_clk, tx_miso, tx_mosi);
-    proc_common_wait_some_cycles(mm_clk, dp_clk, 10);  -- wait for clock domain crossing
-    proc_readback(mm_clk, tx_miso, tx_mosi, rx_miso, rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-  END proc_disable_tx;
-  
-  PROCEDURE proc_disable_rx(SIGNAL   mm_clk  : IN  STD_LOGIC;
-                            SIGNAL   dp_clk  : IN  STD_LOGIC;
-                            SIGNAL   tx_miso : IN  t_mem_miso;  -- tx ctrl
-                            SIGNAL   tx_mosi : OUT t_mem_mosi;
-                            SIGNAL   rx_miso : IN  t_mem_miso;  -- rx ctrl
-                            SIGNAL   rx_mosi : OUT t_mem_mosi;
-                            SIGNAL   tx_init : OUT STD_LOGIC_VECTOR;  -- readback
-                            SIGNAL   tx_ctrl : OUT STD_LOGIC_VECTOR;
-                            SIGNAL   rx_ctrl : OUT STD_LOGIC_VECTOR) IS
-  BEGIN
-    proc_mem_mm_bus_wr(0, 0, mm_clk, rx_miso, rx_mosi);
-    proc_common_wait_some_cycles(mm_clk, dp_clk, 10);  -- wait for clock domain crossing
-    proc_readback(mm_clk, tx_miso, tx_mosi, rx_miso, rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-  END proc_disable_rx;
-
-  TYPE t_tb_mode_enum IS (
-    s_off,
-    s_expect_ok,
-    s_expect_error,
-    s_expect_no_result
-  );
-
-  PROCEDURE proc_read_and_verify_rx_stat(SIGNAL   clk       : IN    STD_LOGIC;
-                                         SIGNAL   mm_miso   : IN    t_mem_miso;
-                                         SIGNAL   mm_mosi   : OUT   t_mem_mosi;
-                                         SIGNAL   tb_mode   : INOUT t_tb_mode_enum;
-                                         SIGNAL   tb_verify : OUT   STD_LOGIC;
-                                         SIGNAL   rx_stat   : INOUT STD_LOGIC_VECTOR) IS
-  BEGIN
-    -- Read
-    proc_mem_mm_bus_rd(1, clk, mm_miso, mm_mosi);
-    proc_mem_mm_bus_rd_latency(1, clk);
-    rx_stat <= mm_miso.rddata(c_word_w-1 DOWNTO 0);
-    proc_common_wait_some_cycles(clk, 1);
-
-    -- Issue tb_verify pulse eg. to easy recognition in Wave window
-    tb_verify <= '1';
-    proc_common_wait_some_cycles(clk, 1);
-    tb_verify <= '0';
-    
-    -- Verify
-    IF tb_mode=s_expect_ok THEN
-      IF rx_stat(1)/='0' THEN
-        REPORT "Wrong diag result: no valid result." SEVERITY ERROR;
-      ELSIF rx_stat(0)/='0' THEN
-        REPORT "Wrong diag result: one or more data errors." SEVERITY ERROR;
-      END IF;
-    ELSIF tb_mode=s_expect_error THEN
-      IF rx_stat(1)/='0' THEN
-        REPORT "Wrong diag result: no valid result." SEVERITY ERROR;
-      ELSIF rx_stat(0)/='1' THEN
-        REPORT "Wrong diag result: must detect data errors." SEVERITY ERROR;
-      END IF;
-    ELSIF tb_mode=s_expect_no_result THEN
-      IF rx_stat(1)/='1' THEN
-        REPORT "Wrong diag result: must indicate no valid result." SEVERITY ERROR;
-      END IF;
-    ELSE
-      REPORT "Unknown verify mode" SEVERITY FAILURE;
-    END IF;
-  END proc_read_and_verify_rx_stat;
   
   SIGNAL random                   : STD_LOGIC_VECTOR(15 DOWNTO 0) := (OTHERS=>'0');  -- use different lengths to have different random sequences
-  SIGNAL pulse                    : STD_LOGIC;
   SIGNAL ready                    : STD_LOGIC;
   
   SIGNAL tb_end                   : STD_LOGIC := '0';
-  SIGNAL tb_mode                  : t_tb_mode_enum := s_off;
+  SIGNAL tb_mode                  : t_tb_diag_seq_mode_enum := s_off;
   SIGNAL tb_verify                : STD_LOGIC := '0';
   SIGNAL mm_rst                   : STD_LOGIC;
   SIGNAL mm_clk                   : STD_LOGIC := '0';
@@ -227,18 +73,15 @@ ARCHITECTURE str of tb_mms_diag_seq IS
   SIGNAL reg_rx_mosi              : t_mem_mosi := c_mem_mosi_rst;
   SIGNAL reg_rx_miso              : t_mem_miso;
 
-  SIGNAL tx_ctrl                  : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-  SIGNAL tx_init                  : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-  SIGNAL rx_ctrl                  : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-  SIGNAL rx_stat                  : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-  
-  SIGNAL tx_src_out_arr           : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0);
-  SIGNAL tx_src_in_arr            : t_dp_siso_arr(c_nof_streams-1 DOWNTO 0);
+  SIGNAL rd_reg                   : t_diag_seq_mm_reg;
+
+  SIGNAL tx_src_out_arr           : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);
+  SIGNAL tx_src_in_arr            : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0);
 
   SIGNAL force_low_error          : STD_LOGIC;
   SIGNAL force_replicate_error    : STD_LOGIC;
   
-  SIGNAL rx_snk_in_arr            : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0);
+  SIGNAL rx_snk_in_arr            : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);
   
 BEGIN
 
@@ -256,7 +99,7 @@ BEGIN
                        
   ready <= '1'                 WHEN g_flow_control_verify=e_active  ELSE
            random(random'HIGH) WHEN g_flow_control_verify=e_random  ELSE
-           pulse               WHEN g_flow_control_verify=e_pulse;
+           '1';
            
   tx_src_in_arr <= func_dp_stream_arr_set(tx_src_in_arr, ready, "READY");
                           
@@ -264,103 +107,124 @@ BEGIN
   -- Stimuli
   ------------------------------------------------------------------------------
   
-  p_stimuli : PROCESS
+  p_stimuli_and_verify : PROCESS
   BEGIN
     force_low_error       <= '0';
     force_replicate_error <= '0';
     tb_mode <= s_off;
     proc_common_wait_until_low(mm_clk, mm_rst);
     proc_common_wait_some_cycles(mm_clk, 10);
+    proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
 
     -------------------------------------------------------------------------
     -- Verify Tx and Rx on and both with the same pattern
     -------------------------------------------------------------------------
     tb_mode <= s_expect_ok;
-    proc_disable_tx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_disable_rx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_tx("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_rx("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
+    proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+    proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+    proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+    proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
     
     -- Run test and read and verify Rx status
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
+    proc_common_wait_some_cycles(mm_clk, 200);
+    proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
     
     -------------------------------------------------------------------------
     -- Verify Tx and Rx on but with different pattern
     -------------------------------------------------------------------------
     tb_mode <= s_expect_error;
-    proc_enable_tx("PSRG", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
+    proc_diag_seq_tx_enable("PSRG", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
     
     -- Run test and read and verify Rx status
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
+    proc_common_wait_some_cycles(mm_clk, 200);
+    proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
           
     -------------------------------------------------------------------------
     -- Verify Rx off
     -------------------------------------------------------------------------
     tb_mode <= s_expect_no_result;
-    proc_disable_rx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
+    proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
     
     -- Run test and read and verify Rx status
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
+    proc_common_wait_some_cycles(mm_clk, 200);
+    proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
     
-    -------------------------------------------------------------------------
-    -- Verify Tx and Rx on with error in sequence low part
-    -------------------------------------------------------------------------
-    tb_mode <= s_expect_ok;
-    proc_disable_tx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_disable_rx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_tx("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_rx("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    
-    -- Run test and read and verify Rx status
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
-    
-    tb_mode <= s_expect_error;
-    proc_common_wait_some_cycles(dp_clk, 1);
-    force_low_error <= '1';
-    proc_common_wait_some_cycles(dp_clk, 1);
-    force_low_error <= '0';
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
-    
-    -------------------------------------------------------------------------
-    -- Verify Tx and Rx on with error in sequence replicate part
-    -------------------------------------------------------------------------
-    tb_mode <= s_expect_ok;
-    proc_disable_tx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_disable_rx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_tx("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    proc_enable_rx("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
-    
-    -- Run test and read and verify Rx status
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
-    
-    tb_mode <= s_expect_error;
-    proc_common_wait_some_cycles(dp_clk, 1);
-    force_replicate_error <= '1';
-    proc_common_wait_some_cycles(dp_clk, 1);
-    force_replicate_error <= '0';
-    proc_common_wait_some_cycles(mm_clk, 100);
-    proc_read_and_verify_rx_stat(mm_clk, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rx_stat);
+    IF g_mm_broadcast_tx=FALSE THEN
+      -------------------------------------------------------------------------
+      -- Verify Tx and Rx on with error in sequence low part
+      -------------------------------------------------------------------------
+      tb_mode <= s_expect_ok;
+      proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      
+      -- Run test and read and verify Rx status
+      proc_common_wait_some_cycles(mm_clk, 200);
+      proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
+      
+      tb_mode <= s_expect_error;
+      proc_common_wait_some_cycles(dp_clk, 1);
+      force_low_error <= '1';
+      proc_common_wait_some_cycles(dp_clk, 1);
+      force_low_error <= '0';
+      proc_common_wait_some_cycles(mm_clk, 200);
+      proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
+      
+      -------------------------------------------------------------------------
+      -- Verify Tx and Rx on with error in sequence replicate part
+      -------------------------------------------------------------------------
+      tb_mode <= s_expect_ok;
+      proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_rx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_tx_enable("CNTR", 17, mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      proc_diag_seq_rx_enable("CNTR", mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+      
+      -- Run test and read and verify Rx status
+      proc_common_wait_some_cycles(mm_clk, 200);
+      proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
+      
+      tb_mode <= s_expect_error;
+      proc_common_wait_some_cycles(dp_clk, 1);
+      force_replicate_error <= '1';
+      proc_common_wait_some_cycles(dp_clk, 1);
+      force_replicate_error <= '0';
+      proc_common_wait_some_cycles(mm_clk, 200);
+      proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
+    END IF;
     
     -------------------------------------------------------------------------
     -- Both off
     -------------------------------------------------------------------------
     tb_mode <= s_off;
-    proc_disable_tx(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tx_init, tx_ctrl, rx_ctrl);
+    proc_diag_seq_tx_disable(mm_clk, dp_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, rd_reg);
+    proc_common_wait_some_cycles(mm_clk, 100);
+    proc_diag_seq_verify(mm_clk, reg_tx_miso, reg_tx_mosi, reg_rx_miso, reg_rx_mosi, tb_mode, tb_verify, rd_reg);
     proc_common_wait_some_cycles(mm_clk, 10);
     tb_end <= '1';
     WAIT;
   END PROCESS;
   
+  p_verify_mm_broadcast : PROCESS(rx_snk_in_arr)
+    VARIABLE v_snk_in : t_dp_sosi;
+  BEGIN
+    IF g_mm_broadcast_tx=TRUE AND g_nof_streams>1 THEN
+      v_snk_in := rx_snk_in_arr(0);
+      FOR I IN 1 TO g_nof_streams-1 LOOP
+        IF v_snk_in/=rx_snk_in_arr(I) THEN
+          REPORT "Wrong diag result: for g_mm_broadcast_tx=TRUE all streams should carry the same data." SEVERITY ERROR;
+          EXIT;
+        END IF;
+      END LOOP;
+    END IF;
+  END PROCESS;
+        
+  
   u_mms_diag_tx_seq: ENTITY WORK.mms_diag_tx_seq
   GENERIC MAP(
-    g_nof_streams => c_nof_streams,
-    g_seq_dat_w   => g_seq_dat_w
+    g_mm_broadcast => g_mm_broadcast_tx,
+    g_nof_streams  => g_nof_streams,
+    g_seq_dat_w    => g_seq_dat_w
   )
   PORT MAP(
     -- Clocks and reset
@@ -380,7 +244,7 @@ BEGIN
 
   u_mms_diag_rx_seq: ENTITY WORK.mms_diag_rx_seq
   GENERIC MAP(
-    g_nof_streams => c_nof_streams,
+    g_nof_streams => g_nof_streams,
     g_seq_dat_w   => g_seq_dat_w,
     g_data_w      => g_data_w
   )
-- 
GitLab