diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
index bbee27df24723c76d0b29015a0889376ae8d9271..404004d0091ca87287f1c409b95b746f5f5a37ff 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
@@ -86,9 +86,9 @@ entity tb_lofar2_unb2c_sdp_station_tbuf_one is
     g_tb_index                 : natural := 0;
     g_use_bf                   : boolean := false;
     g_processing_enable_toggle : boolean := false;
-    g_verify_crc_error         : boolean := true;  -- false for correct CRC, true to cause CRC error for all read pages
+    g_verify_crc_error         : boolean := false;  -- false for correct CRC, true to cause CRC error for all read pages
     g_verify_rsn_error         : boolean := false;  -- false for correct RSN, true to cause RSN error for all read pages
-    g_sp                       : natural := 13;  -- signal path (SP) index in range(S_pn = 12) for WG sinus, >= 12
+    g_sp                       : natural := 3;  -- signal path (SP) index in range(S_pn = 12) for WG sinus, >= 12
                                                 -- for DC at g_sp
     g_ddr_access_rate_pct      : natural := 100;  -- throttle memory acces rate, full rate is 100 %
     g_ddr_buffer_size          : natural := 256;  -- <= 4096, because c_tech_ddr4_sim_4k_64 has 4k = 4096 words of
@@ -272,12 +272,42 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is
   constant c_mm_file_reg_dp_xonoff_tbuf   : string := c_mmf_prefix & "REG_DP_XONOFF_TBUF";
   constant c_mm_file_reg_nw_10gbe_mac     : string := c_mmf_prefix & "REG_NW_10GBE_MAC";
 
+  procedure proc_read_ddr4_wr_fifo_status(signal tb_clk           : in std_logic;
+                                          signal rd_data          : inout std_logic_vector(c_32 - 1 downto 0);
+                                          signal ddr_wr_fifo_used : inout natural;
+                                          signal ddr_wr_fifo_full : inout std_logic) is
+  begin
+    mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 2, rd_data, tb_clk);
+    ddr_wr_fifo_used <= to_uint(rd_data);
+    mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 3, rd_data, tb_clk);
+    ddr_wr_fifo_full <= rd_data(0);
+    proc_common_wait_some_cycles(tb_clk, 1);
+    print_str(c_tb_str & "ddr_wr_fifo_full = " & sl_to_str(ddr_wr_fifo_full));
+    print_str(c_tb_str & "ddr_wr_fifo_used = " & int_to_str(ddr_wr_fifo_used));
+  end procedure;
+
+  procedure proc_read_ddr4_rd_fifo_status(signal tb_clk           : in std_logic;
+                                          signal rd_data          : inout std_logic_vector(c_32 - 1 downto 0);
+                                          signal ddr_rd_fifo_used : inout natural;
+                                          signal ddr_rd_fifo_full : inout std_logic) is
+  begin
+    mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 1, rd_data, tb_clk);
+    ddr_rd_fifo_used <= to_uint(rd_data);
+    mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 3, rd_data, tb_clk);
+    ddr_rd_fifo_full <= rd_data(0);
+    proc_common_wait_some_cycles(tb_clk, 1);
+    print_str(c_tb_str & "ddr_rd_fifo_full = " & sl_to_str(ddr_rd_fifo_full));
+    print_str(c_tb_str & "ddr_rd_fifo_used = " & int_to_str(ddr_rd_fifo_used));
+  end procedure;
+
   signal wg_started           : std_logic := '0';
   signal rx_done              : std_logic := '0';
   signal tb_almost_end        : std_logic := '0';
   signal i_tb_end             : std_logic := '0';
   signal tb_clk               : std_logic := '0';
   signal rd_data_setup        : std_logic_vector(c_32 - 1 downto 0);
+  signal rd_data_state        : std_logic_vector(c_32 - 1 downto 0);
+  signal rd_data_fifo         : std_logic_vector(c_32 - 1 downto 0);
   signal rd_data_control      : std_logic_vector(c_32 - 1 downto 0);
   signal rd_data_monitor      : std_logic_vector(c_32 - 1 downto 0);
   signal rd_data_bsn          : std_logic_vector(c_32 - 1 downto 0);
@@ -298,7 +328,11 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is
   signal rd_cep_udp_src_port : std_logic_vector(15 downto 0);
   signal rd_cep_udp_dst_port : std_logic_vector(15 downto 0);
 
-  signal rd_ddr_status               : std_logic_vector(31 downto 0);
+  signal ddr_status                  : std_logic_vector(31 downto 0);
+  signal ddr_wr_fifo_used            : natural;
+  signal ddr_rd_fifo_used            : natural;
+  signal ddr_wr_fifo_full            : std_logic;
+  signal ddr_rd_fifo_full            : std_logic;
   signal ddr_dvr_done                : std_logic := '0';
   signal ddr_ctlr_nof_bytes_per_word : natural;
 
@@ -733,18 +767,18 @@ begin
     -- Read DDR4 memory status
     ----------------------------------------------------------------------------
     mmf_mm_bus_rd(c_mm_file_reg_io_ddr_mb_i, 0, rd_data_setup, tb_clk);
-    rd_ddr_status <= rd_data_setup;
+    ddr_status <= rd_data_setup;
     proc_common_wait_some_cycles(tb_clk, 1);
 
     -- . verify dvr_done for calibration ok
-    ddr_dvr_done <= rd_ddr_status(0);
+    ddr_dvr_done <= ddr_status(0);
     proc_common_wait_some_cycles(tb_clk, 1);
     assert ddr_dvr_done = '1'
       report c_tb_str & "Wrong no DDR MB_I"
       severity ERROR;
 
     -- . verify ddr_ctlr_nof_bytes_per_word
-    ddr_ctlr_nof_bytes_per_word <= TO_UINT(rd_ddr_status(15 downto 8));
+    ddr_ctlr_nof_bytes_per_word <= TO_UINT(ddr_status(15 downto 8));
     proc_common_wait_some_cycles(tb_clk, 1);
     assert ddr_ctlr_nof_bytes_per_word = c_exp_ddr_ctlr_nof_bytes_per_word
       report c_tb_str & "Wrong read ddr_ctlr_nof_bytes_per_word"
@@ -811,7 +845,7 @@ begin
     mmf_mm_wait_until_value(
         c_mm_file_reg_bsn_scheduler_wg, 0,  -- read BSN low part
         "UNSIGNED", rd_data_bsn, ">=", c_bsn_start_wg,  -- this is the wait until condition
-        c_T_bs_period, tb_clk);
+        c_T_bs_period, ext_clk);
 
     -- WG started
     wg_started <= '1';
@@ -853,6 +887,7 @@ begin
   end process;
 
   p_mm_tbuf_control : process
+    variable v_bool               : boolean;
     variable v_recorded_nof_pages : natural;
     variable v_Begin              : natural;
     variable v_End                : natural;
@@ -871,6 +906,12 @@ begin
     -- Wait for DUT power up after reset
     wait for 200 ns;
 
+    ----------------------------------------------------------------------------
+    -- Read DDR4 FIFOs status
+    ----------------------------------------------------------------------------
+    proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full);
+    proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full);
+
     ----------------------------------------------------------------------------
     -- Record all antennas
     ----------------------------------------------------------------------------
@@ -926,9 +967,17 @@ begin
     print_str(c_tb_str & "tbuf_registers_rd.record_enable = " & sl_to_str(tbuf_registers_rd.record_enable));
     print_str(c_tb_str & "tbuf_registers_ro.record_busy = " & sl_to_str(tbuf_registers_ro.record_busy));
 
+    -- Read TBuf state
+    mmf_mm_bus_rd(c_mm_file_reg_tbuf, 19, rd_data_state, tb_clk);
+    proc_common_wait_some_cycles(tb_clk, 1);
+    v_bool := func_sdp_tbuf_print_state(rd_data_state);
+
     -- Recording
     proc_common_wait_some_cycles(ext_clk, g_rs_block_size * g_rs_record_nof_block);
 
+    -- Read DDR4 write FIFO status
+    proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full);
+
     -- Read BSN monitor for recording data
     mmf_mm_bus_rd(c_mm_file_reg_bsn_monitor_v2_tbuf, 1, rd_data_monitor, tb_clk);  -- bsn at sync
     recording_rsn_at_sync <= to_uint(rd_data_monitor);
@@ -992,12 +1041,15 @@ begin
     mmf_mm_wait_until_value(
         c_mm_file_reg_tbuf, 18,  -- read record_busy
         "UNSIGNED", rd_data_record_busy, "=", 0,  -- this is the wait until condition
-        c_T_rd_interval, tb_clk);
+        c_T_rd_interval, ext_clk);
     tbuf_registers_ro.record_busy <= rd_data_record_busy(0);
     proc_common_wait_some_cycles(tb_clk, 1);
     print_str(c_tb_str & "tbuf_registers_rd.record_enable = " & sl_to_str(tbuf_registers_rd.record_enable));
     print_str(c_tb_str & "tbuf_registers_ro.record_busy = " & sl_to_str(tbuf_registers_ro.record_busy));
 
+    -- Read DDR4 write FIFO status
+    proc_read_ddr4_wr_fifo_status(tb_clk, rd_data_fifo, ddr_wr_fifo_used, ddr_wr_fifo_full);
+
     -- Read number of recorded pages
     mmf_mm_bus_rd(c_mm_file_reg_tbuf, 4, rd_data_control, tb_clk);
     tbuf_registers_ro.recorded_nof_pages <= to_uint(rd_data_control);
@@ -1104,13 +1156,17 @@ begin
       severity ERROR;
     print_str(c_tb_str & "tbuf_registers_rd.dump_enables = " & slv_to_str(tbuf_registers_rd.dump_enables));
 
+    -- Read DDR4 read FIFO status
+    proc_common_wait_some_cycles(ext_clk, 10);
+    proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full);
+
     ----------------------------------------------------------------------------
     -- Wait until dump is done
     ----------------------------------------------------------------------------
     mmf_mm_wait_until_value(
         c_mm_file_reg_tbuf, 17,  -- read dump_done
         "UNSIGNED", rd_data_dump_done, "=", 1,  -- this is the wait until condition
-        c_T_rd_interval, tb_clk);
+        c_T_rd_interval, ext_clk);
     tbuf_registers_ro.dump_done <= rd_data_dump_done(0);
     proc_common_wait_some_cycles(tb_clk, 1);
 
@@ -1135,6 +1191,9 @@ begin
     proc_common_wait_some_cycles(ext_clk, g_rs_block_size * 4);
     rx_done <= '1';
 
+    -- Read DDR4 read FIFO status
+    proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full);
+
     -- Read strobe_total_counts
     mmf_mm_bus_rd(c_mm_file_reg_strobe_total_count_tbuf, 0, rd_data_strobe, tb_clk);
     tbuf_strobe_total_counts.memory_read_nof_packets <= to_uint(rd_data_strobe);
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd
index 3a977d64df67b09ce9b375709ed15d9122293b02..54f8c26d7cb9b75285aef0d44dbda5fa6441c395 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_transient_buffer.vhd
@@ -223,6 +223,7 @@ begin
   tbuf_registers_ro.nof_pages_in_buffer <= c_nof_pages_in_buffer;
   tbuf_registers_ro.dump_done <= tbuf_state_rec.dump_done;
   tbuf_registers_ro.record_busy <= tbuf_state_rec.record_busy;
+  tbuf_registers_ro.state <= tbuf_state_slv;
 
   ddr4_I_cal_ok           <= tbuf_state_rec.ddr4_I_cal_ok;
   tbuf_state_rec.dvr_done <= dvr_cipo.done;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
index ce4e316d9d7cbb263550593a81f50bb8b5e5dd17..368e2f54e923c61d6eddddaf726931149f81a23f 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
@@ -74,7 +74,7 @@ package sdp_tbuf_pkg is
                                  s_dump_done);  -- = 0, 1, 2, 3, 4, 5, 6
 
   -- TBuf state word [31:0]
-  type t_sdp_tbuf_state is record                                          -- bit index
+  type t_sdp_tbuf_state is record                                       -- bit index
     ddr4_I_cal_ok         : std_logic;                                  -- 0
     dvr_done              : std_logic;                                  -- 1
     fsm_arbiter           : t_sdp_tbuf_fsm_arbiter;                     -- 3:2
@@ -89,7 +89,7 @@ package sdp_tbuf_pkg is
     dump_en               : std_logic;                                  -- 23
     dump_busy             : std_logic;                                  -- 24
     dump_done             : std_logic;                                  -- 25
-    dump_ai               : std_logic_vector(2 downto 0);               -- 28:26
+    dump_ai               : natural;                                    -- 28:26
   end record;
 
   -----------------------------------------------------------------------------
@@ -322,7 +322,11 @@ package sdp_tbuf_pkg is
   function func_sdp_tbuf_fsm_arbiter_to_slv(fsm : t_sdp_tbuf_fsm_arbiter) return std_logic_vector;
   function func_sdp_tbuf_fsm_writer_to_slv(fsm : t_sdp_tbuf_fsm_writer) return std_logic_vector;
   function func_sdp_tbuf_fsm_reader_to_slv(fsm : t_sdp_tbuf_fsm_reader) return std_logic_vector;
-  function func_sdp_tbuf_map_state(state : t_sdp_tbuf_state) return std_logic_vector;
+  function func_sdp_tbuf_fsm_arbiter_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_arbiter;
+  function func_sdp_tbuf_fsm_writer_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_writer;
+  function func_sdp_tbuf_fsm_reader_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_reader;
+  function func_sdp_tbuf_map_state(state_rec : t_sdp_tbuf_state) return std_logic_vector;
+  function func_sdp_tbuf_map_state(state_slv : std_logic_vector) return t_sdp_tbuf_state;
   function func_sdp_tbuf_map_cep_header(hdr_fields_raw : std_logic_vector) return t_sdp_tbuf_cep_header;
 end package sdp_tbuf_pkg;
 
@@ -454,6 +458,16 @@ package body sdp_tbuf_pkg is
     end case;
   end func_sdp_tbuf_fsm_arbiter_to_slv;
 
+  function func_sdp_tbuf_fsm_arbiter_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_arbiter is
+    variable v_fsm : natural := to_uint(fsm);
+  begin
+    case v_fsm is
+      when 0      => return s_idle;
+      when 1      => return s_recording;
+      when others => return s_dumping;
+    end case;
+  end func_sdp_tbuf_fsm_arbiter_to_enum;
+
   function func_sdp_tbuf_fsm_writer_to_slv(fsm : t_sdp_tbuf_fsm_writer) return std_logic_vector is
     constant c_fsm_w : natural := 2;
   begin
@@ -465,6 +479,17 @@ package body sdp_tbuf_pkg is
     end case;
   end func_sdp_tbuf_fsm_writer_to_slv;
 
+  function func_sdp_tbuf_fsm_writer_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_writer is
+    variable v_fsm : natural := to_uint(fsm);
+  begin
+    case v_fsm is
+      when 0      => return s_idle;
+      when 1      => return s_write_start;
+      when 2      => return s_write_busy;
+      when others => return s_write_done;
+    end case;
+  end func_sdp_tbuf_fsm_writer_to_enum;
+
   function func_sdp_tbuf_fsm_reader_to_slv(fsm : t_sdp_tbuf_fsm_reader) return std_logic_vector is
     constant c_fsm_w : natural := 3;
   begin
@@ -479,27 +504,62 @@ package body sdp_tbuf_pkg is
     end case;
   end func_sdp_tbuf_fsm_reader_to_slv;
 
-  function func_sdp_tbuf_map_state(state : t_sdp_tbuf_state) return std_logic_vector is
+  function func_sdp_tbuf_fsm_reader_to_enum(fsm : std_logic_vector) return t_sdp_tbuf_fsm_reader is
+    variable v_fsm : natural := to_uint(fsm);
+  begin
+    case v_fsm is
+      when 0      => return s_idle;
+      when 1      => return s_dump_start;
+      when 2      => return s_dump_antenna;
+      when 3      => return s_read_block;
+      when 4      => return s_read_gap;
+      when 5      => return s_read_done;
+      when others => return s_dump_done;
+    end case;
+  end func_sdp_tbuf_fsm_reader_to_enum;
+
+  function func_sdp_tbuf_map_state(state_rec : t_sdp_tbuf_state) return std_logic_vector is
     variable v_slv : std_logic_vector(c_word_w - 1 downto 0) := (others => '0');
   begin
-    v_slv( 0)           := state.ddr4_I_cal_ok;
-    v_slv( 1)           := state.dvr_done;
-    v_slv( 3 downto 2)  := func_sdp_tbuf_fsm_arbiter_to_slv(state.fsm_arbiter);
-    v_slv( 5 downto 4)  := func_sdp_tbuf_fsm_writer_to_slv(state.fsm_writer);
-    v_slv( 6)           := state.record_enable;
-    v_slv( 7)           := state.record_busy;
-    v_slv( 8)           := state.record_all;
-    v_slv( 9)           := state.record_buf_full;
-    v_slv(13 downto 10) := state.record_sop_fifo_usedw;
-    v_slv(16 downto 14) := func_sdp_tbuf_fsm_reader_to_slv(state.fsm_reader);
-    v_slv(22 downto 17) := state.dump_enables;
-    v_slv(23)           := state.dump_en;
-    v_slv(24)           := state.dump_busy;
-    v_slv(25)           := state.dump_done;
-    v_slv(28 downto 26) := state.dump_ai;
+    v_slv( 0)           := state_rec.ddr4_I_cal_ok;
+    v_slv( 1)           := state_rec.dvr_done;
+    v_slv( 3 downto 2)  := func_sdp_tbuf_fsm_arbiter_to_slv(state_rec.fsm_arbiter);
+    v_slv( 5 downto 4)  := func_sdp_tbuf_fsm_writer_to_slv(state_rec.fsm_writer);
+    v_slv( 6)           := state_rec.record_enable;
+    v_slv( 7)           := state_rec.record_busy;
+    v_slv( 8)           := state_rec.record_all;
+    v_slv( 9)           := state_rec.record_buf_full;
+    v_slv(13 downto 10) := state_rec.record_sop_fifo_usedw;
+    v_slv(16 downto 14) := func_sdp_tbuf_fsm_reader_to_slv(state_rec.fsm_reader);
+    v_slv(22 downto 17) := state_rec.dump_enables;
+    v_slv(23)           := state_rec.dump_en;
+    v_slv(24)           := state_rec.dump_busy;
+    v_slv(25)           := state_rec.dump_done;
+    v_slv(28 downto 26) := to_uvec(state_rec.dump_ai, 3);
     return v_slv;
   end func_sdp_tbuf_map_state;
 
+  function func_sdp_tbuf_map_state(state_slv : std_logic_vector) return t_sdp_tbuf_state is
+    variable v_rec : t_sdp_tbuf_state;
+  begin
+    v_rec.ddr4_I_cal_ok         := state_slv( 0);
+    v_rec.dvr_done              := state_slv( 1);
+    v_rec.fsm_arbiter           := func_sdp_tbuf_fsm_arbiter_to_enum(state_slv(3 downto 2));
+    v_rec.fsm_writer            := func_sdp_tbuf_fsm_writer_to_enum(state_slv(5 downto 4));
+    v_rec.record_enable         := state_slv( 6);
+    v_rec.record_busy           := state_slv( 7);
+    v_rec.record_all            := state_slv( 8);
+    v_rec.record_buf_full       := state_slv( 9);
+    v_rec.record_sop_fifo_usedw := state_slv(13 downto 10);
+    v_rec.fsm_reader            := func_sdp_tbuf_fsm_reader_to_enum(state_slv(16 downto 14));
+    v_rec.dump_enables          := state_slv(22 downto 17);
+    v_rec.dump_en               := state_slv(23);
+    v_rec.dump_busy             := state_slv(24);
+    v_rec.dump_done             := state_slv(25);
+    v_rec.dump_ai               := to_uint(state_slv(28 downto 26));
+    return v_rec;
+  end func_sdp_tbuf_map_state;
+
   function func_sdp_tbuf_map_cep_header(hdr_fields_raw : std_logic_vector) return t_sdp_tbuf_cep_header is
     constant c_cep_hfa : t_common_field_arr(c_sdp_tbuf_hdr_field_arr'range) := c_sdp_tbuf_hdr_field_arr;
     variable v : t_sdp_tbuf_cep_header;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
index 942e84091728796b4871847e9bc81c6808d372d7..f417a36f52f4e4493850fdaacaeaf90365b8c0df 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
@@ -66,7 +66,7 @@ entity sdp_tbuf_reader is
     fsm              : out t_sdp_tbuf_fsm_reader;
     dump_busy        : out std_logic;
     dump_done        : out std_logic;
-    dump_ai          : out std_logic_vector(2 downto 0)  -- for t_sdp_tbuf_state.dump_ai[2:0]
+    dump_ai          : out natural
   );
 end sdp_tbuf_reader;
 
@@ -434,5 +434,5 @@ begin
   reader_copi <= r.reader_copi;
   dump_busy   <= r.dump_busy;
   dump_done   <= r.dump_done;
-  dump_ai     <= TO_UVEC(r.ai, 3);  -- for t_sdp_tbuf_state.dump_ai[2:0]
+  dump_ai     <= r.ai;
 end str;
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
index 04aca7bac5162ccfb747d8bd9582ab80dca6d13b..2b8cbab7709419dad1de68c172d1d5a1f783b444 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
@@ -29,6 +29,7 @@ library IEEE, common_lib, dp_lib;
   use IEEE.std_logic_1164.all;
   use common_lib.common_pkg.all;
   use common_lib.common_network_layers_pkg.all;
+  use common_lib.common_str_pkg.all;
   use common_lib.tb_common_pkg.all;
   use dp_lib.dp_stream_pkg.all;
   use work.sdp_pkg.all;
@@ -38,6 +39,12 @@ library IEEE, common_lib, dp_lib;
 package tb_sdp_tbuf_pkg is
   function func_sdp_tbuf_calculate_dump_inter_packet_gap(packet_len, link_bps : natural) return natural;
 
+  function func_sdp_tbuf_fsm_arbiter_str(fsm_arbiter : natural) return string;
+  function func_sdp_tbuf_fsm_writer_str(fsm_writer : natural) return string;
+  function func_sdp_tbuf_fsm_reader_str(fsm_reader : natural) return string;
+  function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean;
+  function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean;
+
   -- Transient raw data output via 10GbE to CEP (= central processor)
   function func_sdp_tbuf_compose_cep_header(ip_src_addr             : std_logic_vector;
                                             ip_header_checksum      : natural;
@@ -78,6 +85,74 @@ package body tb_sdp_tbuf_pkg is
     return func_sdp_tbuf_limit_dump_inter_packet_gap(c_gap_size);
   end func_sdp_tbuf_calculate_dump_inter_packet_gap;
 
+  function func_sdp_tbuf_fsm_arbiter_str(fsm_arbiter : natural) return string is
+  begin
+    case fsm_arbiter is
+      when 0 => return "s_idle";
+      when 1 => return "s_recording";
+      when 2 => return "s_dumping";
+      when others => return "";
+    end case;
+  end func_sdp_tbuf_fsm_arbiter_str;
+
+  function func_sdp_tbuf_fsm_writer_str(fsm_writer : natural) return string is
+  begin
+    case fsm_writer is
+      when 0 => return "s_idle";
+      when 1 => return "s_write_start";
+      when 2 => return "s_write_busy";
+      when 3 => return "s_write_done";
+      when others => return "";
+    end case;
+  end func_sdp_tbuf_fsm_writer_str;
+
+  function func_sdp_tbuf_fsm_reader_str(fsm_reader : natural) return string is
+  begin
+    case fsm_reader is
+      when 0 => return "s_idle";
+      when 1 => return "s_dump_start";
+      when 2 => return "s_dump_antenna";
+      when 3 => return "s_read_block";
+      when 4 => return "s_read_gap";
+      when 5 => return "s_read_done";
+      when 6 => return "s_dump_done";
+      when others => return "";
+    end case;
+  end func_sdp_tbuf_fsm_reader_str;
+
+  function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean is
+    constant c_fsm_arbiter_str : string := func_sdp_tbuf_fsm_arbiter_str(
+                                           to_uint(func_sdp_tbuf_fsm_arbiter_to_slv(state_rec.fsm_arbiter)));
+    constant c_fsm_writer_str  : string := func_sdp_tbuf_fsm_writer_str(
+                                           to_uint(func_sdp_tbuf_fsm_writer_to_slv(state_rec.fsm_writer)));
+    constant c_fsm_reader_str  : string := func_sdp_tbuf_fsm_reader_str(
+                                           to_uint(func_sdp_tbuf_fsm_reader_to_slv(state_rec.fsm_reader)));
+  begin
+    print_str("tbuf_state:");
+    print_str(". ddr4_I_cal_ok           = " & sl_to_str(state_rec.ddr4_I_cal_ok));
+    print_str(". dvr_done                = " & sl_to_str(state_rec.dvr_done));
+    print_str(". fsm_arbiter             = " & c_fsm_arbiter_str);
+    print_str(". fsm_writer              = " & c_fsm_writer_str);
+    print_str("    record_enable         = " & sl_to_str(state_rec.record_enable));
+    print_str("    record_busy           = " & sl_to_str(state_rec.record_busy));
+    print_str("    record_all            = " & sl_to_str(state_rec.record_all));
+    print_str("    record_buf_full       = " & sl_to_str(state_rec.record_buf_full));
+    print_str("    record_sop_fifo_usedw = " & int_to_str(to_uint(state_rec.record_sop_fifo_usedw)));
+    print_str(". fsm_reader              = " & c_fsm_reader_str);
+    print_str("    dump_enables          = b" & slv_to_str(state_rec.dump_enables));
+    print_str("    dump_en               = " & sl_to_str(state_rec.dump_en));
+    print_str("    dump_busy             = " & sl_to_str(state_rec.dump_busy));
+    print_str("    dump_done             = " & sl_to_str(state_rec.dump_done));
+    print_str("    dump_ai               = " & int_to_str(state_rec.dump_ai));
+    return true;
+  end func_sdp_tbuf_print_state;
+
+  function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean is
+    constant c_state_rec : t_sdp_tbuf_state := func_sdp_tbuf_map_state(state_slv);
+  begin
+    return func_sdp_tbuf_print_state(c_state_rec);
+  end func_sdp_tbuf_print_state;
+
   function func_sdp_tbuf_compose_cep_header(ip_src_addr             : std_logic_vector;
                                             ip_header_checksum      : natural;
                                             sdp_info                : t_sdp_info;  -- app header