diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg
index 864b6aa6cf50a8286b9ba04da91560d776eb096a..06720dbf4fed95af61f17c22350b8afce784719d 100644
--- a/applications/lofar2/libraries/sdp/hdllib.cfg
+++ b/applications/lofar2/libraries/sdp/hdllib.cfg
@@ -10,14 +10,18 @@ synth_files =
     src/vhdl/sdp_subband_equalizer.vhd 
     src/vhdl/sdp_bf_weights.vhd 
     src/vhdl/sdp_beamformer_local.vhd 
+    src/vhdl/sdp_info_reg.vhd 
+    src/vhdl/sdp_info.vhd 
     src/vhdl/sdp_beamformer_output.vhd 
     src/vhdl/node_sdp_adc_input_and_timing.vhd
     src/vhdl/node_sdp_filterbank.vhd
     src/vhdl/node_sdp_beamformer.vhd
-test_bench_files = 
 
-regression_test_vhdl = 
+test_bench_files =
+    tb/vhdl/tb_sdp_info.vhd 
 
+regression_test_vhdl = 
+    tb/vhdl/tb_sdp_info.vhd
 
 [modelsim_project_file]
 
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..bf74d2baef718b791718f6ccc6d15138e9407959
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd
@@ -0,0 +1,114 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Author: P. Donker
+
+-- Purpose:
+-- . SDP info register
+-- Description:
+--
+-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
+--
+-- Remark:
+-- .
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE, common_lib, mm_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_field_pkg.ALL;
+USE work.sdp_pkg.ALL;
+
+ENTITY sdp_info IS
+  PORT (
+    -- Clocks and reset
+    mm_rst             : IN  STD_LOGIC;   -- reset synchronous with mm_clk
+    mm_clk             : IN  STD_LOGIC;   -- memory-mapped bus clock
+
+    dp_clk             : IN  STD_LOGIC;
+    dp_rst             : IN  STD_LOGIC;
+
+    reg_mosi           : IN  t_mem_mosi;
+    reg_miso           : OUT t_mem_miso;
+
+    -- inputs from other blocks
+    gn_index           : IN NATURAL;
+    f_adc              : IN STD_LOGIC;
+    fsub_type          : IN STD_LOGIC;
+
+    -- sdp info
+    sdp_info           : OUT t_sdp_info
+  );
+END sdp_info;
+
+
+ARCHITECTURE str OF sdp_info IS
+
+  SIGNAL sdp_info_ro: t_sdp_info;  -- ro = read only
+  SIGNAL block_period: STD_LOGIC_VECTOR(15 DOWNTO 0);
+
+BEGIN
+
+  u_mm_fields: ENTITY work.sdp_info_reg
+  PORT MAP (
+
+    mm_clk    => mm_clk,
+    mm_rst    => mm_rst,
+
+    dp_clk    => dp_clk,
+    dp_rst    => dp_rst,
+
+    reg_mosi  => reg_mosi,
+    reg_miso  => reg_miso,
+
+    -- sdp info
+    sdp_info_ro => sdp_info_ro,
+    sdp_info    => sdp_info
+  );
+
+  
+  -- f_adc    : '0' => 160M, '1' => 200M
+  -- fsub_type: '0' => critical sampled PFB, '1' => oversampled PFB  
+  p_block_period : PROCESS(f_adc, fsub_type)
+  BEGIN
+    IF f_adc = '0' THEN
+      IF fsub_type = '0' THEN
+        block_period <= TO_UVEC(6400, block_period'LENGTH);  -- 160M, critical sampled
+      ELSE
+        block_period <= TO_UVEC(5400, block_period'LENGTH);  -- 160M, oversampled
+      END IF;
+    ELSE
+      IF fsub_type = '0' THEN
+        block_period <= TO_UVEC(5120, block_period'LENGTH);  -- 200M, critical sampled
+      ELSE
+        block_period <= TO_UVEC(4320, block_period'LENGTH);  -- 200M, oversampled
+      END IF;  
+    END IF;
+  END PROCESS;
+
+  sdp_info_ro.antenna_band_index <= '0' WHEN gn_index < c_sdp_N_pn_lb ELSE '1';
+  sdp_info_ro.f_adc              <= f_adc;
+  sdp_info_ro.fsub_type          <= fsub_type;
+  sdp_info_ro.block_period       <= block_period;
+
+END str;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..bcd6e5a201e0665eca382bc41940a8684bfe3273
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd
@@ -0,0 +1,141 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Author: P. Donker
+
+-- Purpose:
+-- . SDP info register
+-- Description:
+--
+-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
+--
+-- Remark:
+-- .
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE, common_lib, mm_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_field_pkg.ALL;
+USE work.sdp_pkg.ALL;
+
+ENTITY sdp_info_reg IS
+  PORT (
+    -- Clocks and reset
+    mm_rst     : IN  STD_LOGIC;   -- reset synchronous with mm_clk
+    mm_clk     : IN  STD_LOGIC;   -- memory-mapped bus clock
+
+    dp_clk     : IN  STD_LOGIC;
+    dp_rst     : IN  STD_LOGIC;
+
+    reg_mosi : IN  t_mem_mosi;
+    reg_miso : OUT t_mem_miso;
+
+    -- sdp info
+    sdp_info_ro : IN  t_sdp_info;  -- ro = read only
+    sdp_info    : OUT t_sdp_info
+  );
+END sdp_info_reg;
+
+
+ARCHITECTURE str OF sdp_info_reg IS
+
+  CONSTANT c_field_arr : t_common_field_arr(13 DOWNTO 0) := 
+      ( (field_name_pad("station_id"),              "RW", 16, field_default(0)),
+        (field_name_pad("antenna_band_index"),      "RO",  1, field_default(0)),
+        (field_name_pad("observation_id"),          "RW", 32, field_default(0)),
+        (field_name_pad("nyquist_zone_index"),      "RW",  2, field_default(0)),
+        (field_name_pad("f_adc"),                   "RO",  1, field_default(0)),
+        (field_name_pad("fsub_type"),               "RO",  1, field_default(0)),
+        (field_name_pad("beam_repositioning_flag"), "RW",  1, field_default(0)),
+        (field_name_pad("subband_calibrated_flag"), "RW",  1, field_default(0)),
+        (field_name_pad("O_si"),                    "RW",  8, field_default(0)),
+        (field_name_pad("N_si"),                    "RW",  8, field_default(0)),
+        (field_name_pad("O_rn"),                    "RW",  8, field_default(0)),
+        (field_name_pad("N_rn"),                    "RW",  8, field_default(0)),
+        (field_name_pad("block_period"),            "RO", 16, field_default(0)),
+        (field_name_pad("beamlet_scale"),           "RW", 16, field_default(0)) );
+
+  SIGNAL mm_fields_in  : STD_LOGIC_VECTOR(field_slv_in_len(c_field_arr)-1 DOWNTO 0);
+  SIGNAL mm_fields_out : STD_LOGIC_VECTOR(field_slv_out_len(c_field_arr)-1 DOWNTO 0);
+
+  SIGNAL sdp_info_rd : t_sdp_info;
+  SIGNAL sdp_info_wr : t_sdp_info;
+
+BEGIN
+
+  sdp_info    <= sdp_info_rd;
+
+  p_sdp_info_rd : PROCESS(sdp_info_wr, sdp_info_ro)
+  BEGIN
+    -- default write assign all fields 
+    sdp_info_rd <= sdp_info_wr;
+    
+    -- overrule the read only fields 
+    sdp_info_rd.antenna_band_index <= sdp_info_ro.antenna_band_index;
+    sdp_info_rd.f_adc              <= sdp_info_ro.f_adc;
+    sdp_info_rd.fsub_type          <= sdp_info_ro.fsub_type;
+    sdp_info_rd.block_period       <= sdp_info_ro.block_period;
+  END PROCESS;
+
+
+  u_mm_fields: ENTITY mm_lib.mm_fields
+  GENERIC MAP(
+    g_use_slv_in_val  => FALSE,    -- use FALSE to save logic when always slv_in_val='1'
+    g_field_arr       => c_field_arr
+  )
+  PORT MAP (
+    mm_clk     => mm_clk,
+    mm_rst     => mm_rst,
+
+    mm_mosi    => reg_mosi,
+    mm_miso    => reg_miso,
+
+    slv_clk    => dp_clk,
+    slv_rst    => dp_rst,
+
+    slv_in     => mm_fields_in,
+    slv_in_val => '1',
+
+    slv_out    => mm_fields_out
+  );
+
+  -- add "RO" fields to mm_fields  
+  mm_fields_in(field_hi(c_field_arr, "antenna_band_index") DOWNTO field_lo(c_field_arr, "antenna_band_index"))           <= slv(sdp_info_rd.antenna_band_index);
+  mm_fields_in(field_hi(c_field_arr, "f_adc") DOWNTO field_lo(c_field_arr, "f_adc"))                                     <= slv(sdp_info_rd.f_adc);
+  mm_fields_in(field_hi(c_field_arr, "fsub_type") DOWNTO field_lo(c_field_arr, "fsub_type"))                             <= slv(sdp_info_rd.fsub_type);
+  mm_fields_in(field_hi(c_field_arr, "block_period") DOWNTO field_lo(c_field_arr, "block_period"))                       <= sdp_info_rd.block_period;
+
+  -- get "RW" fields from mm_fields
+  sdp_info_wr.station_id              <= mm_fields_out(field_hi(c_field_arr, "station_id") DOWNTO field_lo(c_field_arr, "station_id"));
+  sdp_info_wr.observation_id          <= mm_fields_out(field_hi(c_field_arr, "observation_id") DOWNTO field_lo(c_field_arr, "observation_id"));
+  sdp_info_wr.nyquist_zone_index      <= mm_fields_out(field_hi(c_field_arr, "nyquist_zone_index") DOWNTO field_lo(c_field_arr, "nyquist_zone_index"));
+  sdp_info_wr.beam_repositioning_flag <= sl(mm_fields_out(field_hi(c_field_arr, "beam_repositioning_flag") DOWNTO field_lo(c_field_arr, "beam_repositioning_flag")));
+  sdp_info_wr.subband_calibrated_flag <= sl(mm_fields_out(field_hi(c_field_arr, "subband_calibrated_flag") DOWNTO field_lo(c_field_arr, "subband_calibrated_flag")));
+  sdp_info_wr.O_si                    <= mm_fields_out(field_hi(c_field_arr, "O_si") DOWNTO field_lo(c_field_arr, "O_si"));
+  sdp_info_wr.N_si                    <= mm_fields_out(field_hi(c_field_arr, "N_si") DOWNTO field_lo(c_field_arr, "N_si"));
+  sdp_info_wr.O_rn                    <= mm_fields_out(field_hi(c_field_arr, "O_rn") DOWNTO field_lo(c_field_arr, "O_rn"));
+  sdp_info_wr.N_rn                    <= mm_fields_out(field_hi(c_field_arr, "N_rn") DOWNTO field_lo(c_field_arr, "N_rn"));
+  sdp_info_wr.beamlet_scale           <= mm_fields_out(field_hi(c_field_arr, "beamlet_scale") DOWNTO field_lo(c_field_arr, "beamlet_scale"));
+
+END str;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
index 3977e21a40a61fb9dd378e2a91ff1eec711e7b61..eceaf45bc6411570c44c6bb178b8b8504b2e1061 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
@@ -85,7 +85,8 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_W_beamlet_sum   : NATURAL := 18; 
   CONSTANT c_sdp_W_beamlet       : NATURAL := 8; 
   CONSTANT c_sdp_W_beamlet_scale : NATURAL := 16; 
-  CONSTANT c_sdp_W_gn_id         : NATURAL := 5; 
+  CONSTANT c_sdp_W_gn_id         : NATURAL := 5;
+  CONSTANT c_sdp_N_pn_lb         : NATURAL := 16;
 
   -- AIT constants
   CONSTANT c_sdp_ait_buf_nof_data_jesd : NATURAL := 1024; -- 1024 14 bit samples fit in one M20k BRAM 
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..2f691bdbcdd74a93cb43dd6db278bf85d1fcab60
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd
@@ -0,0 +1,272 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Author: P. Donker
+
+-- Purpose:
+-- . test bench for sdp_info.vhd (and sdp_info_reg.vhd)
+-- Description:
+--
+-- https://plm.astron.nl/polarion/#/project/LOFAR2System/workitem?id=LOFAR2-9258
+-- https://plm.astron.nl/polarion/#/project/LOFAR2System/workitem?id=LOFAR2-8855
+--
+-- Remark:
+-- .
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE, common_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.tb_common_pkg.ALL; 
+USE common_lib.tb_common_mem_pkg.ALL; 
+USE work.sdp_pkg.ALL;
+
+
+ENTITY tb_sdp_info IS
+END tb_sdp_info;
+
+ARCHITECTURE tb OF tb_sdp_info IS
+  CONSTANT c_dp_clk_period        : TIME := 5 ns;     -- 200 MHz
+  CONSTANT c_mm_clk_period        : TIME := 20 ns;    -- 50 MHz
+
+  CONSTANT c_cross_clock_domain_latency : NATURAL := 20;
+
+  -- used mm_adresses on mm bus
+  CONSTANT c_mm_addr_beamlet_scale           : NATURAL := 0;
+  CONSTANT c_mm_addr_block_period            : NATURAL := 1;
+  CONSTANT c_mm_addr_N_rn                    : NATURAL := 2;
+  CONSTANT c_mm_addr_O_rn                    : NATURAL := 3;
+  CONSTANT c_mm_addr_N_si                    : NATURAL := 4;
+  CONSTANT c_mm_addr_O_si                    : NATURAL := 5;
+  CONSTANT c_mm_addr_subband_calibrated_flag : NATURAL := 6;
+  CONSTANT c_mm_addr_beam_repositioning_flag : NATURAL := 7;
+  CONSTANT c_mm_addr_fsub_type               : NATURAL := 8;
+  CONSTANT c_mm_addr_f_adc                   : NATURAL := 9;
+  CONSTANT c_mm_addr_nyquist_zone_index      : NATURAL := 10;
+  CONSTANT c_mm_addr_observation_id          : NATURAL := 11;
+  CONSTANT c_mm_addr_antenna_band_index      : NATURAL := 12;
+  CONSTANT c_mm_addr_station_id              : NATURAL := 13;
+  
+  SIGNAL tb_end              : STD_LOGIC := '0';
+  SIGNAL tb_mm_reg_end       : STD_LOGIC := '0';
+
+  SIGNAL dp_clk              : STD_LOGIC := '1';   -- digital data path clock = 200 MHz (deser factor 4);
+  SIGNAL dp_rst              : STD_LOGIC;
+
+  SIGNAL mm_clk              : STD_LOGIC := '1';   -- MM control clock = 50 MHz
+  SIGNAL mm_rst              : STD_LOGIC;
+  
+  SIGNAL reg_mosi            : t_mem_mosi := c_mem_mosi_rst;
+  SIGNAL reg_miso            : t_mem_miso;
+
+  -- signals used to change settings of sdp_info 
+  SIGNAL gn_index  : NATURAL   := 15; 
+  SIGNAL f_adc     : STD_LOGIC := '0'; 
+  SIGNAL fsub_type : STD_LOGIC := '0';
+
+  SIGNAL sdp_info  : t_sdp_info; 
+
+  -- signals used for response of mm bus
+  SIGNAL mm_natural_response : NATURAL;
+BEGIN
+  dp_rst <= '1', '0' AFTER c_dp_clk_period*7;
+  dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_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;
+
+  p_mm_reg_stimuli : PROCESS
+  BEGIN
+    reg_mosi <= c_mem_mosi_rst;
+
+    -- initialyze
+    proc_common_wait_until_low(mm_clk, mm_rst);
+    proc_common_wait_some_cycles(mm_clk, 100);
+
+    -- default all register hold value 0, try to write 1 in all registers
+    proc_mem_mm_bus_wr(c_mm_addr_beamlet_scale          ,10 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_block_period           ,11 ,mm_clk, reg_miso, reg_mosi); -- RO
+    proc_mem_mm_bus_wr(c_mm_addr_N_rn                   ,12 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_O_rn                   ,13 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_N_si                   ,14 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_O_si                   ,15 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_subband_calibrated_flag,1  ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_beam_repositioning_flag,1  ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_fsub_type              ,1  ,mm_clk, reg_miso, reg_mosi); -- RO
+    proc_mem_mm_bus_wr(c_mm_addr_f_adc                  ,1  ,mm_clk, reg_miso, reg_mosi); -- RO
+    proc_mem_mm_bus_wr(c_mm_addr_nyquist_zone_index     ,3  ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_observation_id         ,16 ,mm_clk, reg_miso, reg_mosi);
+    proc_mem_mm_bus_wr(c_mm_addr_antenna_band_index     ,1  ,mm_clk, reg_miso, reg_mosi); -- RO
+    proc_mem_mm_bus_wr(c_mm_addr_station_id             ,17 ,mm_clk, reg_miso, reg_mosi);
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+
+    proc_mem_mm_bus_rd(c_mm_addr_beamlet_scale, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 10 REPORT "wrong beamlet_scale" SEVERITY ERROR;
+    
+    proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response /= 11 REPORT "wrong block_period (not read only)" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_N_rn, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 12 REPORT "wrong N_rn" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_O_rn, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 13 REPORT "wrong O_rn" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_N_si, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 14 REPORT "wrong N_si" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_O_si, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 15 REPORT "wrong O_si" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_subband_calibrated_flag, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 1 REPORT "wrong subband_calibrated_flag" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_beam_repositioning_flag, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 1 REPORT "wrong beam_repositioning_flag" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_fsub_type, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response /= 1 REPORT "wrong fsub_type (not read only)" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_f_adc, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response /= 1 REPORT "wrong f_adc (not read only)" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_nyquist_zone_index, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 3 REPORT "wrong nyquist_zone_index" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_observation_id, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 16 REPORT "wrong observation_id" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_antenna_band_index, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response /= 1 REPORT "wrong antenna_band_index (not read only)" SEVERITY ERROR;
+
+    proc_mem_mm_bus_rd(c_mm_addr_station_id, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 17 REPORT "wrong station_id" SEVERITY ERROR;
+
+    -- check if antenna_band_index is changed on change of gn_index
+    -- '0' <= 16,  '1' > 16
+    gn_index <= 32;
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_antenna_band_index, mm_clk, reg_mosi);  proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata);  proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 1 REPORT "wrong antenna_band_index" SEVERITY ERROR;
+
+    -- check block_period if f_adc and fsub_type are changed
+    -- f_adc = '0' and fsub_type = '0' => block_period = 6400
+    -- f_adc = '1' and fsub_type = '0' => block_period = 5120
+    -- f_adc = '0' and fsub_type = '1' => block_period = 5400
+    -- f_adc = '1' and fsub_type = '1' => block_period = 4320
+    f_adc <= '0'; fsub_type <= '0';
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi);
+    proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0));
+    proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 6400 REPORT "wrong block_period, expected 6400" SEVERITY ERROR;
+    f_adc <= '1'; fsub_type <= '0';
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi);
+    proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0));
+    proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 5120 REPORT "wrong block_period, expected 5120" SEVERITY ERROR;
+    f_adc <= '0'; fsub_type <= '1';
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi);
+    proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0));
+    proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 5400 REPORT "wrong block_period, expected 5400" SEVERITY ERROR;
+    f_adc <= '1'; fsub_type <= '1';
+    proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi);
+    proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
+    mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0));
+    proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT mm_natural_response = 4320 REPORT "wrong block_period, expected 4320" SEVERITY ERROR;
+
+    proc_common_wait_some_cycles(mm_clk, 100);
+    tb_mm_reg_end <= '1';
+    WAIT;
+
+  END PROCESS;
+
+  -- check if values in sdp_info match with expected values
+  p_sdp_info_stimuli : PROCESS
+  BEGIN
+    proc_common_wait_until_high(mm_clk, tb_mm_reg_end); -- wait for p_mm_reg_stimuli done
+
+    ASSERT TO_UINT(sdp_info.beamlet_scale)      = 10   REPORT "wrong sdp_info.beamlet_scale value"           SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.block_period)       = 4320 REPORT "wrong sdp_info.block_period value"            SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.N_rn)               = 12   REPORT "wrong sdp_info.N_rn value"                    SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.O_rn)               = 13   REPORT "wrong sdp_info.O_rn value"                    SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.N_si)               = 14   REPORT "wrong sdp_info.N_si value"                    SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.O_si)               = 15   REPORT "wrong sdp_info.O_si value"                    SEVERITY ERROR;
+    ASSERT sdp_info.subband_calibrated_flag     = '1'  REPORT "wrong sdp_info.subband_calibrated_flag value" SEVERITY ERROR;
+    ASSERT sdp_info.beam_repositioning_flag     = '1'  REPORT "wrong sdp_info.beam_repositioning_flag value" SEVERITY ERROR;
+    ASSERT sdp_info.fsub_type                   = '1'  REPORT "wrong sdp_info.fsub_type value"               SEVERITY ERROR;
+    ASSERT sdp_info.f_adc                       = '1'  REPORT "wrong sdp_info.f_adc value"                   SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.nyquist_zone_index) = 3    REPORT "wrong sdp_info.nyquist_zone_index value"      SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.observation_id)     = 16   REPORT "wrong sdp_info.observation_id value"          SEVERITY ERROR;
+    ASSERT sdp_info.antenna_band_index          = '1'  REPORT "wrong sdp_info.antenna_band_index value"      SEVERITY ERROR;
+    ASSERT TO_UINT(sdp_info.station_id)         = 17   REPORT "wrong sdp_info.station_id value"              SEVERITY ERROR;
+
+    proc_common_wait_some_cycles(mm_clk, 100);
+    tb_end <= '1';
+    WAIT;
+  END PROCESS;
+
+
+  -- SDP info
+  u_dut: ENTITY work.sdp_info
+    PORT MAP (
+      mm_clk    => mm_clk,
+      mm_rst    => mm_rst,
+
+      dp_clk    => dp_clk,
+      dp_rst    => dp_rst,
+
+      reg_mosi  => reg_mosi,
+      reg_miso  => reg_miso,
+
+      gn_index  => gn_index,
+      f_adc     => f_adc,
+      fsub_type => fsub_type,
+
+      sdp_info  => sdp_info
+    );
+
+END tb;
\ No newline at end of file