From 7c64cb1176ed00d9d59141e1277cbad959a7b1e6 Mon Sep 17 00:00:00 2001
From: Daniel van der Schuur <schuur@astron.nl>
Date: Fri, 14 Apr 2017 11:03:23 +0000
Subject: [PATCH] -Added fiber delay compensation:  . dp_fifo_fill +
 dp_fifo_monitor in top level;  . Corresponding registers in MMM and SOPC;  .
 Verified OK in sim using tb_apertif_unb1_fn_beamformer_base:    . No MM
 control: dp_fifo_fill forwards data like old situation (fill level 0)    .   
 MM control: dp_fifo_fill delays data with delay as specified using        
 dp_fifo_monitor control.

---
 .../sopc_apertif_unb1_fn_beamformer.sopc      | 226 ++++++++++--------
 .../src/vhdl/apertif_unb1_fn_beamformer.vhd   |  90 ++++++-
 .../vhdl/mmm_apertif_unb1_fn_beamformer.vhd   |  20 +-
 3 files changed, 233 insertions(+), 103 deletions(-)

diff --git a/applications/apertif/designs/apertif_unb1_fn_beamformer/quartus/sopc_apertif_unb1_fn_beamformer.sopc b/applications/apertif/designs/apertif_unb1_fn_beamformer/quartus/sopc_apertif_unb1_fn_beamformer.sopc
index deb198425e..cb1dff8d42 100644
--- a/applications/apertif/designs/apertif_unb1_fn_beamformer/quartus/sopc_apertif_unb1_fn_beamformer.sopc
+++ b/applications/apertif/designs/apertif_unb1_fn_beamformer/quartus/sopc_apertif_unb1_fn_beamformer.sopc
@@ -92,71 +92,68 @@
          type = "String";
       }
    }
-   element ram_diag_data_buffer_output.mem
+   element ram_dp_ram_from_mm.mem
    {
       datum baseAddress
       {
-         value = "864256";
+         value = "512";
          type = "long";
       }
    }
-   element reg_bsn_monitor_output.mem
+   element reg_dp_split.mem
    {
       datum baseAddress
       {
-         value = "768";
+         value = "1728";
          type = "long";
       }
    }
-   element reg_diagnostics_mesh.mem
+   element reg_tr_10GbE.mem
    {
       datum baseAddress
       {
-         value = "256";
+         value = "786432";
          type = "long";
       }
    }
-   element reg_dp_split.mem
+   element ram_bf_weights.mem
    {
       datum baseAddress
       {
-         value = "1728";
+         value = "262144";
          type = "long";
       }
    }
-   element ram_fringe_stop_step.mem
+   element reg_tr_nonbonded_mesh.mem
    {
       datum baseAddress
       {
-         value = "872448";
+         value = "1280";
          type = "long";
       }
    }
-   element ram_ss_ss_wide_transp.mem
+   element reg_wdi.mem
    {
-      datum baseAddress
+      datum _lockedAddress
       {
-         value = "819200";
-         type = "long";
+         value = "1";
+         type = "boolean";
       }
-   }
-   element reg_unb_sens.mem
-   {
       datum baseAddress
       {
-         value = "1632";
+         value = "12288";
          type = "long";
       }
    }
-   element ram_ss_ss_wide.mem
+   element reg_dp_xonoff_output.mem
    {
       datum baseAddress
       {
-         value = "524288";
+         value = "2008";
          type = "long";
       }
    }
-   element rom_system_info.mem
+   element pio_system_info.mem
    {
       datum _lockedAddress
       {
@@ -165,52 +162,47 @@
       }
       datum baseAddress
       {
-         value = "4096";
+         value = "0";
          type = "long";
       }
    }
-   element reg_dp_xonoff_output.mem
+   element ram_diag_bg.mem
    {
       datum baseAddress
       {
-         value = "2008";
+         value = "32768";
          type = "long";
       }
    }
-   element pio_pps.mem
+   element ram_diag_data_buffer_terminal.mem
    {
       datum baseAddress
       {
-         value = "2000";
+         value = "65536";
          type = "long";
       }
    }
-   element reg_wdi.mem
+   element reg_unb_sens.mem
    {
-      datum _lockedAddress
-      {
-         value = "1";
-         type = "boolean";
-      }
       datum baseAddress
       {
-         value = "12288";
+         value = "1632";
          type = "long";
       }
    }
-   element reg_st_sst.mem
+   element reg_dp_sync_checker.mem
    {
       datum baseAddress
       {
-         value = "1408";
+         value = "1968";
          type = "long";
       }
    }
-   element ram_bf_weights.mem
+   element reg_dp_ram_from_mm.mem
    {
       datum baseAddress
       {
-         value = "262144";
+         value = "1696";
          type = "long";
       }
    }
@@ -222,19 +214,19 @@
          type = "long";
       }
    }
-   element reg_mdio_1.mem
+   element reg_diagnostics_mesh.mem
    {
       datum baseAddress
       {
-         value = "1824";
+         value = "256";
          type = "long";
       }
    }
-   element ram_dp_ram_from_mm.mem
+   element reg_mdio_1.mem
    {
       datum baseAddress
       {
-         value = "512";
+         value = "1824";
          type = "long";
       }
    }
@@ -246,71 +238,79 @@
          type = "long";
       }
    }
-   element reg_mdio_0.mem
+   element reg_dp_pkt_merge.mem
    {
       datum baseAddress
       {
-         value = "1792";
+         value = "1760";
          type = "long";
       }
    }
-   element reg_dp_offload_tx_hdr_dat.mem
+   element reg_dp_fifo_monitor.mem
    {
       datum baseAddress
       {
-         value = "1024";
+         value = "2048";
          type = "long";
       }
    }
-   element reg_diag_bg_output.mem
+   element reg_mdio_0.mem
    {
       datum baseAddress
       {
-         value = "1888";
+         value = "1792";
          type = "long";
       }
    }
-   element reg_dp_ram_from_mm.mem
+   element reg_mdio_2.mem
    {
       datum baseAddress
       {
-         value = "1696";
+         value = "1856";
          type = "long";
       }
    }
-   element reg_diag_data_buffer_terminal.mem
+   element ram_fringe_stop_step.mem
    {
       datum baseAddress
       {
-         value = "128";
+         value = "872448";
          type = "long";
       }
    }
-   element reg_dp_offload_tx.mem
+   element ram_diag_data_buffer_output.mem
    {
       datum baseAddress
       {
-         value = "1992";
+         value = "864256";
          type = "long";
       }
    }
-   element reg_diag_bg.mem
+   element reg_st_sst.mem
    {
       datum baseAddress
       {
-         value = "1664";
+         value = "1408";
          type = "long";
       }
    }
-   element reg_dp_pkt_merge.mem
+   element reg_dp_offload_tx.mem
    {
       datum baseAddress
       {
-         value = "1760";
+         value = "1992";
          type = "long";
       }
    }
-   element pio_system_info.mem
+   element reg_bsn_monitor_output.mem
+   {
+      datum baseAddress
+      {
+         value = "768";
+         type = "long";
+      }
+   }
+   element rom_system_info.mem
    {
       datum _lockedAddress
       {
@@ -319,95 +319,103 @@
       }
       datum baseAddress
       {
-         value = "0";
+         value = "4096";
          type = "long";
       }
    }
-   element ram_diag_bg.mem
+   element reg_diag_data_buffer_output.mem
    {
       datum baseAddress
       {
-         value = "32768";
+         value = "1152";
          type = "long";
       }
    }
-   element ram_fringe_stop_offset.mem
+   element ram_st_sst.mem
    {
       datum baseAddress
       {
-         value = "868352";
+         value = "16384";
          type = "long";
       }
    }
-   element reg_diag_data_buffer_output.mem
+   element reg_dp_switch.mem
    {
       datum baseAddress
       {
-         value = "1152";
+         value = "2016";
          type = "long";
       }
    }
-   element reg_dp_switch.mem
+   element pio_pps.mem
    {
       datum baseAddress
       {
-         value = "2016";
+         value = "2000";
          type = "long";
       }
    }
-   element ram_diag_data_buffer_terminal.mem
+   element reg_diag_bg.mem
    {
       datum baseAddress
       {
-         value = "65536";
+         value = "1664";
          type = "long";
       }
    }
-   element ram_st_sst.mem
+   element reg_bsn_monitor.mem
    {
       datum baseAddress
       {
-         value = "16384";
+         value = "1344";
          type = "long";
       }
    }
-   element reg_mdio_2.mem
+   element reg_diag_bg_output.mem
    {
       datum baseAddress
       {
-         value = "1856";
+         value = "1888";
          type = "long";
       }
    }
-   element reg_tr_nonbonded_mesh.mem
+   element ram_fringe_stop_offset.mem
    {
       datum baseAddress
       {
-         value = "1280";
+         value = "868352";
          type = "long";
       }
    }
-   element reg_dp_sync_checker.mem
+   element ram_ss_ss_wide.mem
    {
       datum baseAddress
       {
-         value = "1968";
+         value = "524288";
          type = "long";
       }
    }
-   element reg_bsn_monitor.mem
+   element reg_dp_offload_tx_hdr_dat.mem
    {
       datum baseAddress
       {
-         value = "1344";
+         value = "1024";
          type = "long";
       }
    }
-   element reg_tr_10GbE.mem
+   element ram_ss_ss_wide_transp.mem
    {
       datum baseAddress
       {
-         value = "786432";
+         value = "819200";
+         type = "long";
+      }
+   }
+   element reg_diag_data_buffer_terminal.mem
+   {
+      datum baseAddress
+      {
+         value = "128";
          type = "long";
       }
    }
@@ -644,6 +652,14 @@
          type = "int";
       }
    }
+   element reg_dp_fifo_monitor
+   {
+      datum _sortIndex
+      {
+         value = "47";
+         type = "int";
+      }
+   }
    element reg_dp_offload_tx
    {
       datum _sortIndex
@@ -804,11 +820,16 @@
          type = "long";
       }
    }
-   element pio_debug_wave.s1
+   element pio_wdi.s1
    {
+      datum _lockedAddress
+      {
+         value = "0";
+         type = "boolean";
+      }
       datum baseAddress
       {
-         value = "1936";
+         value = "1952";
          type = "long";
       }
    }
@@ -825,16 +846,11 @@
          type = "long";
       }
    }
-   element pio_wdi.s1
+   element pio_debug_wave.s1
    {
-      datum _lockedAddress
-      {
-         value = "0";
-         type = "boolean";
-      }
       datum baseAddress
       {
-         value = "1952";
+         value = "1936";
          type = "long";
       }
    }
@@ -866,10 +882,10 @@
  <parameter name="globalResetBus" value="true" />
  <parameter name="hdlLanguage" value="VHDL" />
  <parameter name="maxAdditionalLatency" value="0" />
- <parameter name="projectName">apertif_unb1_fn_beamformer_trans.qpf</parameter>
+ <parameter name="projectName" value="" />
  <parameter name="sopcBorderPoints" value="true" />
- <parameter name="systemHash" value="-124834403840" />
- <parameter name="timeStamp" value="1484667397267" />
+ <parameter name="systemHash" value="-127538139982" />
+ <parameter name="timeStamp" value="1492163736749" />
  <parameter name="useTestBenchNamingPattern" value="false" />
  <module kind="clock_source" version="11.1" enabled="1" name="clk_0">
   <parameter name="clockFrequency" value="25000000" />
@@ -970,7 +986,7 @@
   <parameter name="dcache_numTCDM" value="_0" />
   <parameter name="dcache_lineSize" value="_32" />
   <parameter name="dcache_bursts" value="false" />
-  <parameter name="dataSlaveMapParam"><![CDATA[<address-map><slave name='pio_system_info.mem' start='0x0' end='0x80' /><slave name='reg_diag_data_buffer_terminal.mem' start='0x80' end='0x100' /><slave name='reg_diagnostics_mesh.mem' start='0x100' end='0x200' /><slave name='ram_dp_ram_from_mm.mem' start='0x200' end='0x300' /><slave name='reg_bsn_monitor_output.mem' start='0x300' end='0x400' /><slave name='reg_dp_offload_tx_hdr_dat.mem' start='0x400' end='0x480' /><slave name='reg_diag_data_buffer_output.mem' start='0x480' end='0x500' /><slave name='reg_tr_nonbonded_mesh.mem' start='0x500' end='0x540' /><slave name='reg_bsn_monitor.mem' start='0x540' end='0x580' /><slave name='reg_st_sst.mem' start='0x580' end='0x5C0' /><slave name='avs_eth_0.mms_reg' start='0x5C0' end='0x600' /><slave name='reg_io_ddr.mem' start='0x600' end='0x640' /><slave name='timer_0.s1' start='0x640' end='0x660' /><slave name='reg_unb_sens.mem' start='0x660' end='0x680' /><slave name='reg_diag_bg.mem' start='0x680' end='0x6A0' /><slave name='reg_dp_ram_from_mm.mem' start='0x6A0' end='0x6C0' /><slave name='reg_dp_split.mem' start='0x6C0' end='0x6E0' /><slave name='reg_dp_pkt_merge.mem' start='0x6E0' end='0x700' /><slave name='reg_mdio_0.mem' start='0x700' end='0x720' /><slave name='reg_mdio_1.mem' start='0x720' end='0x740' /><slave name='reg_mdio_2.mem' start='0x740' end='0x760' /><slave name='reg_diag_bg_output.mem' start='0x760' end='0x780' /><slave name='altpll_0.pll_slave' start='0x780' end='0x790' /><slave name='pio_debug_wave.s1' start='0x790' end='0x7A0' /><slave name='pio_wdi.s1' start='0x7A0' end='0x7B0' /><slave name='reg_dp_sync_checker.mem' start='0x7B0' end='0x7C0' /><slave name='jtag_uart_0.avalon_jtag_slave' start='0x7C0' end='0x7C8' /><slave name='reg_dp_offload_tx.mem' start='0x7C8' end='0x7D0' /><slave name='pio_pps.mem' start='0x7D0' end='0x7D8' /><slave name='reg_dp_xonoff_output.mem' start='0x7D8' end='0x7E0' /><slave name='reg_dp_switch.mem' start='0x7E0' end='0x7E8' /><slave name='rom_system_info.mem' start='0x1000' end='0x2000' /><slave name='avs_eth_0.mms_tse' start='0x2000' end='0x3000' /><slave name='reg_wdi.mem' start='0x3000' end='0x3008' /><slave name='cpu_0.jtag_debug_module' start='0x3800' end='0x4000' /><slave name='ram_st_sst.mem' start='0x4000' end='0x8000' /><slave name='ram_diag_bg.mem' start='0x8000' end='0x10000' /><slave name='ram_diag_data_buffer_terminal.mem' start='0x10000' end='0x20000' /><slave name='onchip_memory2_0.s1' start='0x20000' end='0x40000' /><slave name='ram_bf_weights.mem' start='0x40000' end='0x80000' /><slave name='ram_ss_ss_wide.mem' start='0x80000' end='0xC0000' /><slave name='reg_tr_10GbE.mem' start='0xC0000' end='0xC8000' /><slave name='ram_ss_ss_wide_transp.mem' start='0xC8000' end='0xD0000' /><slave name='reg_tr_xaui.mem' start='0xD0000' end='0xD2000' /><slave name='avs_eth_0.mms_ram' start='0xD2000' end='0xD3000' /><slave name='ram_diag_data_buffer_output.mem' start='0xD3000' end='0xD4000' /><slave name='ram_fringe_stop_offset.mem' start='0xD4000' end='0xD5000' /><slave name='ram_fringe_stop_step.mem' start='0xD5000' end='0xD6000' /></address-map>]]></parameter>
+  <parameter name="dataSlaveMapParam"><![CDATA[<address-map><slave name='pio_system_info.mem' start='0x0' end='0x80' /><slave name='reg_diag_data_buffer_terminal.mem' start='0x80' end='0x100' /><slave name='reg_diagnostics_mesh.mem' start='0x100' end='0x200' /><slave name='ram_dp_ram_from_mm.mem' start='0x200' end='0x300' /><slave name='reg_bsn_monitor_output.mem' start='0x300' end='0x400' /><slave name='reg_dp_offload_tx_hdr_dat.mem' start='0x400' end='0x480' /><slave name='reg_diag_data_buffer_output.mem' start='0x480' end='0x500' /><slave name='reg_tr_nonbonded_mesh.mem' start='0x500' end='0x540' /><slave name='reg_bsn_monitor.mem' start='0x540' end='0x580' /><slave name='reg_st_sst.mem' start='0x580' end='0x5C0' /><slave name='avs_eth_0.mms_reg' start='0x5C0' end='0x600' /><slave name='reg_io_ddr.mem' start='0x600' end='0x640' /><slave name='timer_0.s1' start='0x640' end='0x660' /><slave name='reg_unb_sens.mem' start='0x660' end='0x680' /><slave name='reg_diag_bg.mem' start='0x680' end='0x6A0' /><slave name='reg_dp_ram_from_mm.mem' start='0x6A0' end='0x6C0' /><slave name='reg_dp_split.mem' start='0x6C0' end='0x6E0' /><slave name='reg_dp_pkt_merge.mem' start='0x6E0' end='0x700' /><slave name='reg_mdio_0.mem' start='0x700' end='0x720' /><slave name='reg_mdio_1.mem' start='0x720' end='0x740' /><slave name='reg_mdio_2.mem' start='0x740' end='0x760' /><slave name='reg_diag_bg_output.mem' start='0x760' end='0x780' /><slave name='altpll_0.pll_slave' start='0x780' end='0x790' /><slave name='pio_debug_wave.s1' start='0x790' end='0x7A0' /><slave name='pio_wdi.s1' start='0x7A0' end='0x7B0' /><slave name='reg_dp_sync_checker.mem' start='0x7B0' end='0x7C0' /><slave name='jtag_uart_0.avalon_jtag_slave' start='0x7C0' end='0x7C8' /><slave name='reg_dp_offload_tx.mem' start='0x7C8' end='0x7D0' /><slave name='pio_pps.mem' start='0x7D0' end='0x7D8' /><slave name='reg_dp_xonoff_output.mem' start='0x7D8' end='0x7E0' /><slave name='reg_dp_switch.mem' start='0x7E0' end='0x7E8' /><slave name='reg_dp_fifo_monitor.mem' start='0x800' end='0x820' /><slave name='rom_system_info.mem' start='0x1000' end='0x2000' /><slave name='avs_eth_0.mms_tse' start='0x2000' end='0x3000' /><slave name='reg_wdi.mem' start='0x3000' end='0x3008' /><slave name='cpu_0.jtag_debug_module' start='0x3800' end='0x4000' /><slave name='ram_st_sst.mem' start='0x4000' end='0x8000' /><slave name='ram_diag_bg.mem' start='0x8000' end='0x10000' /><slave name='ram_diag_data_buffer_terminal.mem' start='0x10000' end='0x20000' /><slave name='onchip_memory2_0.s1' start='0x20000' end='0x40000' /><slave name='ram_bf_weights.mem' start='0x40000' end='0x80000' /><slave name='ram_ss_ss_wide.mem' start='0x80000' end='0xC0000' /><slave name='reg_tr_10GbE.mem' start='0xC0000' end='0xC8000' /><slave name='ram_ss_ss_wide_transp.mem' start='0xC8000' end='0xD0000' /><slave name='reg_tr_xaui.mem' start='0xD0000' end='0xD2000' /><slave name='avs_eth_0.mms_ram' start='0xD2000' end='0xD3000' /><slave name='ram_diag_data_buffer_output.mem' start='0xD3000' end='0xD4000' /><slave name='ram_fringe_stop_offset.mem' start='0xD4000' end='0xD5000' /><slave name='ram_fringe_stop_step.mem' start='0xD5000' end='0xD6000' /></address-map>]]></parameter>
   <parameter name="dataAddrWidth" value="20" />
   <parameter name="customInstSlavesSystemInfo" value="&lt;info/&gt;" />
   <parameter name="cpuReset" value="false" />
@@ -1506,6 +1522,15 @@ q]]></parameter>
   <parameter name="g_dat_w" value="32" />
   <parameter name="AUTO_SYSTEM_CLOCK_RATE" value="50000000" />
  </module>
+ <module
+   kind="avs_common_mm"
+   version="1.0"
+   enabled="1"
+   name="reg_dp_fifo_monitor">
+  <parameter name="g_adr_w" value="3" />
+  <parameter name="g_dat_w" value="32" />
+  <parameter name="AUTO_SYSTEM_CLOCK_RATE" value="50000000" />
+ </module>
  <connection
    kind="avalon"
    version="11.1"
@@ -2125,4 +2150,17 @@ q]]></parameter>
   <parameter name="arbitrationPriority" value="1" />
   <parameter name="baseAddress" value="0x000d5000" />
  </connection>
+ <connection
+   kind="clock"
+   version="11.1"
+   start="altpll_0.c0"
+   end="reg_dp_fifo_monitor.system" />
+ <connection
+   kind="avalon"
+   version="11.1"
+   start="cpu_0.data_master"
+   end="reg_dp_fifo_monitor.mem">
+  <parameter name="arbitrationPriority" value="1" />
+  <parameter name="baseAddress" value="0x0800" />
+ </connection>
 </system>
diff --git a/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/apertif_unb1_fn_beamformer.vhd b/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/apertif_unb1_fn_beamformer.vhd
index fb2316ba0f..5a56d391bc 100644
--- a/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/apertif_unb1_fn_beamformer.vhd
+++ b/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/apertif_unb1_fn_beamformer.vhd
@@ -18,7 +18,7 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 --
 -------------------------------------------------------------------------------
-LIBRARY IEEE, common_lib, unb1_board_lib, dp_lib, technology_lib, io_ddr_lib, eth_lib, tech_tse_lib, bf_lib, tech_ddr_lib, tr_10GbE_lib, reorder_lib, diag_lib;
+LIBRARY IEEE, common_lib, unb1_board_lib, dp_lib, technology_lib, io_ddr_lib, eth_lib, tech_tse_lib, bf_lib, tech_ddr_lib, tr_10GbE_lib, tech_mac_10g_lib, reorder_lib, diag_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE common_lib.common_pkg.ALL;
@@ -39,6 +39,7 @@ USE reorder_lib.reorder_pkg.ALL;
 USE bf_lib.bf_pkg.ALL;      
 USE diag_lib.diag_pkg.ALL;
 USE work.apertif_unb1_fn_beamformer_pkg.ALL;
+USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL;
 
 ENTITY apertif_unb1_fn_beamformer IS
   GENERIC (
@@ -164,6 +165,8 @@ ARCHITECTURE str OF apertif_unb1_fn_beamformer IS
   -- Interface: 10GbE
   CONSTANT c_nof_10GbE_offload_streams : NATURAL := 1;
   CONSTANT c_pkt_len                   : NATURAL := 176; -- Let tr_10GbE FIFO buffer one full packet before releasing it
+  CONSTANT c_nof_pkt_hdr_words         : NATURAL := 7;
+  CONSTANT c_tr_10GbE_pkt_len          : NATURAL := c_pkt_len + c_nof_pkt_hdr_words; -- 176+7=183
 
   SIGNAL xaui_tx_arr                   : t_xaui_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0);
   SIGNAL xaui_rx_arr                   : t_xaui_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0);
@@ -179,7 +182,10 @@ ARCHITECTURE str OF apertif_unb1_fn_beamformer IS
 
   SIGNAL dp_xonoff_src_out_arr         : t_dp_sosi_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); 
   SIGNAL dp_xonoff_src_in_arr          : t_dp_siso_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); 
-  
+
+  SIGNAL tr_10GbE_snk_in_arr           : t_dp_sosi_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); 
+  SIGNAL tr_10GbE_snk_out_arr          : t_dp_siso_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); 
+
   ---------------------------------------------------- 
   -- Constants and signals for the reorder function -- 
   -------------------------------------------------- 
@@ -364,6 +370,15 @@ ARCHITECTURE str OF apertif_unb1_fn_beamformer IS
   SIGNAL reg_dp_switch_mosi              : t_mem_mosi := c_mem_mosi_rst;
   SIGNAL reg_dp_switch_miso              : t_mem_miso;   
 
+  -- FIFO monitor to control fill level (optical fiber delay compensation)
+  SIGNAL reg_dp_fifo_monitor_mosi        : t_mem_mosi := c_mem_mosi_rst;
+  SIGNAL reg_dp_fifo_monitor_miso        : t_mem_miso;    
+
+  SIGNAL dp_fifo_fill_rd_usedw_32b       : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+  SIGNAL dp_fifo_fill_rd_emp             : STD_LOGIC;
+  SIGNAL dp_fifo_fill_wr_full            : STD_LOGIC;
+  SIGNAL dp_fifo_fill_rd_fill_32b        : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+
 BEGIN
 
   -----------------------------------------------------------------------------
@@ -655,7 +670,7 @@ BEGIN
   
   bsn_in_sosi_arr(0) <= beamlets_offload_snk_in_arr(0);
   bsn_in_sosi_arr(1) <= dp_offload_tx_src_out_arr(0); 
-  bsn_in_sosi_arr(2) <= dp_xonoff_src_out_arr(0);
+  bsn_in_sosi_arr(2) <= tr_10GbE_snk_in_arr(0);
 
   -----------------------------------------------------------------------------
   -- Data buffer to monitor beamlet offload input
@@ -765,6 +780,62 @@ BEGIN
     src_out_arr  => dp_xonoff_src_out_arr
   );
 
+  -----------------------------------------------------------------------------
+  -- Optical fiber delay compensation using dp_fifo_fill
+  -- . Maximum fill level:
+  --   . RT6 (closest to correlator): 130m
+  --   . RTD (furthest away from correlator): 2274m
+  --   . Difference: 2274-130=2144m
+  --   . Speed of light through optical fiber = 200Mm/sec = 5ns/m
+  --   . We need to be able to buffer 2144m = 2144*5ns=10.72us
+  --   . Packet rate: 781250 packets/sec = 1 packet/1.28us
+  --   . We need to be able to buffer 10.72/1.28=8.375 packets -> 9 packets
+  -----------------------------------------------------------------------------
+  u_dp_fifo_fill : ENTITY dp_lib.dp_fifo_fill
+  GENERIC MAP (
+    g_data_w      => c_xgmii_data_w,
+    g_empty_w     => c_tech_mac_10g_empty_w,
+    g_use_bsn     => FALSE,
+    g_use_empty   => TRUE,
+    g_use_channel => FALSE,
+    g_use_error   => FALSE,
+    g_use_sync    => FALSE,
+    g_fifo_fill   => 9*c_tr_10GbE_pkt_len,
+    g_fifo_size   => 9*c_tr_10GbE_pkt_len
+  )
+  PORT MAP (
+    clk         => dp_clk,
+    rst         => dp_rst,
+    wr_ful      => dp_fifo_fill_wr_full,
+    rd_emp      => dp_fifo_fill_rd_emp,
+
+    rd_usedw_32b=> dp_fifo_fill_rd_usedw_32b,
+    rd_fill_32b => dp_fifo_fill_rd_fill_32b, 
+
+    snk_in      => dp_xonoff_src_out_arr(0),
+    snk_out     => dp_xonoff_src_in_arr(0),
+
+    src_out     => tr_10GbE_snk_in_arr(0),
+    src_in      => tr_10GbE_snk_out_arr(0)
+  );
+  
+  u_dp_fifo_monitor: ENTITY dp_lib.dp_fifo_monitor
+  PORT MAP (
+    mm_clk       => mm_clk,
+    mm_rst       => mm_rst,
+
+    dp_clk       => dp_clk,
+    dp_rst       => dp_rst,
+
+    reg_mosi     => reg_dp_fifo_monitor_mosi,
+    reg_miso     => reg_dp_fifo_monitor_miso,
+
+    rd_usedw_32b => dp_fifo_fill_rd_usedw_32b,
+    rd_emp       => dp_fifo_fill_rd_emp,       
+    wr_full      => dp_fifo_fill_wr_full,      
+    rd_fill_32b  => dp_fifo_fill_rd_fill_32b
+  );   
+
   -----------------------------------------------------------------------------
   -- Interface : 10GbE
   -----------------------------------------------------------------------------
@@ -786,9 +857,9 @@ BEGIN
     g_nof_macs        => c_nof_10GbE_offload_streams,
     g_use_mdio        => TRUE,  
     g_direction       => "TX_ONLY",
-    g_tx_fifo_fill    => c_pkt_len, 
-    g_tx_fifo_size    => 2*c_pkt_len,
-    g_rx_fifo_size    => 2*c_pkt_len
+    g_tx_fifo_fill    => c_tr_10GbE_pkt_len, 
+    g_tx_fifo_size    => 2*c_tr_10GbE_pkt_len,
+    g_rx_fifo_size    => 2*c_tr_10GbE_pkt_len
   )                      
   
   PORT MAP (  
@@ -812,8 +883,8 @@ BEGIN
     dp_rst            => dp_rst,
     dp_clk            => dp_clk,
 
-    snk_out_arr       => dp_xonoff_src_in_arr,
-    snk_in_arr        => dp_xonoff_src_out_arr,
+    snk_in_arr        => tr_10GbE_snk_in_arr,
+    snk_out_arr       => tr_10GbE_snk_out_arr,
 
     xaui_tx_arr       => xaui_tx_arr, 
     xaui_rx_arr       => xaui_rx_arr, 
@@ -1049,6 +1120,9 @@ BEGIN
     reg_dp_switch_mosi             => reg_dp_switch_mosi,
     reg_dp_switch_miso             => reg_dp_switch_miso,
 
+    reg_dp_fifo_monitor_mosi       => reg_dp_fifo_monitor_mosi,
+    reg_dp_fifo_monitor_miso       => reg_dp_fifo_monitor_miso,
+
     ram_fringe_stop_offset_mosi    => ram_fringe_stop_offset_mosi,
     ram_fringe_stop_offset_miso    => ram_fringe_stop_offset_miso,
     ram_fringe_stop_step_mosi      => ram_fringe_stop_step_mosi,  
diff --git a/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/mmm_apertif_unb1_fn_beamformer.vhd b/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/mmm_apertif_unb1_fn_beamformer.vhd
index ee865af09f..5f1aead398 100644
--- a/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/mmm_apertif_unb1_fn_beamformer.vhd
+++ b/applications/apertif/designs/apertif_unb1_fn_beamformer/src/vhdl/mmm_apertif_unb1_fn_beamformer.vhd
@@ -172,7 +172,11 @@ ENTITY mmm_apertif_unb1_fn_beamformer IS
     
     -- . dp_switch
     reg_dp_switch_mosi              : OUT t_mem_mosi := c_mem_mosi_rst;
-    reg_dp_switch_miso              : IN  t_mem_miso;             
+    reg_dp_switch_miso              : IN  t_mem_miso;  
+
+    -- . dp_fifo_monitor
+    reg_dp_fifo_monitor_mosi        : OUT t_mem_mosi := c_mem_mosi_rst;
+    reg_dp_fifo_monitor_miso        : IN  t_mem_miso;             
            
     -- . fringe stop       
     ram_fringe_stop_offset_mosi     : OUT t_mem_mosi := c_mem_mosi_rst;
@@ -224,6 +228,8 @@ ARCHITECTURE str OF mmm_apertif_unb1_fn_beamformer IS
   CONSTANT c_reg_dp_pkt_merge_nof_words          : NATURAL := 1;                                                                             
   CONSTANT c_reg_dp_pkt_merge_adr_w              : NATURAL := ceil_log2(c_eth_nof_udp_ports * pow2(ceil_log2(c_reg_dp_pkt_merge_nof_words)));
 
+  CONSTANT c_reg_dp_fifo_monitor_adr_w           : NATURAL := 3;
+
   -- 10GbE offload
   CONSTANT c_reg_dp_offload_tx_adr_w             : NATURAL := 1;
   CONSTANT c_reg_dp_offload_tx_hdr_dat_nof_words : NATURAL := field_nof_words(c_apertif_udp_offload_hdr_field_arr, c_word_w); -- = 26 32b words
@@ -388,6 +394,9 @@ BEGIN
                                                    
     u_mm_file_reg_dp_switch              : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_DP_SWITCH")
                                                       PORT MAP(mm_rst, i_mm_clk, reg_dp_switch_mosi, reg_dp_switch_miso );
+
+    u_mm_file_reg_dp_fifo_monitor        : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_DP_FIFO_MONITOR")
+                                                      PORT MAP(mm_rst, i_mm_clk, reg_dp_fifo_monitor_mosi, reg_dp_fifo_monitor_miso );
                                                       
     u_mm_file_ram_fringe_stop_offset     : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_FRINGE_STOP_OFFSET")
                                                       PORT MAP(mm_rst, i_mm_clk, ram_fringe_stop_offset_mosi, ram_fringe_stop_offset_miso );
@@ -576,6 +585,15 @@ BEGIN
       coe_reset_export_from_the_reg_dp_switch               => OPEN,
       coe_write_export_from_the_reg_dp_switch               => reg_dp_switch_mosi.wr,
       coe_writedata_export_from_the_reg_dp_switch           => reg_dp_switch_mosi.wrdata(c_word_w-1 DOWNTO 0),
+
+       -- the_reg_dp_fifo_monitor
+      coe_address_export_from_the_reg_dp_fifo_monitor         => reg_dp_fifo_monitor_mosi.address(c_reg_dp_fifo_monitor_adr_w-1 DOWNTO 0),
+      coe_clk_export_from_the_reg_dp_fifo_monitor             => OPEN,
+      coe_read_export_from_the_reg_dp_fifo_monitor            => reg_dp_fifo_monitor_mosi.rd,
+      coe_readdata_export_to_the_reg_dp_fifo_monitor          => reg_dp_fifo_monitor_miso.rddata(c_word_w-1 DOWNTO 0),
+      coe_reset_export_from_the_reg_dp_fifo_monitor           => OPEN,
+      coe_write_export_from_the_reg_dp_fifo_monitor           => reg_dp_fifo_monitor_mosi.wr,
+      coe_writedata_export_from_the_reg_dp_fifo_monitor       => reg_dp_fifo_monitor_mosi.wrdata(c_word_w-1 DOWNTO 0),
      
       -- the_pio_debug_wave
       out_port_from_the_pio_debug_wave                        => OPEN,
-- 
GitLab