diff --git a/libraries/base/diag/tb/vhdl/tb_diag_block_gen.vhd b/libraries/base/diag/tb/vhdl/tb_diag_block_gen.vhd
index 9338804f348c41bb87ec38be1e42f20ca05332b0..e46bcffc92296cbd5a7655ccdc339cd618305e70 100644
--- a/libraries/base/diag/tb/vhdl/tb_diag_block_gen.vhd
+++ b/libraries/base/diag/tb/vhdl/tb_diag_block_gen.vhd
@@ -48,6 +48,7 @@ END tb_diag_block_gen;
 ARCHITECTURE tb OF tb_diag_block_gen IS
 
   CONSTANT clk_period       : TIME    := 10 ns;
+  CONSTANT c_timeout        : NATURAL := 1000;
   
   -- Default settings
   CONSTANT c_buf            : t_c_mem := (latency  => 1,
@@ -62,6 +63,7 @@ ARCHITECTURE tb OF tb_diag_block_gen IS
   CONSTANT c_cntr_incr  : INTEGER := 1;
   CONSTANT c_cntr_arr   : t_slv_32_arr(c_buf.nof_dat-1 DOWNTO 0) := flip(array_init(c_cntr_init, c_buf.nof_dat, c_cntr_incr));
                                              
+  -- Default BG control
   CONSTANT c_bg_ctrl    : t_diag_block_gen := (        '0',      
                                                        '0',      
                                                TO_UVEC(96, c_diag_bg_samples_per_packet_w), 
@@ -70,11 +72,26 @@ ARCHITECTURE tb OF tb_diag_block_gen IS
                                                TO_UVEC( 0, c_diag_bg_mem_low_adrs_w),      
                                                TO_UVEC(95, c_diag_bg_mem_high_adrs_w), 
                                                TO_UVEC(42, c_diag_bg_bsn_init_w));
-                                               
-  CONSTANT c_alternative_samples_per_packet : NATURAL := c_buf.nof_dat;
+  CONSTANT c_bg_period  : NATURAL := TO_UINT(c_bg_ctrl.samples_per_packet) + TO_UINT(c_bg_ctrl.gapsize);
+  
+  -- Some alternative BG control settings
+  CONSTANT c_more_samples_per_packet        : NATURAL := c_buf.nof_dat;
+  CONSTANT c_less_samples_per_packet        : NATURAL := 5;
   CONSTANT c_alternative_mem_high_adrs      : NATURAL := 64;
   CONSTANT c_alternative_data_gap           : NATURAL := TO_UINT(c_bg_ctrl.mem_high_adrs)-c_alternative_mem_high_adrs;
                                                
+  -- Another BG control for verifying XON
+  CONSTANT c_bg_ctrl2   : t_diag_block_gen := (        '0',      
+                                                       '0',      
+                                               TO_UVEC(17, c_diag_bg_samples_per_packet_w), 
+                                               TO_UVEC(10, c_diag_bg_blocks_per_sync_w),      
+                                               TO_UVEC( 0, c_diag_bg_gapsize_w), 
+                                               TO_UVEC( 0, c_diag_bg_mem_low_adrs_w),      
+                                               TO_UVEC(16, c_diag_bg_mem_high_adrs_w), 
+                                               TO_UVEC( 0, c_diag_bg_bsn_init_w));
+                                               
+  CONSTANT c_bg_period2 : NATURAL := TO_UINT(c_bg_ctrl2.samples_per_packet) + TO_UINT(c_bg_ctrl2.gapsize);
+                                               
   SIGNAL tb_end         : STD_LOGIC := '0';
   SIGNAL rst            : STD_LOGIC;
   SIGNAL clk            : STD_LOGIC := '1';
@@ -90,6 +107,7 @@ ARCHITECTURE tb OF tb_diag_block_gen IS
   
   SIGNAL bg_ctrl        : t_diag_block_gen;
                                                                             
+  SIGNAL out_siso       : t_dp_siso;
   SIGNAL out_sosi       : t_dp_sosi;
   SIGNAL prev_out_sosi  : t_dp_sosi;
   SIGNAL hold_sop       : STD_LOGIC;
@@ -99,10 +117,12 @@ ARCHITECTURE tb OF tb_diag_block_gen IS
 BEGIN
 
   rst <= '1', '0' AFTER clk_period/10;
+
   clk <= NOT clk OR tb_end AFTER clk_period/2;
   
   p_stimuli : PROCESS
   BEGIN
+    out_siso <= c_dp_siso_rdy;
     bg_ctrl <= c_bg_ctrl;
     proc_common_wait_until_low(clk, rst);       -- Wait until reset has finished
     proc_common_wait_some_cycles(clk, 10);
@@ -137,22 +157,47 @@ BEGIN
     bg_ctrl.enable <= '0';
     proc_common_wait_some_cycles(clk, 100); 
     bg_ctrl <= c_bg_ctrl;
-    bg_ctrl.mem_high_adrs <= TO_UVEC(c_alternative_mem_high_adrs, c_diag_bg_mem_high_adrs_w);
     bg_ctrl.enable <= '1';
     proc_dp_verify_run_some_cycles(5, 1500, 0, clk, verify_en);
     
     -- . change gapsize dynamically
-    bg_ctrl.gapsize <= c_bg_ctrl.gapsize;
+    bg_ctrl.gapsize <= TO_UVEC(0, c_diag_bg_gapsize_w);
     proc_dp_verify_run_some_cycles(0, 1500, 0, clk, verify_en);
 
+    bg_ctrl.gapsize <= c_bg_ctrl.gapsize;
+    proc_dp_verify_run_some_cycles(0, 1500, 0, clk, verify_en);
+    
     -- . change mem_high_adrs dynamically
-    bg_ctrl.mem_high_adrs <= c_bg_ctrl.mem_high_adrs;      -- increase, because decreasing could yield an verify data error
+    bg_ctrl.mem_high_adrs <= TO_UVEC(c_alternative_mem_high_adrs, c_diag_bg_mem_high_adrs_w);
+    proc_dp_verify_run_some_cycles(5, 1500, 0, clk, verify_en);
+    
+    bg_ctrl.mem_high_adrs <= c_bg_ctrl.mem_high_adrs;
     proc_dp_verify_run_some_cycles(0, 1500, 0, clk, verify_en);
         
     -- . change samples_per_packet dynamically
-    bg_ctrl.samples_per_packet <= TO_UVEC(c_alternative_samples_per_packet, c_diag_bg_samples_per_packet_w);   -- increase, because decreasing could yield an verify data error
+    proc_common_wait_until_high(c_timeout, clk, out_sosi.sop);
+    proc_common_wait_some_cycles(clk, 10);
+    bg_ctrl.samples_per_packet <= TO_UVEC(c_more_samples_per_packet, c_diag_bg_samples_per_packet_w);   -- increase
+    proc_dp_verify_run_some_cycles(0, 1500, 0, clk, verify_en);
+    
+    -- . change samples_per_packet dynamically
+    proc_common_wait_until_high(c_timeout, clk, out_sosi.sop);
+    proc_common_wait_some_cycles(clk, c_less_samples_per_packet*2);
+    bg_ctrl.samples_per_packet <= TO_UVEC(c_less_samples_per_packet, c_diag_bg_samples_per_packet_w);   -- decrease, could yield proc_dp_verify_block_size() error if it occurs during a packet
     proc_dp_verify_run_some_cycles(0, 1500, 0, clk, verify_en);
     
+    -- Run with XON flow control (verified by proc_dp_verify_block_size)
+    bg_ctrl.enable <= '0';
+    proc_common_wait_some_cycles(clk, 100); 
+    bg_ctrl <= c_bg_ctrl2;
+    bg_ctrl.enable <= '1';
+    FOR I IN 0 TO c_bg_period2*3 LOOP
+      out_siso <= c_dp_siso_rdy;
+      proc_common_wait_some_cycles(clk, c_bg_period2*3+1);
+      out_siso <= c_dp_siso_rst;
+      proc_common_wait_some_cycles(clk, c_bg_period2*3);
+    END LOOP;
+    
     -- End simulation
     tb_end <= '1';
     WAIT;
@@ -205,6 +250,7 @@ BEGIN
     buf_rddat   => bg_buf_miso.rddata(c_buf.dat_w-1 DOWNTO 0),   
     buf_rdval   => bg_buf_miso.rdval,   
     ctrl        => bg_ctrl,
+    out_siso    => out_siso,
     out_sosi    => out_sosi
   );