diff --git a/libraries/io/ddr/ddr.peripheral.yaml b/libraries/io/ddr/ddr.peripheral.yaml
index b2cbd21a659e3682d4ca23512caee423de5bbb86..afb77e03a2da8025a29da1ee4bbfb4edf45b624c 100644
--- a/libraries/io/ddr/ddr.peripheral.yaml
+++ b/libraries/io/ddr/ddr.peripheral.yaml
@@ -18,8 +18,9 @@ peripherals:
         fields:
           - - field_name: reg_io_ddr 
               field_description: |
-                "IO DDR status bits concatenated: 
-                 ctlr_tech_mosi.wr & ctlr_tech_miso.rdval & ctlr_tech_miso.cal_fail      & ctlr_tech_miso.cal_ok 
+                "IO DDR status bits concatenated:
+                 ddr_gigabytes[7:0] &
+                 ctlr_tech_mosi.wr & ctlr_tech_miso.rdval & ctlr_tech_miso.cal_fail      & ctlr_tech_miso.cal_ok &
                  ctlr_rst_out_i    & ctlr_wr_flush_en     & ctlr_tech_miso.waitrequest_n & ctlr_tech_miso.done"
               address_offset: 0 * MM_BUS_SIZE
               access_mode: RO
diff --git a/libraries/io/ddr/src/vhdl/io_ddr.vhd b/libraries/io/ddr/src/vhdl/io_ddr.vhd
index aee6a046f1ff815f50906b1f9a191255d4542aab..97a833ab577af1ee3c6c2fb091f47d987d9394fe 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr.vhd
@@ -234,6 +234,7 @@ ARCHITECTURE str OF io_ddr IS
   CONSTANT c_wr_use_ctrl       : BOOLEAN := sel_a_b(g_wr_flush_mode="SOP", TRUE, FALSE);
   CONSTANT c_wr_fifo_use_ctrl  : BOOLEAN := c_wr_use_sync OR c_wr_use_ctrl;
   
+  CONSTANT c_ddr_gigabytes    : NATURAL := func_tech_ddr_module_size(g_tech_ddr);  -- units GiByte
   CONSTANT c_ctlr_address_w    : NATURAL := func_tech_ddr_ctlr_address_w(g_tech_ddr);
   CONSTANT c_ctlr_data_w       : NATURAL := func_tech_ddr_ctlr_data_w(g_tech_ddr);
   CONSTANT c_wr_fifo_depth     : NATURAL := g_wr_fifo_depth * (c_ctlr_data_w/g_wr_data_w);  -- get FIFO depth at write side
@@ -520,7 +521,8 @@ BEGIN
   mm_reg_io_ddr <= RESIZE_UVEC(rd_fifo_full_reg & wr_fifo_full_reg, c_mem_reg_dat_w) & 
                    RESIZE_UVEC(ctlr_wr_fifo_usedw, c_mem_reg_dat_w) & 
                    RESIZE_UVEC(ctlr_rd_fifo_usedw, c_mem_reg_dat_w) & 
-                   RESIZE_UVEC(ctlr_tech_mosi.wr & ctlr_tech_miso.rdval & ctlr_tech_miso.cal_fail      & ctlr_tech_miso.cal_ok & 
+                   RESIZE_UVEC(TO_UVEC(c_ddr_gigabytes, 8) &
+                               ctlr_tech_mosi.wr & ctlr_tech_miso.rdval & ctlr_tech_miso.cal_fail      & ctlr_tech_miso.cal_ok &
                                ctlr_rst_out_i    & ctlr_wr_flush_en     & ctlr_tech_miso.waitrequest_n & ctlr_tech_miso.done, c_mem_reg_dat_w);   
   
   u_reg_map : ENTITY common_lib.common_reg_r_w_dc
diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
index 8a5de786b4052024bd0433c6cc6bc5785b35137d..3b347655c1b5a3051ab2a00214ba82f984d080b1 100644
--- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
@@ -72,7 +72,7 @@ ARCHITECTURE str of tb_io_ddr IS
   CONSTANT c_sim_ddr                  : t_c_tech_ddr := func_tech_sel_ddr(g_technology, c_tech_ddr3_sim_16k, c_tech_ddr4_sim_16k);
   CONSTANT c_tech_ddr                 : t_c_tech_ddr := func_tech_sel_ddr(g_sim_model, c_sim_ddr, c_mem_ddr);
   
-  CONSTANT c_gigabytes                : NATURAL := func_tech_ddr_module_size(c_tech_ddr);
+  CONSTANT c_exp_gigabytes            : NATURAL := func_tech_ddr_module_size(c_tech_ddr);
 
   CONSTANT c_dp_clk_period            : TIME := 5 ns;   -- 200 MHz
   CONSTANT c_mm_clk_period            : TIME := 8 ns;   -- 125 MHz
@@ -165,7 +165,8 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL dbg_c_ctlr_wr_not_rd_arr     : STD_LOGIC_VECTOR(0 TO c_nof_access-1)  := c_ctlr_wr_not_rd_arr;
   
   SIGNAL dbg_c_tech_ddr               : t_c_tech_ddr := c_tech_ddr;
-  SIGNAL dbg_c_gigabytes              : NATURAL := c_gigabytes;  -- = 0 for sim model, else nof GB
+  SIGNAL dbg_c_exp_gigabytes          : NATURAL := c_exp_gigabytes;  -- = 0 for sim model, else nof GB
+  SIGNAL ddr_gigabytes                : NATURAL;
   SIGNAL dbg_c_dp_data_w              : NATURAL := c_dp_data_w;
   SIGNAL dbg_c_wr_fifo_depth          : NATURAL := c_wr_fifo_depth;
   SIGNAL dbg_c_rd_fifo_depth          : NATURAL := c_rd_fifo_depth;
@@ -182,12 +183,14 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL mm_clk               : STD_LOGIC := '0';
   SIGNAL mm_rst               : STD_LOGIC;
 
+  -- Status interface
+  SIGNAL reg_io_ddr_mosi      : t_mem_mosi := c_mem_mosi_rst;
+  SIGNAL reg_io_ddr_miso      : t_mem_miso := c_mem_miso_rst;
+
+  -- Driver interface
   SIGNAL dvr_miso             : t_mem_ctlr_miso;
   SIGNAL dvr_mosi             : t_mem_ctlr_mosi;   
   
-  SIGNAL reg_io_ddr_mosi      : t_mem_mosi := c_mem_mosi_rst;           
-  SIGNAL reg_io_ddr_miso      : t_mem_miso := c_mem_miso_rst;           
-  
   SIGNAL dvr_done             : STD_LOGIC;
   SIGNAL dvr_en               : STD_LOGIC;
   SIGNAL dvr_wr_not_rd        : STD_LOGIC;
@@ -260,8 +263,17 @@ BEGIN
     WAIT FOR 100 ns;
     ctlr_ref_rst      <= '0';
 
+    -- Wait until calibration done (and ctlr_rst released)
     proc_common_wait_until_high(dvr_clk, dvr_done);
     
+    -- Read DDR4 memory size
+    proc_common_wait_cross_clock_domain_latency(mm_clk, dp_clk);
+    proc_mem_mm_bus_rd(0, mm_clk, reg_io_ddr_miso, reg_io_ddr_mosi);
+    proc_mem_mm_bus_rd_latency(1, mm_clk);
+    ddr_gigabytes <= TO_UINT(reg_io_ddr_miso.rddata(15 DOWNTO 8));
+    proc_common_wait_some_cycles(mm_clk, 1);
+    ASSERT ddr_gigabytes = c_exp_gigabytes REPORT "Wrong read memory size" SEVERITY ERROR;
+
     -- Start diagnostics source for write and sink for verify read
     proc_common_wait_some_cycles(dp_clk, 1);
     src_diag_en <= '1';