diff --git a/libraries/base/dp/tb/vhdl/tb_dp_selector_arr.vhd b/libraries/base/dp/tb/vhdl/tb_dp_selector_arr.vhd
index e2aa2378a39b58a5f575316c8ffa5c9538b0e970..4114b4c0f60d60ce4459d3595d9c20cfaf7fe291 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_selector_arr.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_selector_arr.vhd
@@ -22,10 +22,13 @@
 --
 -- Author: R. van der Walle
 -- Purpose:
--- . Test bench for dp_selector_arr
+--  Test bench for dp_selector_arr
 -- Description:
--- . A data stream is offered to g_nof_streams=4 inputs of the DUT. 
---   A process asserts mm accesses in time to switch the streams. 
+--  . Two data stream arrays are offered with g_nof_streams=4 to two DUTs. The
+--    streams are distinguished by an offset in the data fiels, defined by 
+--    c_pipe_data_offset
+--  . One DUT selects one array and the other DUT selects the other array. 
+--  . The output of the DUTs are compared to the expected output.
 --
 -- Usage:
 -- > as 10
@@ -67,6 +70,8 @@ ARCHITECTURE tb OF tb_dp_selector_arr IS
   CONSTANT c_bsn_init               : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := X"0000000000000000";  -- X"0877665544332211"
   CONSTANT c_err_init               : NATURAL := 247;
   CONSTANT c_channel_init           : INTEGER := 5;  -- fixed
+
+  CONSTANT c_pipe_data_offset       : INTEGER := 1000;
   
   SIGNAL tb_end                     : STD_LOGIC := '0';
   SIGNAL clk                        : STD_LOGIC := '1';
@@ -76,12 +81,13 @@ ARCHITECTURE tb OF tb_dp_selector_arr IS
   SIGNAL stimuli_src_in             : t_dp_siso;
   SIGNAL stimuli_src_out            : t_dp_sosi;
   
-  SIGNAL in_sosi_arr    : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL ref_sosi_arr    : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
   SIGNAL pipe_sosi_arr  : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
-  SIGNAL out_sosi_arr   : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0);
+  SIGNAL out_pipe_sosi_arr   : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0);
+  SIGNAL out_ref_sosi_arr   : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0);
 
-  SIGNAL mm_mosi : t_mem_mosi;
-  SIGNAL mm_miso : t_mem_miso;
+  SIGNAL mm_mosi_pipe : t_mem_mosi;
+  SIGNAL mm_mosi_ref  : t_mem_mosi;
 
 BEGIN
 
@@ -129,29 +135,52 @@ BEGIN
       -- Insert optional gap between the packets
       proc_common_wait_some_cycles(clk, g_pkt_gap);
     END LOOP;
+   
+    -- Determine expected sosi field values after end of stimuli
+    -- . e_qual
+    v_sosi.bsn     := STD_LOGIC_VECTOR( UNSIGNED(c_bsn_init) + g_nof_repeat-1);
+    v_sosi.channel := TO_DP_CHANNEL(c_channel_init           + g_nof_repeat-1);
+    v_sosi.err     := TO_DP_ERROR(c_err_init                 + g_nof_repeat-1);
+    -- . account for g_pkt_len
+    v_sosi.data    := INCR_UVEC(v_sosi.data, g_pkt_len-1);
+    v_sosi.data    := RESIZE_DP_DATA(v_sosi.data(g_in_dat_w-1 DOWNTO 0));  -- wrap when >= 2**g_in_dat_w
     
+    proc_common_wait_some_cycles(clk, 100);  -- latency from stimuli to verify depends on the flow control, so wait sufficiently long for last packet to have passed through
+
+    FOR I IN 0 TO c_nof_streams-1 LOOP
+      ASSERT SIGNED(v_sosi.channel)=SIGNED(out_ref_sosi_arr(I).channel) REPORT "Unexpected channel from dut_ref output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.channel)=SIGNED(out_pipe_sosi_arr(I).channel) REPORT "Unexpected channel from dut_pipe output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.err)=SIGNED(out_ref_sosi_arr(I).err) REPORT "Unexpected err from dut_ref output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.err)=SIGNED(out_pipe_sosi_arr(I).err) REPORT "Unexpected err from dut_pipe output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.bsn)=SIGNED(out_ref_sosi_arr(I).bsn) REPORT "Unexpected bsn from dut_ref output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.bsn)=SIGNED(out_pipe_sosi_arr(I).bsn) REPORT "Unexpected bsn from dut_pipe output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.data)=SIGNED(out_ref_sosi_arr(I).data) REPORT "Unexpected data from dut_ref output." SEVERITY ERROR;
+      ASSERT SIGNED(v_sosi.data)+c_pipe_data_offset=SIGNED(out_pipe_sosi_arr(I).data) REPORT "Unexpected data from dut_pipe output." SEVERITY ERROR;
+    END LOOP;
+
     -- Signal end of stimuli
     proc_common_wait_some_cycles(clk, 50);
     tb_end <= '1';
     WAIT;
   END PROCESS;
-  
+ 
+  stimuli_src_in <= c_dp_siso_rdy;
+
   gen_connect : FOR I IN 0 TO c_nof_streams-1 generate
-    in_sosi_arr(i) <= stimuli_src_out;
+    ref_sosi_arr(i) <= stimuli_src_out;
   END GENERATE;
-  
-  stimuli_src_in <= c_dp_siso_rdy;
-  
-  -- Add 1000 to pipe_sosi_arr data to differentiate it from ref_sosi_arr
-  p_pipe_sosi: PROCESS(in_sosi_arr)
+ 
+  -- Add offset to pipe_sosi_arr data to differentiate it from ref_sosi_arr
+  p_pipe_sosi: PROCESS(stimuli_src_out)
   BEGIN
-    pipe_sosi_arr <= in_sosi_arr;
     FOR I IN 0 TO c_nof_streams-1 LOOP
-      pipe_sosi_arr(I).data <= RESIZE_DP_DATA(INCR_UVEC(in_sosi_arr(I).data, 1000)(g_in_dat_w-1 DOWNTO 0));
+      pipe_sosi_arr(I) <= stimuli_src_out;
+      pipe_sosi_arr(I).data <= RESIZE_DP_DATA(INCR_UVEC(stimuli_src_out.data, c_pipe_data_offset)(g_in_dat_w-1 DOWNTO 0));
     END LOOP;
   END PROCESS;
 
-  u_dut : ENTITY work.dp_selector_arr 
+  -- DUT that selects pipe_sosi_arr
+  u_dut_pipe : ENTITY work.dp_selector_arr 
   GENERIC MAP(
     g_nof_arr     => c_nof_streams,
     g_pipeline    => 1
@@ -161,8 +190,8 @@ BEGIN
     mm_rst       => rst,
     mm_clk       => clk,
 
-    reg_selector_mosi     => mm_mosi,
-    reg_selector_miso     => mm_miso,
+    reg_selector_mosi     => mm_mosi_pipe,
+    reg_selector_miso     => OPEN,
     
     -- Streaming clock domain
     dp_rst       => rst,  
@@ -170,24 +199,41 @@ BEGIN
 
     -- ST sinks
     pipe_sosi_arr  => pipe_sosi_arr, 
-    ref_sosi_arr   => in_sosi_arr, 
+    ref_sosi_arr   => ref_sosi_arr, 
     -- ST source
-    out_sosi_arr  => out_sosi_arr
+    out_sosi_arr  => out_pipe_sosi_arr
+  );
+
+  -- DUT that selects ref_sosi_arr
+  u_dut_ref : ENTITY work.dp_selector_arr 
+  GENERIC MAP(
+    g_nof_arr     => c_nof_streams,
+    g_pipeline    => 1
+  )
+  PORT MAP(
+    -- Memory-mapped clock domain
+    mm_rst       => rst,
+    mm_clk       => clk,
+
+    reg_selector_mosi     => mm_mosi_ref,
+    reg_selector_miso     => OPEN,
+    
+    -- Streaming clock domain
+    dp_rst       => rst,  
+    dp_clk       => clk,  
+
+    -- ST sinks
+    pipe_sosi_arr  => pipe_sosi_arr, 
+    ref_sosi_arr   => ref_sosi_arr, 
+    -- ST source
+    out_sosi_arr  => out_ref_sosi_arr
   );
  
   p_stim: PROCESS
   BEGIN
      WAIT UNTIL rst='0';
-     proc_mem_mm_bus_wr(0, x"0", clk, mm_mosi);
-
-     WAIT FOR 500 ns;
-     
-     proc_mem_mm_bus_wr(0, x"1", clk, mm_mosi);
-
-     WAIT FOR 1200 ns;
-     
-     proc_mem_mm_bus_wr(0, x"0", clk, mm_mosi);
-
+     proc_mem_mm_bus_wr(0, x"0", clk, mm_mosi_ref); -- select ref_sosi_arr on dut_ref
+     proc_mem_mm_bus_wr(0, x"1", clk, mm_mosi_pipe); -- select pipe_sosi_arr on dut_pipe
      WAIT;
    END PROCESS;