From d5761c3336d38c3b8d5672c02ca76deaf7ba4b3a Mon Sep 17 00:00:00 2001
From: Pieter Donker <donker@astron.nl>
Date: Mon, 27 Nov 2017 08:50:03 +0000
Subject: [PATCH] bugfix, dp_switch now realy switching

---
 .../diag/src/vhdl/diag_data_buffer_dev.vhd    |  2 +-
 libraries/base/dp/src/vhdl/dp_mux.vhd         |  2 +-
 libraries/base/dp/src/vhdl/dp_switch.vhd      | 33 ++++++++++-
 libraries/base/dp/tb/vhdl/tb_dp_switch.vhd    | 59 +++++++++++--------
 4 files changed, 67 insertions(+), 29 deletions(-)

diff --git a/libraries/base/diag/src/vhdl/diag_data_buffer_dev.vhd b/libraries/base/diag/src/vhdl/diag_data_buffer_dev.vhd
index 52c35ec608..ea7b3b05ef 100644
--- a/libraries/base/diag/src/vhdl/diag_data_buffer_dev.vhd
+++ b/libraries/base/diag/src/vhdl/diag_data_buffer_dev.vhd
@@ -45,7 +45,7 @@
 --   for the first sync pulse to arrive. When it has arrived it will wait for 
 --   reg_sync_delay valid cycles before g_nof_data valid words are written to the
 --   databuffer. The data can then be read out through the MM interface. New data 
---   will only be written if the databuffer is being armed again.  
+--   will only be written if the databuffer is being armed again.  
 --
 -- Remarks:
 -- . The actual RAM usage depends on g_data_w. Unused bits are forced to '0'
diff --git a/libraries/base/dp/src/vhdl/dp_mux.vhd b/libraries/base/dp/src/vhdl/dp_mux.vhd
index 54981c5156..56e06ffb4f 100644
--- a/libraries/base/dp/src/vhdl/dp_mux.vhd
+++ b/libraries/base/dp/src/vhdl/dp_mux.vhd
@@ -307,7 +307,7 @@ BEGIN
     BEGIN
       FOR I IN 0 TO g_nof_input-1 LOOP
         rd_siso_arr(I).ready <= src_in.ready;    -- default pass on src_in ready flow control to all inputs
-        rd_siso_arr(I).xon   <= in_xon_arr(I);   -- use xon to enableone input and stop all other inputs
+        rd_siso_arr(I).xon   <= in_xon_arr(I);   -- use xon to enable one input and stop all other inputs
       END LOOP;
     END PROCESS;
     
diff --git a/libraries/base/dp/src/vhdl/dp_switch.vhd b/libraries/base/dp/src/vhdl/dp_switch.vhd
index 0f51fcfe71..12df30fd45 100644
--- a/libraries/base/dp/src/vhdl/dp_switch.vhd
+++ b/libraries/base/dp/src/vhdl/dp_switch.vhd
@@ -82,6 +82,11 @@ ARCHITECTURE str OF dp_switch IS
   SIGNAL dp_mux_sel_ctrl_req : NATURAL;
   SIGNAL dp_mux_sel_ctrl     : NATURAL;
 
+  SIGNAL xonoff_snk_in_arr   : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+
+  SIGNAL inverted_snk_in_arr : t_dp_sosi_arr(0 TO g_nof_inputs-1);
+  SIGNAL snk_out_arr         : t_dp_siso_arr(0 TO g_nof_inputs-1);
+  
 BEGIN
 
   ------------------------------------------------------------------------------
@@ -104,6 +109,30 @@ BEGIN
     slv_out => mm_fields_out
   );
 
+
+  ------------------------------------------------------------------------------
+  -- invert snk_in_arr, dp_mux uses a TO array. 
+  ------------------------------------------------------------------------------
+  gen_dp_switch_snk_in_arr : FOR i IN 0 TO g_nof_inputs-1 GENERATE
+    inverted_snk_in_arr(i) <= xonoff_snk_in_arr(i);
+  END GENERATE;
+
+  ------------------------------------------------------------------------------
+  -- put dp_xonoff block inbetween data path to control data flow. 
+  ------------------------------------------------------------------------------
+  gen_dp_xonoff_arr : FOR i IN 0 TO g_nof_inputs-1 GENERATE
+    u_dp_xonoff: ENTITY work.dp_xonoff
+    PORT MAP (
+      clk         => dp_clk,
+      rst         => dp_rst,
+      -- Frame in
+      in_sosi     => snk_in_arr(i),
+      -- Frame out
+      out_siso    => snk_out_arr(i),     -- flush control via out_siso.xon from dp_mux
+      out_sosi    => xonoff_snk_in_arr(i) 
+    );
+  END GENERATE;
+
   ------------------------------------------------------------------------------
   -- Don't allow user to select a non-existent input
   -- . If user requests non-existent input, the default input is forwarded instead.
@@ -117,7 +146,6 @@ BEGIN
   u_dp_mux : ENTITY work.dp_mux
   GENERIC MAP (
     g_mode            => 4, -- Use sel_ctrl
-    g_sel_ctrl_invert => TRUE, -- Invert the control as we're using DOWNTO ranged sosi_arrays.
     g_nof_input       => g_nof_inputs,
     g_use_fifo        => g_use_fifo,  
     g_bsn_w           => g_bsn_w,  
@@ -140,7 +168,8 @@ BEGIN
 
     sel_ctrl    => dp_mux_sel_ctrl,
 
-    snk_in_arr  => snk_in_arr,
+    snk_in_arr  => inverted_snk_in_arr,
+    snk_out_arr => snk_out_arr,
 
     src_out     => src_out,
     src_in      => c_dp_siso_rdy
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd b/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
index 0c772e3d0f..1a7ca6ad14 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
@@ -35,6 +35,7 @@ USE common_lib.tb_common_mem_pkg.ALL;
 USE work.dp_stream_pkg.ALL;
 USE work.tb_dp_pkg.ALL;
 
+
 ENTITY tb_dp_switch IS
 END tb_dp_switch;
 
@@ -43,40 +44,43 @@ ARCHITECTURE tb OF tb_dp_switch IS
 
   CONSTANT c_nof_inputs                  : NATURAL := 3;
   CONSTANT c_data_w                      : NATURAL := 32;
-  CONSTANT c_nof_packets                 : NATURAL := 10;
+  CONSTANT c_nof_packets                 : NATURAL := 30;
   CONSTANT c_packet_len                  : NATURAL := 20;
   CONSTANT c_packet_gap                  : NATURAL := 1; --NOTE: dp_mux requires a minimum gap of 1 to select a new input!
 
   CONSTANT c_dp_clk_period               : TIME := 5 ns;  -- 200 MHz
   CONSTANT c_mm_clk_period               : TIME := 20 ns; --  50 MHz
 
+  CONSTANT c_nof_switch_runs             : NATURAL := 2;
+
+  SIGNAL tb_end                          : STD_LOGIC := '0';
   SIGNAL dp_clk                          : STD_LOGIC := '1';
   SIGNAL dp_rst                          : STD_LOGIC;
 
   SIGNAL mm_clk                          : STD_LOGIC := '1';
   SIGNAL mm_rst                          : STD_LOGIC;
 
-  SIGNAL proc_dp_gen_block_data_in_en    : STD_LOGIC := '1';
-  SIGNAL proc_dp_gen_block_data_src_in   : t_dp_siso := c_dp_siso_rdy;
+  SIGNAL dp_gen_block_data_in_en         : STD_LOGIC := '1';
+  SIGNAL dp_gen_block_data_src_in        : t_dp_siso := c_dp_siso_rdy;
 
-  SIGNAL proc_dp_gen_block_data_src_out_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0);
+  SIGNAL dp_gen_block_data_src_out_arr   : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0);
 
   SIGNAL dp_switch_snk_in_arr            : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0);
   SIGNAL dp_switch_src_out               : t_dp_sosi;
 
   SIGNAL reg_dp_switch_mosi              : t_mem_mosi := c_mem_mosi_rst;
-  SIGNAL reg_dp_switch_miso              : t_mem_miso;   
+  SIGNAL reg_dp_switch_miso              : t_mem_miso;
 
 BEGIN
 
   -----------------------------------------------------------------------------
   -- Clock,reset generation
   -----------------------------------------------------------------------------
-  dp_clk <= NOT dp_clk AFTER c_dp_clk_period/2;
-  dp_rst <= '1', '0'   AFTER c_dp_clk_period*7;
+  dp_clk <= NOT dp_clk OR tb_end AFTER c_dp_clk_period/2;
+  dp_rst <= '1', '0' AFTER c_dp_clk_period*7;
 
-  mm_clk <= NOT mm_clk AFTER c_mm_clk_period/2;
-  mm_rst <= '1', '0'   AFTER c_mm_clk_period*7;
+  mm_clk <= NOT mm_clk OR tb_end AFTER c_mm_clk_period/2;
+  mm_rst <= '1', '0' AFTER c_mm_clk_period*7;
 
   -----------------------------------------------------------------------------
   -- Generate packet streams
@@ -84,32 +88,37 @@ BEGIN
   gen_generate_packets : FOR i IN 0 TO c_nof_inputs-1 GENERATE
     p_generate_packets : PROCESS
     BEGIN
-      proc_dp_gen_block_data_src_out_arr(i) <= c_dp_sosi_rst;
+      dp_gen_block_data_src_out_arr(i) <= c_dp_sosi_rst;
   
       proc_common_wait_until_low(dp_clk, dp_rst);
-      proc_common_wait_some_cycles(dp_clk, 5);
+      --proc_common_wait_some_cycles(dp_clk, 4);
   
-      FOR j IN 0 TO c_nof_packets-1 LOOP
-        -- Generate single packet
-        proc_dp_gen_block_data(c_data_w, i*1000, c_packet_len, 0, 0, '0', "0", dp_clk, proc_dp_gen_block_data_in_en, proc_dp_gen_block_data_src_in, proc_dp_gen_block_data_src_out_arr(i)); 
+      -- Generate single packet
+      proc_dp_gen_block_data(c_data_w, i*1000, c_packet_len, 0, 0, '0', "0", dp_clk, dp_gen_block_data_in_en, dp_gen_block_data_src_in, dp_gen_block_data_src_out_arr(i)); 
   
-        -- Insert optional gap between the packets
-        proc_common_wait_some_cycles(dp_clk, c_packet_gap);
-      END LOOP;
-      WAIT;
+      -- Insert optional gap between the packets
+      proc_common_wait_some_cycles(dp_clk, i);
+      WAIT FOR 0 ns;
     END PROCESS;
   END GENERATE;
 
   -----------------------------------------------------------------------------
   -- MM write different input selections
   -----------------------------------------------------------------------------
-  p_generate_packets : PROCESS
+  p_switch_inputs : PROCESS
   BEGIN
-    reg_dp_switch_mosi <= c_mem_mosi_rst;
     proc_common_wait_until_low(mm_clk, mm_rst);
-    proc_common_wait_some_cycles(mm_clk, 15);
-    proc_mem_mm_bus_wr(0, 1, mm_clk, reg_dp_switch_mosi);
-  WAIT;
+    reg_dp_switch_mosi <= c_mem_mosi_rst;
+    proc_common_wait_some_cycles(mm_clk, 1);
+    FOR I IN 0 TO c_nof_switch_runs-1 LOOP
+      FOR J IN 0 TO c_nof_inputs-1 LOOP
+        proc_mem_mm_bus_wr(0, J, mm_clk, reg_dp_switch_mosi);
+        proc_common_wait_some_cycles(mm_clk, 100);
+
+      END LOOP;
+    END LOOP;
+    tb_end <= '1';      
+    WAIT;
   END PROCESS;
 
   -----------------------------------------------------------------------------
@@ -117,13 +126,13 @@ BEGIN
   -- . Both inputs carry the same generated stream
   -----------------------------------------------------------------------------
   gen_dp_switch_snk_in_arr : FOR i IN 0 TO c_nof_inputs-1 GENERATE
-    dp_switch_snk_in_arr(i) <= proc_dp_gen_block_data_src_out_arr(i);
+    dp_switch_snk_in_arr(i) <= dp_gen_block_data_src_out_arr(i);
   END GENERATE;
 
   u_dp_switch : ENTITY work.dp_switch
   GENERIC MAP (
     g_nof_inputs      => c_nof_inputs,
-    g_default_enabled => 2 
+    g_default_enabled => 0 
    )
   PORT MAP (
     dp_clk      => dp_clk,
-- 
GitLab