From 142d16c3e1ac25e7c127d0248763646b239fcfa0 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Mon, 3 Oct 2022 14:27:19 +0200
Subject: [PATCH] Verify prgrammable CEP beamlet output src and dst MAC, IP,
 UDP port.

---
 .../tb_lofar2_unb2b_sdp_station_bf.vhd        |  59 +++++++--
 .../tb_lofar2_unb2c_sdp_station_bf.vhd        | 122 +++++++----------
 .../tb_lofar2_unb2c_sdp_station_bf_ring.vhd   | 124 ++++++++----------
 3 files changed, 154 insertions(+), 151 deletions(-)

diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
index db72ccae4f..817983875c 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
@@ -127,10 +127,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS
   CONSTANT c_beamlet_output_delta : INTEGER := 2;  -- +-delta margin
 
   -- header fields
-  CONSTANT c_cep_eth_dst_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_dst_mac;   -- 00074306C700 = DOP36-eth0
-  CONSTANT c_cep_ip_dst_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_dst_addr;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
-  CONSTANT c_cep_udp_dst_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_dst_port;  -- 5000
-
   CONSTANT c_cep_eth_src_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & c_mac_15_0;  -- x"00228608";  -- 47:16, 15:8 = backplane, 7:0 = node
   CONSTANT c_cep_ip_src_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & c_ip_15_0;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
   CONSTANT c_cep_udp_src_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_id;  -- D0 & c_id
@@ -252,8 +248,11 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS
   -- MM
   SIGNAL rd_sdp_info         : t_sdp_info := c_sdp_info_rst;
   SIGNAL rd_beamlet_scale    : STD_LOGIC_VECTOR(15 DOWNTO 0);
+  SIGNAL rd_cep_eth_src_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
   SIGNAL rd_cep_eth_dst_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
+  SIGNAL rd_cep_ip_src_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
   SIGNAL rd_cep_ip_dst_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
+  SIGNAL rd_cep_udp_src_port : STD_LOGIC_VECTOR(15 DOWNTO 0);
   SIGNAL rd_cep_udp_dst_port : STD_LOGIC_VECTOR(15 DOWNTO 0);
 
   -- WG
@@ -609,17 +608,53 @@ BEGIN
       --     );
 
       v_offset := bset * c_mm_span_reg_hdr_dat;
-      -- . Use defaults, so no need to write
+      -- Default destination MAC/IP/UDP = 0
       -- . Read
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
+      proc_common_wait_some_cycles(tb_clk, 1);
+      -- . verify read
+      ASSERT UNSIGNED(rd_cep_eth_src_mac) = 0 REPORT "Wrong MM read rd_cep_eth_src_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_src_addr) = 0 REPORT "Wrong MM read rd_cep_ip_src_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_src_port) = 0 REPORT "Wrong MM read rd_cep_udp_src_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_eth_dst_mac) = 0 REPORT "Wrong MM read rd_cep_eth_dst_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_dst_addr) = 0 REPORT "Wrong MM read rd_cep_ip_dst_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_dst_port) = 0 REPORT "Wrong MM read rd_cep_udp_dst_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+
+      -- Write tb defaults
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 39, TO_UINT(c_cep_eth_src_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 38, TO_SINT(c_cep_eth_src_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 26, TO_SINT(c_cep_ip_src_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 24, TO_UINT(c_cep_udp_src_port), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 41, TO_UINT(c_sdp_cep_eth_dst_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 40, TO_SINT(c_sdp_cep_eth_dst_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 25, TO_SINT(c_sdp_cep_ip_dst_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 23, TO_UINT(c_sdp_cep_udp_dst_port), tb_clk);
+      proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency*2);
+
+      -- . Read back
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
       proc_common_wait_some_cycles(tb_clk, 1);
-      -- verify read
-      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 00074306C700 = DOP36-eth0
-      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- C0A80001 = '192.168.0.1' = DOP36-eth0
-      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 5000
+      -- . verify read back
+      ASSERT rd_cep_eth_src_mac = c_cep_eth_src_mac REPORT "Wrong MM read rd_cep_eth_src_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_src_addr = c_cep_ip_src_addr REPORT "Wrong MM read rd_cep_ip_src_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_src_port = c_cep_udp_src_port REPORT "Wrong MM read rd_cep_udp_src_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
 
       ----------------------------------------------------------------------------
       -- Enable beamlet UDP offload (dp_xonoff)
@@ -1000,7 +1035,7 @@ BEGIN
   p_exp_sdp_cep_header : PROCESS(exp_dp_bsn)
   BEGIN
     -- eth header
-    exp_sdp_cep_header.eth.dst_mac        <= c_cep_eth_dst_mac;
+    exp_sdp_cep_header.eth.dst_mac        <= c_sdp_cep_eth_dst_mac;
     exp_sdp_cep_header.eth.src_mac        <= c_cep_eth_src_mac;
     exp_sdp_cep_header.eth.eth_type       <= x"0800";
 
@@ -1016,11 +1051,11 @@ BEGIN
     exp_sdp_cep_header.ip.protocol        <= TO_UVEC(                       17, c_network_ip_protocol_w);
     exp_sdp_cep_header.ip.header_checksum <= TO_UVEC( c_exp_ip_header_checksum, c_network_ip_header_checksum_w);
     exp_sdp_cep_header.ip.src_ip_addr     <=                 c_cep_ip_src_addr;  -- c_network_ip_addr_w
-    exp_sdp_cep_header.ip.dst_ip_addr     <=                 c_cep_ip_dst_addr;  -- c_network_ip_addr_w
+    exp_sdp_cep_header.ip.dst_ip_addr     <=             c_sdp_cep_ip_dst_addr;  -- c_network_ip_addr_w
 
     -- udp header
     exp_sdp_cep_header.udp.src_port       <=                 c_cep_udp_src_port;
-    exp_sdp_cep_header.udp.dst_port       <=                 c_cep_udp_dst_port;
+    exp_sdp_cep_header.udp.dst_port       <=             c_sdp_cep_udp_dst_port;
     exp_sdp_cep_header.udp.total_length   <=         c_sdp_cep_udp_total_length;  -- 7848, see ICD STAT-CEP
     exp_sdp_cep_header.udp.checksum       <= TO_UVEC(                         0, c_network_udp_checksum_w);
 
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
index da901213a2..ead55fbb6a 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
@@ -200,13 +200,9 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS
   CONSTANT c_beamlet_output_delta : INTEGER := 2;  -- +-delta margin
 
   -- header fields
-  CONSTANT c_cep_eth_dst_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_dst_mac;   -- 00074306C700 = DOP36-eth0
-  CONSTANT c_cep_ip_dst_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_dst_addr;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
-  CONSTANT c_cep_udp_dst_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_dst_port;  -- 5000
-
-  CONSTANT c_cep_eth_src_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & c_mac_15_0;  -- x"00228608";  -- 47:16, 15:8 = backplane, 7:0 = node
-  CONSTANT c_cep_ip_src_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & c_ip_15_0;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
-  CONSTANT c_cep_udp_src_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_id;  -- D0 & c_id
+  CONSTANT c_cep_eth_src_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & func_sdp_gn_index_to_mac_15_0(c_gn_index);
+  CONSTANT c_cep_ip_src_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & func_sdp_gn_index_to_ip_15_0(c_gn_index);
+  CONSTANT c_cep_udp_src_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_id;
 
   CONSTANT c_exp_ip_header_checksum : NATURAL := 16#5BDE#;  -- value obtained from rx_sdp_cep_header.ip.header_checksum in wave window
 
@@ -384,8 +380,11 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS
   -- MM
   SIGNAL rd_sdp_info         : t_sdp_info := c_sdp_info_rst;
   SIGNAL rd_beamlet_scale    : STD_LOGIC_VECTOR(15 DOWNTO 0);
+  SIGNAL rd_cep_eth_src_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
   SIGNAL rd_cep_eth_dst_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
+  SIGNAL rd_cep_ip_src_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
   SIGNAL rd_cep_ip_dst_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
+  SIGNAL rd_cep_udp_src_port : STD_LOGIC_VECTOR(15 DOWNTO 0);
   SIGNAL rd_cep_udp_dst_port : STD_LOGIC_VECTOR(15 DOWNTO 0);
 
   -- WG
@@ -714,7 +713,7 @@ BEGIN
       -- . write
       v_offset := bset * c_mm_span_reg_bf_scale;
       mmf_mm_bus_wr(c_mm_file_reg_bf_scale, v_offset + 0, c_exp_beamlet_scale, tb_clk);
-      proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period);
+      proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency*2);
 
       -- . readback
       mmf_mm_bus_rd(c_mm_file_reg_bf_scale, v_offset + 0, rd_data, tb_clk);
@@ -771,17 +770,54 @@ BEGIN
       --     );
 
       v_offset := bset * c_mm_span_reg_hdr_dat;
-      -- . Use defaults, so no need to write
+      -- Default destination MAC/IP/UDP = 0
       -- . Read
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
       proc_common_wait_some_cycles(tb_clk, 1);
-      -- verify read
-      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 00074306C700 = DOP36-eth0
-      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- C0A80001 = '192.168.0.1' = DOP36-eth0
-      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 5000
+      -- . verify read
+      ASSERT UNSIGNED(rd_cep_eth_src_mac) = 0 REPORT "Wrong MM read rd_cep_eth_src_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_src_addr) = 0 REPORT "Wrong MM read rd_cep_ip_src_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_src_port) = 0 REPORT "Wrong MM read rd_cep_udp_src_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_eth_dst_mac) = 0 REPORT "Wrong MM read rd_cep_eth_dst_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_dst_addr) = 0 REPORT "Wrong MM read rd_cep_ip_dst_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_dst_port) = 0 REPORT "Wrong MM read rd_cep_udp_dst_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+
+      -- Write tb defaults
+      -- . Use sim default dst and src MAC, IP, UDP port from sdp_pkg.vhd and based on c_gn_index
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 39, TO_UINT(c_cep_eth_src_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 38, TO_SINT(c_cep_eth_src_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 26, TO_SINT(c_cep_ip_src_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 24, TO_UINT(c_cep_udp_src_port), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 41, TO_UINT(c_sdp_cep_eth_dst_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 40, TO_SINT(c_sdp_cep_eth_dst_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 25, TO_SINT(c_sdp_cep_ip_dst_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 23, TO_UINT(c_sdp_cep_udp_dst_port), tb_clk);
+      proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency*2);
+
+      -- . Read back
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
+      proc_common_wait_some_cycles(tb_clk, 1);
+      -- . verify read back
+      ASSERT rd_cep_eth_src_mac = c_cep_eth_src_mac REPORT "Wrong MM read rd_cep_eth_src_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_src_addr = c_cep_ip_src_addr REPORT "Wrong MM read rd_cep_ip_src_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_src_port = c_cep_udp_src_port REPORT "Wrong MM read rd_cep_udp_src_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
 
       ----------------------------------------------------------------------------
       -- Enable BST offload (not verified here, but only for view in Wave window)
@@ -1212,71 +1248,15 @@ BEGIN
   test_sync_cnt <= in_sync_cnt - 1;  -- optionally adjust to fit rx_beamlet_sosi
 
   -- Prepare exp_sdp_cep_header before rx_beamlet_sosi.eop, so that
-  -- p_exp_sdp_cep_header can verify it at rx_beamlet_sosi.eop.
+  -- p_verify_cep_header can verify it at rx_beamlet_sosi.eop.
 
-  exp_sdp_cep_header <= func_sdp_compose_cep_header(c_cep_eth_dst_mac,
-                                                    c_cep_eth_src_mac,
-                                                    c_cep_ip_src_addr,
-                                                    c_cep_ip_dst_addr,
-                                                    c_exp_ip_header_checksum,
+  exp_sdp_cep_header <= func_sdp_compose_cep_header(c_exp_ip_header_checksum,
                                                     c_exp_sdp_info,
                                                     c_gn_index,
                                                     c_exp_beamlet_scale,
                                                     c_exp_beamlet_index,
                                                     exp_dp_bsn);
 
-  --p_exp_sdp_cep_header : PROCESS(exp_dp_bsn)
-  --BEGIN
-  --  -- eth header
-  --  exp_sdp_cep_header.eth.dst_mac        <= c_cep_eth_dst_mac;
-  --  exp_sdp_cep_header.eth.src_mac        <= c_cep_eth_src_mac;
-  --  exp_sdp_cep_header.eth.eth_type       <= x"0800";
-  --
-  --  -- ip header
-  --  exp_sdp_cep_header.ip.version         <= TO_UVEC(                        4, c_network_ip_version_w);
-  --  exp_sdp_cep_header.ip.header_length   <= TO_UVEC(                        5, c_network_ip_header_length_w);
-  --  exp_sdp_cep_header.ip.services        <= TO_UVEC(                        0, c_network_ip_services_w);
-  --  exp_sdp_cep_header.ip.total_length    <=         c_sdp_cep_ip_total_length;  -- 7868, see ICD STAT-CEP
-  --  exp_sdp_cep_header.ip.identification  <= TO_UVEC(                        0, c_network_ip_identification_w);
-  --  exp_sdp_cep_header.ip.flags           <= TO_UVEC(                        2, c_network_ip_flags_w);
-  --  exp_sdp_cep_header.ip.fragment_offset <= TO_UVEC(                        0, c_network_ip_fragment_offset_w);
-  --  exp_sdp_cep_header.ip.time_to_live    <= TO_UVEC(                      127, c_network_ip_time_to_live_w);
-  --  exp_sdp_cep_header.ip.protocol        <= TO_UVEC(                       17, c_network_ip_protocol_w);
-  --  exp_sdp_cep_header.ip.header_checksum <= TO_UVEC( c_exp_ip_header_checksum, c_network_ip_header_checksum_w);
-  --  exp_sdp_cep_header.ip.src_ip_addr     <=                 c_cep_ip_src_addr;  -- c_network_ip_addr_w
-  --  exp_sdp_cep_header.ip.dst_ip_addr     <=                 c_cep_ip_dst_addr;  -- c_network_ip_addr_w
-  --
-  --  -- udp header
-  --  exp_sdp_cep_header.udp.src_port       <=                 c_cep_udp_src_port;
-  --  exp_sdp_cep_header.udp.dst_port       <=                 c_cep_udp_dst_port;
-  --  exp_sdp_cep_header.udp.total_length   <=         c_sdp_cep_udp_total_length;  -- 7848, see ICD STAT-CEP
-  --  exp_sdp_cep_header.udp.checksum       <= TO_UVEC(                         0, c_network_udp_checksum_w);
-  --
-  --  -- app header
-  --  exp_sdp_cep_header.app.sdp_marker         <= TO_UVEC(c_sdp_marker_beamlets, 8);  -- 98 = x"62" = 'b'
-  --  exp_sdp_cep_header.app.sdp_version_id     <= TO_UVEC(c_sdp_cep_version_id, 8);  -- 5
-  --  exp_sdp_cep_header.app.sdp_observation_id <= c_exp_sdp_info.observation_id;
-  --  exp_sdp_cep_header.app.sdp_station_id     <= c_exp_sdp_info.station_id;
-  --
-  --  exp_sdp_cep_header.app.sdp_source_info_antenna_band_id    <= slv(c_exp_sdp_info.antenna_band_index);
-  --  exp_sdp_cep_header.app.sdp_source_info_nyquist_zone_id    <=     c_exp_sdp_info.nyquist_zone_index;
-  --  exp_sdp_cep_header.app.sdp_source_info_f_adc              <= slv(c_exp_sdp_info.f_adc);
-  --  exp_sdp_cep_header.app.sdp_source_info_fsub_type          <= slv(c_exp_sdp_info.fsub_type);
-  --  exp_sdp_cep_header.app.sdp_source_info_payload_error      <= TO_UVEC(0, 1);
-  --  exp_sdp_cep_header.app.sdp_source_info_repositioning_flag <= slv(c_exp_sdp_info.beam_repositioning_flag);
-  --  exp_sdp_cep_header.app.sdp_source_info_beamlet_width      <= TO_UVEC(c_sdp_W_beamlet, 4);
-  --  exp_sdp_cep_header.app.sdp_source_info_gn_id              <= TO_UVEC(c_gn_index, 5);
-  --
-  --  exp_sdp_cep_header.app.sdp_reserved                       <= TO_UVEC(                               0, 40);
-  --  exp_sdp_cep_header.app.sdp_beamlet_scale                  <= TO_UVEC(             c_exp_beamlet_scale, 16);
-  --  exp_sdp_cep_header.app.sdp_beamlet_index                  <= TO_UVEC(                               0, 16);  -- depends on bset
-  --  exp_sdp_cep_header.app.sdp_nof_blocks_per_packet          <= TO_UVEC( c_sdp_cep_nof_blocks_per_packet,  8);
-  --  exp_sdp_cep_header.app.sdp_nof_beamlets_per_block         <= TO_UVEC(c_sdp_cep_nof_beamlets_per_block, 16);
-  --  exp_sdp_cep_header.app.sdp_block_period                   <= c_exp_sdp_info.block_period;
-  --
-  --  exp_sdp_cep_header.app.dp_bsn <= TO_UVEC(exp_dp_bsn, 64);   -- depends on bset and time
-  --END PROCESS;
-
   rx_sdp_cep_header <= func_sdp_map_cep_header(rx_hdr_fields_raw);
 
   p_verify_cep_header : PROCESS
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
index 859fae39cb..84baf1ad8b 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
@@ -176,9 +176,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
   CONSTANT c_version             : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
   CONSTANT c_fw_version          : t_unb2c_board_fw_version := (1, 0);
 
-  CONSTANT c_mac_15_0            : STD_LOGIC_VECTOR(15 DOWNTO 0) := TO_UVEC(c_unb_nr + c_last_unb_nr, 8) & TO_UVEC(c_last_rn_nr MOD c_quad, 8);
-  CONSTANT c_ip_15_0             : STD_LOGIC_VECTOR(15 DOWNTO 0) := TO_UVEC(c_unb_nr + c_last_unb_nr, 8) & TO_UVEC((c_last_rn_nr MOD c_quad) +1, 8);  -- +1 to avoid IP = *.*.*.0
-
   CONSTANT c_eth_clk_period      : TIME := 8 ns;  -- 125 MHz XO on UniBoard
   CONSTANT c_ext_clk_period      : TIME := 5 ns;
   CONSTANT c_mm_clk_period       : TIME := 10 ns;  -- 100 MHz internal mm_clk
@@ -202,17 +199,14 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
   CONSTANT c_beamlet_output_delta : INTEGER := 2;  -- +-delta margin
 
   -- header fields
-  CONSTANT c_cep_eth_dst_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_dst_mac;   -- 00074306C700 = DOP36-eth0
-  CONSTANT c_cep_ip_dst_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_dst_addr;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
-  CONSTANT c_cep_udp_dst_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_dst_port;  -- 5000
-
-  CONSTANT c_cep_eth_src_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & c_mac_15_0;  -- x"00228608";  -- 47:16, 15:8 = backplane, 7:0 = node
-  CONSTANT c_cep_ip_src_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & c_ip_15_0;   -- C0A80001 = '192.168.0.1' = DOP36-eth0
+  CONSTANT c_cep_eth_src_mac     : STD_LOGIC_VECTOR(47 DOWNTO 0) := c_sdp_cep_eth_src_mac_47_16 & func_sdp_gn_index_to_mac_15_0(c_gn_index);
+  CONSTANT c_cep_ip_src_addr     : STD_LOGIC_VECTOR(31 DOWNTO 0) := c_sdp_cep_ip_src_addr_31_16 & func_sdp_gn_index_to_ip_15_0(c_gn_index);
   CONSTANT c_cep_udp_src_port    : STD_LOGIC_VECTOR(15 DOWNTO 0) := c_sdp_cep_udp_src_port_15_8 & c_id;  -- D0 & c_id
 
   CONSTANT c_exp_ip_header_checksum : NATURAL := 16#5BDD#;  -- value obtained from rx_sdp_cep_header.ip.header_checksum in wave window for c_nof_rn = 2.
 
   CONSTANT c_exp_beamlet_scale   : NATURAL := NATURAL(g_beamlet_scale * REAL(c_sdp_unit_beamlet_scale));  -- c_sdp_unit_beamlet_scale = 2**15;
+  CONSTANT c_exp_beamlet_index   : NATURAL := 0;  -- depends on beamset bset * c_sdp_S_sub_bf
 
   CONSTANT c_exp_sdp_info        : t_sdp_info := (
                                      TO_UVEC(601, 16),   -- station_id
@@ -385,6 +379,9 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
   -- MM
   SIGNAL rd_sdp_info         : t_sdp_info := c_sdp_info_rst;
   SIGNAL rd_beamlet_scale    : STD_LOGIC_VECTOR(15 DOWNTO 0);
+  SIGNAL rd_cep_eth_src_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
+  SIGNAL rd_cep_eth_dst_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
+  SIGNAL rd_cep_ip_src_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
   SIGNAL rd_cep_eth_dst_mac  : STD_LOGIC_VECTOR(47 DOWNTO 0);
   SIGNAL rd_cep_ip_dst_addr  : STD_LOGIC_VECTOR(31 DOWNTO 0);
   SIGNAL rd_cep_udp_dst_port : STD_LOGIC_VECTOR(15 DOWNTO 0);
@@ -810,18 +807,54 @@ BEGIN
       --     );
 
       v_offset := bset * c_mm_span_reg_hdr_dat;
-      -- . Use defaults, so no need to write
+      -- Default destination MAC/IP/UDP = 0
       -- . Read
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
       mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
       proc_common_wait_some_cycles(tb_clk, 1);
-
-      -- verify read
-      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 00074306C700 = DOP36-eth0
-      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- C0A80001 = '192.168.0.1' = DOP36-eth0
-      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;  -- 5000
+      -- . verify read
+      ASSERT UNSIGNED(rd_cep_eth_src_mac) = 0 REPORT "Wrong MM read rd_cep_eth_src_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_src_addr) = 0 REPORT "Wrong MM read rd_cep_ip_src_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_src_port) = 0 REPORT "Wrong MM read rd_cep_udp_src_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_eth_dst_mac) = 0 REPORT "Wrong MM read rd_cep_eth_dst_mac != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_ip_dst_addr) = 0 REPORT "Wrong MM read rd_cep_ip_dst_addr != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT UNSIGNED(rd_cep_udp_dst_port) = 0 REPORT "Wrong MM read rd_cep_udp_dst_port != 0 for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+
+      -- Write tb defaults
+      -- . Use sim default dst and src MAC, IP, UDP port from sdp_pkg.vhd and based on c_gn_index
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 39, TO_UINT(c_cep_eth_src_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 38, TO_SINT(c_cep_eth_src_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 26, TO_SINT(c_cep_ip_src_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 24, TO_UINT(c_cep_udp_src_port), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 41, TO_UINT(c_sdp_cep_eth_dst_mac(47 DOWNTO 32)), tb_clk);
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 40, TO_SINT(c_sdp_cep_eth_dst_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 25, TO_SINT(c_sdp_cep_ip_dst_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+      mmf_mm_bus_wr(c_mm_file_reg_hdr_dat, v_offset + 23, TO_UINT(c_sdp_cep_udp_dst_port), tb_clk);
+      proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency*2);
+
+      -- . Read back
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 39, rd_data, tb_clk); rd_cep_eth_src_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 38, rd_data, tb_clk); rd_cep_eth_src_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 26, rd_data, tb_clk); rd_cep_ip_src_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 24, rd_data, tb_clk); rd_cep_udp_src_port <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 41, rd_data, tb_clk); rd_cep_eth_dst_mac(47 DOWNTO 32) <= rd_data(15 DOWNTO 0);
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 40, rd_data, tb_clk); rd_cep_eth_dst_mac(31 DOWNTO  0) <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 25, rd_data, tb_clk); rd_cep_ip_dst_addr <= rd_data;
+      mmf_mm_bus_rd(c_mm_file_reg_hdr_dat, v_offset + 23, rd_data, tb_clk); rd_cep_udp_dst_port <= rd_data(15 DOWNTO 0);
+      proc_common_wait_some_cycles(tb_clk, 1);
+      -- . verify read back
+      ASSERT rd_cep_eth_src_mac = c_cep_eth_src_mac REPORT "Wrong MM read rd_cep_eth_src_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_src_addr = c_cep_ip_src_addr REPORT "Wrong MM read rd_cep_ip_src_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_src_port = c_cep_udp_src_port REPORT "Wrong MM read rd_cep_udp_src_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_eth_dst_mac = c_sdp_cep_eth_dst_mac REPORT "Wrong MM read rd_cep_eth_dst_mac for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_ip_dst_addr = c_sdp_cep_ip_dst_addr REPORT "Wrong MM read rd_cep_ip_dst_addr for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
+      ASSERT rd_cep_udp_dst_port = c_sdp_cep_udp_dst_port REPORT "Wrong MM read rd_cep_udp_dst_port for beamset " & NATURAL'IMAGE(bset) SEVERITY ERROR;
 
       ----------------------------------------------------------------------------
       -- Enable BST offload on end node (not verified here, but only for view in Wave window)
@@ -1291,59 +1324,14 @@ BEGIN
   test_sync_cnt <= in_sync_cnt - 1;  -- optionally adjust to fit rx_beamlet_sosi
 
   -- Prepare exp_sdp_cep_header before rx_beamlet_sosi.eop, so that
-  -- p_exp_sdp_cep_header can verify it at rx_beamlet_sosi.eop.
-
-  p_exp_sdp_cep_header : PROCESS(exp_dp_bsn)
-  BEGIN
-    -- eth header
-    exp_sdp_cep_header.eth.dst_mac        <= c_cep_eth_dst_mac;
-    exp_sdp_cep_header.eth.src_mac        <= c_cep_eth_src_mac;
-    exp_sdp_cep_header.eth.eth_type       <= x"0800";
-
-    -- ip header
-    exp_sdp_cep_header.ip.version         <= TO_UVEC(                        4, c_network_ip_version_w);
-    exp_sdp_cep_header.ip.header_length   <= TO_UVEC(                        5, c_network_ip_header_length_w);
-    exp_sdp_cep_header.ip.services        <= TO_UVEC(                        0, c_network_ip_services_w);
-    exp_sdp_cep_header.ip.total_length    <=         c_sdp_cep_ip_total_length;  -- 7868, see ICD STAT-CEP
-    exp_sdp_cep_header.ip.identification  <= TO_UVEC(                        0, c_network_ip_identification_w);
-    exp_sdp_cep_header.ip.flags           <= TO_UVEC(                        2, c_network_ip_flags_w);
-    exp_sdp_cep_header.ip.fragment_offset <= TO_UVEC(                        0, c_network_ip_fragment_offset_w);
-    exp_sdp_cep_header.ip.time_to_live    <= TO_UVEC(                      127, c_network_ip_time_to_live_w);
-    exp_sdp_cep_header.ip.protocol        <= TO_UVEC(                       17, c_network_ip_protocol_w);
-    exp_sdp_cep_header.ip.header_checksum <= TO_UVEC( c_exp_ip_header_checksum, c_network_ip_header_checksum_w);
-    exp_sdp_cep_header.ip.src_ip_addr     <=                 c_cep_ip_src_addr;  -- c_network_ip_addr_w
-    exp_sdp_cep_header.ip.dst_ip_addr     <=                 c_cep_ip_dst_addr;  -- c_network_ip_addr_w
-
-    -- udp header
-    exp_sdp_cep_header.udp.src_port       <=                 c_cep_udp_src_port;
-    exp_sdp_cep_header.udp.dst_port       <=                 c_cep_udp_dst_port;
-    exp_sdp_cep_header.udp.total_length   <=         c_sdp_cep_udp_total_length;  -- 7848, see ICD STAT-CEP
-    exp_sdp_cep_header.udp.checksum       <= TO_UVEC(                         0, c_network_udp_checksum_w);
-
-    -- app header
-    exp_sdp_cep_header.app.sdp_marker         <= TO_UVEC(c_sdp_marker_beamlets, 8);  -- 98 = x"62" = 'b'
-    exp_sdp_cep_header.app.sdp_version_id     <= TO_UVEC(c_sdp_cep_version_id, 8);  -- 5
-    exp_sdp_cep_header.app.sdp_observation_id <= c_exp_sdp_info.observation_id;
-    exp_sdp_cep_header.app.sdp_station_id     <= c_exp_sdp_info.station_id;
-
-    exp_sdp_cep_header.app.sdp_source_info_antenna_band_id    <= slv(c_exp_sdp_info.antenna_band_index);
-    exp_sdp_cep_header.app.sdp_source_info_nyquist_zone_id    <=     c_exp_sdp_info.nyquist_zone_index;
-    exp_sdp_cep_header.app.sdp_source_info_f_adc              <= slv(c_exp_sdp_info.f_adc);
-    exp_sdp_cep_header.app.sdp_source_info_fsub_type          <= slv(c_exp_sdp_info.fsub_type);
-    exp_sdp_cep_header.app.sdp_source_info_payload_error      <= TO_UVEC(0, 1);
-    exp_sdp_cep_header.app.sdp_source_info_repositioning_flag <= slv(c_exp_sdp_info.beam_repositioning_flag);
-    exp_sdp_cep_header.app.sdp_source_info_beamlet_width      <= TO_UVEC(c_sdp_W_beamlet, 4);
-    exp_sdp_cep_header.app.sdp_source_info_gn_id              <= TO_UVEC(c_gn_index, 5);
-
-    exp_sdp_cep_header.app.sdp_reserved                       <= TO_UVEC(                               0, 40);
-    exp_sdp_cep_header.app.sdp_beamlet_scale                  <= TO_UVEC(             c_exp_beamlet_scale, 16);
-    exp_sdp_cep_header.app.sdp_beamlet_index                  <= TO_UVEC(                               0, 16);  -- depends on bset
-    exp_sdp_cep_header.app.sdp_nof_blocks_per_packet          <= TO_UVEC( c_sdp_cep_nof_blocks_per_packet,  8);
-    exp_sdp_cep_header.app.sdp_nof_beamlets_per_block         <= TO_UVEC(c_sdp_cep_nof_beamlets_per_block, 16);
-    exp_sdp_cep_header.app.sdp_block_period                   <= c_exp_sdp_info.block_period;
-
-    exp_sdp_cep_header.app.dp_bsn <= TO_UVEC(exp_dp_bsn, 64);   -- depends on bset and time
-  END PROCESS;
+  -- p_verify_cep_header can verify it at rx_beamlet_sosi.eop.
+
+  exp_sdp_cep_header <= func_sdp_compose_cep_header(c_exp_ip_header_checksum,
+                                                    c_exp_sdp_info,
+                                                    c_gn_index,
+                                                    c_exp_beamlet_scale,
+                                                    c_exp_beamlet_index,
+                                                    exp_dp_bsn);
 
   rx_sdp_cep_header <= func_sdp_map_cep_header(rx_hdr_fields_raw);
 
-- 
GitLab