From e567cc5b6f429eb448ea604649faf83d149d1f41 Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Fri, 27 Nov 2020 12:19:50 +0100
Subject: [PATCH] processed review comments

---
 .../src/vhdl/lofar2_unb2b_beamformer.vhd      | 35 ++++++-------
 .../sdp/src/vhdl/node_sdp_beamformer.vhd      |  2 +-
 .../sdp/src/vhdl/sdp_beamformer_output.vhd    | 51 ++++++++++---------
 .../libraries/sdp/src/vhdl/sdp_bf_weights.vhd |  2 +-
 .../lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd | 16 +++---
 .../sdp/src/vhdl/sdp_subband_equalizer.vhd    |  2 +-
 .../base/dp/src/vhdl/mms_dp_gain_arr.vhd      |  1 +
 7 files changed, 54 insertions(+), 55 deletions(-)

diff --git a/applications/lofar2/designs/lofar2_unb2b_beamformer/src/vhdl/lofar2_unb2b_beamformer.vhd b/applications/lofar2/designs/lofar2_unb2b_beamformer/src/vhdl/lofar2_unb2b_beamformer.vhd
index 23a850b737..00f3c7f779 100644
--- a/applications/lofar2/designs/lofar2_unb2b_beamformer/src/vhdl/lofar2_unb2b_beamformer.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_beamformer/src/vhdl/lofar2_unb2b_beamformer.vhd
@@ -51,7 +51,6 @@ ENTITY lofar2_unb2b_beamformer IS
     g_sim                    : BOOLEAN := FALSE; --Overridden by TB
     g_sim_unb_nr             : NATURAL := 0;
     g_sim_node_nr            : NATURAL := 0;
-    g_sim_model_ddr          : BOOLEAN := FALSE;
     g_stamp_date             : NATURAL := 0;  -- Date (YYYYMMDD) -- set by QSF
     g_stamp_time             : NATURAL := 0;  -- Time (HHMMSS)   -- set by QSF
     g_revision_id            : STRING  := "";  -- revision ID     -- set by QSF
@@ -95,13 +94,13 @@ ENTITY lofar2_unb2b_beamformer IS
     QSFP_LED     : OUT   STD_LOGIC_VECTOR(c_unb2b_board_tr_qsfp_nof_leds-1 DOWNTO 0);
 
      -- back transceivers (Note: numbered from 0)
-    JESD204B_SERIAL_DATA       : IN    STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.bus_w*c_unb2b_board_tr_jesd204b.nof_bus)-1 downto 0); 
+    JESD204B_SERIAL_DATA       : IN    STD_LOGIC_VECTOR(c_sdp_S_pn-1 downto 0); 
                                                   -- Connect to the BCK_RX pins in the top wrapper
     JESD204B_REFCLK            : IN    STD_LOGIC; -- Connect to BCK_REF_CLK pin in the top level wrapper
  
     -- jesd204b syncronization signals
     JESD204B_SYSREF            : IN    STD_LOGIC;
-    JESD204B_SYNC_N            : OUT   STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.bus_w*c_unb2b_board_tr_jesd204b.nof_bus)-1 DOWNTO 0)
+    JESD204B_SYNC_N            : OUT   STD_LOGIC_VECTOR(c_sdp_S_pn-1 DOWNTO 0)
   );
 END lofar2_unb2b_beamformer;
 
@@ -128,19 +127,19 @@ ARCHITECTURE str OF lofar2_unb2b_beamformer IS
   CONSTANT c_fifo_tx_fill                  : NATURAL := c_10GbE_block_size; 
   CONSTANT c_fifo_tx_size                  : NATURAL := c_fifo_tx_fill + 11; -- Make fifo size large enough for adding header.
  
-  -- Address widths
+  -- Address widths of a single MM instance
   CONSTANT c_addr_w_ram_ss_ss_wide : NATURAL := ceil_log2(c_sdp_P_pfb * c_sdp_S_sub_bf * c_sdp_Q_fft); 
   CONSTANT c_addr_w_ram_bf_weights : NATURAL := ceil_log2(c_sdp_N_pol * c_sdp_P_pfb * c_sdp_S_sub_bf * c_sdp_Q_fft); 
   CONSTANT c_addr_w_reg_bf_scale   : NATURAL := 1; 
-  CONSTANT c_addr_w_reg_hdr_dat    : NATURAL := ceil_log2(field_nof_words(c_sdp_hdr_field_arr, c_word_w)); 
+  CONSTANT c_addr_w_reg_hdr_dat    : NATURAL := ceil_log2(field_nof_words(c_sdp_cep_hdr_field_arr, c_word_w)); 
   CONSTANT c_addr_w_reg_dp_xonoff  : NATURAL := 1; 
   CONSTANT c_addr_w_ram_st_bst     : NATURAL := ceil_log2(c_sdp_S_sub_bf*c_sdp_N_pol*(c_longword_sz/c_word_sz));
 
  
   -- Read only sdp_info values
-  CONSTANT c_sdp_info_f_adc     : STD_LOGIC := '1'; -- '0' => 160M, '1' => 200M
-  CONSTANT c_sdp_info_fsub_type : STD_LOGIC := '0'; -- '0' => critical sampled PFB, '1' => oversampled PFB
-  SIGNAL sdp_info_gn_index : NATURAL := 0;
+  CONSTANT c_f_adc     : STD_LOGIC := '1'; -- '0' => 160M, '1' => 200M
+  CONSTANT c_fsub_type : STD_LOGIC := '0'; -- '0' => critical sampled PFB, '1' => oversampled PFB
+  SIGNAL gn_index : NATURAL := 0;
 
 
   -- System
@@ -729,7 +728,7 @@ BEGIN
   -----------------------------------------------------------------------------
   -- SDP Info register
   -----------------------------------------------------------------------------
-  sdp_info_gn_index <= TO_UINT(ID(c_sdp_W_gn_id-1 DOWNTO 0));
+  gn_index <= TO_UINT(ID(c_sdp_W_gn_id-1 DOWNTO 0));
 
   u_sdp_info : ENTITY lofar2_sdp_lib.sdp_info
   PORT MAP(
@@ -744,9 +743,9 @@ BEGIN
     reg_miso  => reg_sdp_info_miso,
 
     -- inputs from other blocks
-    gn_index  => sdp_info_gn_index, 
-    f_adc     => c_sdp_info_f_adc, 
-    fsub_type => c_sdp_info_fsub_type, 
+    gn_index  => gn_index, 
+    f_adc     => c_f_adc, 
+    fsub_type => c_fsub_type, 
 
     -- sdp info
     sdp_info => sdp_info 
@@ -885,6 +884,9 @@ BEGIN
   -----------------------------------------------------------------------------
   -- DP MUX
   -----------------------------------------------------------------------------
+  -- Assign hdr_fields to nw_10GbE for ARP/PING functionality. Only the fields: 
+  -- eth_src_mac, ip_src_addr and ip_dst_addr are used. Which are identical for
+  -- both beamsets.
   nw_10GbE_hdr_fields_in_arr(0) <= bf_10GbE_hdr_fields_out_arr(0);
 
   u_dp_mux : ENTITY dp_lib.dp_mux
@@ -963,7 +965,7 @@ BEGIN
       g_direction     => "TX_RX",
       g_tx_fifo_fill  => c_fifo_tx_fill,
       g_tx_fifo_size  => c_fifo_tx_size,
-      g_ip_hdr_field_arr => c_sdp_hdr_field_arr
+      g_ip_hdr_field_arr => c_sdp_cep_hdr_field_arr
 
     )
     PORT MAP (
@@ -1001,11 +1003,4 @@ BEGIN
       hdr_fields_in_arr     => nw_10GbE_hdr_fields_in_arr 
     );
 
-
-
-
-
-
-
-
 END str;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
index 2c52e75964..f453ee5fe4 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
@@ -75,7 +75,7 @@ ENTITY node_sdp_beamformer IS
     ip_src_addr  : IN STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0);
     udp_src_port : IN STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);
 
-    hdr_fields_out : OUT STD_LOGIC_VECTOR(1023 DOWNTO 0)
+    hdr_fields_out : OUT STD_LOGIC_VECTOR(1023 DOWNTO 0) -- Needed by nw_10GbE for PING/ARP
   );
 END node_sdp_beamformer;
 
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
index 0cf99e4ee0..34652ab691 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
@@ -76,7 +76,7 @@ ARCHITECTURE str OF sdp_beamformer_output IS
 
   CONSTANT c_data_w                 : NATURAL := c_nof_complex*c_sdp_W_beamlet; --16b
   CONSTANT c_beamlet_id             : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
-  CONSTANT c_fifo_fill              : NATURAL := c_sdp_nof_blocks_per_packet * c_sdp_nof_beamlets_per_block / 4; -- 4 beamlets fit in 1 64bit longword 
+  CONSTANT c_fifo_fill              : NATURAL := c_sdp_cep_nof_blocks_per_packet * c_sdp_cep_nof_beamlets_per_block / 4; -- Size of packet: 4 beamlets fit in 1 64bit longword 
   CONSTANT c_fifo_size              : NATURAL := c_fifo_fill*2; -- Make fifo size large enough for adding header and muxing beamsets.
  
   SIGNAL snk_in_concat           : t_dp_sosi;
@@ -134,7 +134,7 @@ BEGIN
   -------------------------------------------------------------------------------
   u_dp_packet_merge : ENTITY dp_lib.dp_packet_merge
   GENERIC MAP(
-    g_nof_pkt       => c_sdp_nof_blocks_per_packet
+    g_nof_pkt       => c_sdp_cep_nof_blocks_per_packet
   )
   PORT MAP(
     rst     => dp_rst,    
@@ -153,6 +153,8 @@ BEGIN
   --   source.
   -- . Also, we need a fill FIFO here because 16b->64b will introduce gaps in our
   --   TX stream (not allowed by 10G TX MAC).
+  -- . The fill fifo waits until c_fifo_fill words are received before enabling the
+  --   output. The total number of words in the fifo is determained by the backpressure.
   -------------------------------------------------------------------------------
   u_dp_fifo_fill_sc : ENTITY dp_lib.dp_fifo_fill_sc
   GENERIC MAP (
@@ -176,8 +178,9 @@ BEGIN
     src_in  => dp_fifo_sc_src_in
   );
 
-  -- Simple fifo to store the payload error at eop.
-  common_fifo_rd_req <= dp_fifo_sc_src_out.sop AND dp_fifo_sc_src_out.valid;
+  -- Simple fifo to store the payload error at eop of FIFO input to be used at sop of FIFO output.
+  -- It can then be used in the packet header.
+  common_fifo_rd_req <= dp_fifo_sc_src_out.sop;
   u_common_fifo_sc : ENTITY common_lib.common_fifo_sc
   GENERIC MAP (
     g_dat_w => 1,
@@ -195,25 +198,25 @@ BEGIN
   -------------------------------------------------------------------------------
   -- Assemble offload info
   -------------------------------------------------------------------------------
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_sdp_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_hdr_field_arr, "udp_src_port")) <= udp_src_port;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_sdp_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr;
-
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_observation_id"                 ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_observation_id"                 )) <= sdp_info.observation_id;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_station_id"                     ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_station_id"                     )) <= sdp_info.station_id;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_antenna_band_id"    ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_antenna_band_id"    )) <= SLV(sdp_info.antenna_band_index);
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_nyquist_zone_id"    ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_nyquist_zone_id"    )) <= sdp_info.nyquist_zone_index;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_f_adc"              ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_f_adc"              )) <= SLV(sdp_info.f_adc);
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_fsub_type"          ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_fsub_type"          )) <= SLV(sdp_info.fsub_type);
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_payload_error"      ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_payload_error"      )) <= payload_err;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_repositioning_flag" ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_repositioning_flag" )) <= SLV(sdp_info.beam_repositioning_flag);
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_source_info_gn_id"              ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_source_info_gn_id"              )) <= gn_id;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_reserved"                       ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_reserved"                       )) <= (OTHERS => '0');
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_beamlet_scale"                  ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_beamlet_scale"                  )) <= sdp_info.beamlet_scale;
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_beamlet_id"                     ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_beamlet_id"                     )) <= TO_UVEC(c_beamlet_id, c_halfword_w);
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "sdp_block_period"                   ) DOWNTO field_lo(c_sdp_hdr_field_arr,  "sdp_block_period"                   )) <= sdp_info.block_period;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "udp_src_port")) <= udp_src_port;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr;
+
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_observation_id"                 ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_observation_id"                 )) <= sdp_info.observation_id;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_station_id"                     ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_station_id"                     )) <= sdp_info.station_id;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_antenna_band_id"    ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_antenna_band_id"    )) <= SLV(sdp_info.antenna_band_index);
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_nyquist_zone_id"    ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_nyquist_zone_id"    )) <= sdp_info.nyquist_zone_index;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_f_adc"              ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_f_adc"              )) <= SLV(sdp_info.f_adc);
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_fsub_type"          ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_fsub_type"          )) <= SLV(sdp_info.fsub_type);
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_payload_error"      ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_payload_error"      )) <= payload_err;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_repositioning_flag" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_repositioning_flag" )) <= SLV(sdp_info.beam_repositioning_flag);
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_source_info_gn_id"              ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_source_info_gn_id"              )) <= gn_id;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_reserved"                       ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_reserved"                       )) <= (OTHERS => '0');
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_beamlet_scale"                  ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_beamlet_scale"                  )) <= sdp_info.beamlet_scale;
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_beamlet_id"                     ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_beamlet_id"                     )) <= TO_UVEC(c_beamlet_id, c_halfword_w);
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_block_period"                   ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr,  "sdp_block_period"                   )) <= sdp_info.block_period;
                                                                                                                
-  dp_offload_tx_hdr_fields(field_hi(c_sdp_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_hdr_field_arr, "dp_bsn" )) <= dp_fifo_sc_src_out.bsn(63 DOWNTO 0); 
+  dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_cep_hdr_field_arr, "dp_bsn" )) <= dp_fifo_sc_src_out.bsn(63 DOWNTO 0); 
 
 
   -------------------------------------------------------------------------------
@@ -224,8 +227,8 @@ BEGIN
     g_nof_streams   => 1,
     g_data_w        => c_longword_w,
     g_symbol_w      => c_byte_w,
-    g_hdr_field_arr => c_sdp_hdr_field_arr,
-    g_hdr_field_sel => c_sdp_hdr_field_sel
+    g_hdr_field_arr => c_sdp_cep_hdr_field_arr,
+    g_hdr_field_sel => c_sdp_cep_hdr_field_sel
   )
   PORT MAP (
     mm_rst                => mm_rst,
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_bf_weights.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_bf_weights.vhd
index 3de1f2fda9..4588db0590 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_bf_weights.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_bf_weights.vhd
@@ -83,7 +83,7 @@ BEGIN
       cnt <= 0;
       v_Q_fft := 0;
       v_S_sub_bf := 0;
-    ELSIF rising_edge(dp_clk) THEN
+    ELSIF rising_edge(dp_clk) AND in_sosi_arr(0).valid = '1' THEN
       IF in_sosi_arr(0).eop = '1' THEN
         v_Q_fft := 0;
         v_S_sub_bf := 0;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
index a9e8096779..f62cfa0e44 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
@@ -144,12 +144,12 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_ram_st_bst_addr_w          : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_S_sub_bf*c_sdp_N_pol*(c_longword_sz/c_word_sz));
 
   -- 10GbE offload
-  CONSTANT c_sdp_nof_blocks_per_packet  : NATURAL := 4;
-  CONSTANT c_sdp_nof_beamlets_per_block : NATURAL := c_sdp_N_pol * c_sdp_S_sub_bf; 
-  CONSTANT c_sdp_nof_hdr_fields : NATURAL := 3+12+4+18+1; -- 592b; 9.25 64b words
-  CONSTANT c_sdp_hdr_field_sel  : STD_LOGIC_VECTOR(c_sdp_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111001"&"0111"&"110000000010000110"&"0";
+  CONSTANT c_sdp_cep_nof_blocks_per_packet  : NATURAL := 4;
+  CONSTANT c_sdp_cep_nof_beamlets_per_block : NATURAL := c_sdp_N_pol * c_sdp_S_sub_bf; 
+  CONSTANT c_sdp_cep_nof_hdr_fields : NATURAL := 3+12+4+18+1; -- 592b; 9.25 64b words
+  CONSTANT c_sdp_cep_hdr_field_sel  : STD_LOGIC_VECTOR(c_sdp_cep_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111001"&"0111"&"110000000010000110"&"0";
 
-  CONSTANT c_sdp_hdr_field_arr : t_common_field_arr(c_sdp_nof_hdr_fields-1 DOWNTO 0) := ( 
+  CONSTANT c_sdp_cep_hdr_field_arr : t_common_field_arr(c_sdp_cep_nof_hdr_fields-1 DOWNTO 0) := ( 
       ( field_name_pad("eth_dst_mac"                        ), "RW", 48, field_default(x"00074306C700") ), -- 00074306C700=DOP36-eth0 
       ( field_name_pad("eth_src_mac"                        ), "RW", 48, field_default(0) ),
       ( field_name_pad("eth_type"                           ), "RW", 16, field_default(x"0800") ),
@@ -184,14 +184,14 @@ PACKAGE sdp_pkg is
       ( field_name_pad("sdp_reserved"                       ), "RW", 40, field_default(0) ),
       ( field_name_pad("sdp_beamlet_scale"                  ), "RW", 16, field_default(2**15) ),
       ( field_name_pad("sdp_beamlet_id"                     ), "RW", 16, field_default(0) ),
-      ( field_name_pad("sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_nof_blocks_per_packet) ),
-      ( field_name_pad("sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_nof_beamlets_per_block) ),
+      ( field_name_pad("sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
+      ( field_name_pad("sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
       ( field_name_pad("sdp_block_period"                   ), "RW", 16, field_default(5120) ),
       ( field_name_pad("dp_bsn"                             ), "RW", 64, field_default(0) ) 
   );
 
   -- 10GbE MM address widths
-  CONSTANT c_sdp_reg_hdr_dat_addr_w         : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(field_nof_words(c_sdp_hdr_field_arr, c_word_w));
+  CONSTANT c_sdp_reg_hdr_dat_addr_w         : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(field_nof_words(c_sdp_cep_hdr_field_arr, c_word_w));
   CONSTANT c_sdp_reg_nw_10GbE_mac_addr_w    : NATURAL := 13;
   CONSTANT c_sdp_reg_nw_10GbE_eth10g_addr_w : NATURAL := 1;
 
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd
index 207b9330ef..f4048ce943 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd
@@ -83,7 +83,7 @@ BEGIN
       cnt <= 0;
       v_Q_fft := 0;
       v_N_sub := 0;
-    ELSIF rising_edge(dp_clk) THEN
+    ELSIF rising_edge(dp_clk) AND in_sosi_arr(0).valid = '1' THEN
       IF in_sosi_arr(0).eop = '1' THEN
         v_Q_fft := 0;
         v_N_sub := 0;
diff --git a/libraries/base/dp/src/vhdl/mms_dp_gain_arr.vhd b/libraries/base/dp/src/vhdl/mms_dp_gain_arr.vhd
index 7e5d8e3673..90716d3e5e 100644
--- a/libraries/base/dp/src/vhdl/mms_dp_gain_arr.vhd
+++ b/libraries/base/dp/src/vhdl/mms_dp_gain_arr.vhd
@@ -49,6 +49,7 @@
 --   time multiplexed data, then a new component is necessary. The gains per
 --   stream may then be stored in a MM RAM, because they are used sequentially.
 -- . see also reqant_selection_compensation.m
+-- . A dp_pipeline is used to pass through the dp_control_fields.
 
 LIBRARY IEEE, common_lib, common_mult_lib, technology_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
-- 
GitLab