From 12c4b6707c037806b2cbcb80ce26fbe01c7f5615 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Thu, 27 Mar 2025 09:04:19 +0100
Subject: [PATCH] Correct c_offload_node_time_scaled value on HW by using real.

---
 .../libraries/sdp/src/vhdl/sdp_statistics_offload.vhd     | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
index cc3ad48a56..a46df0ac50 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
@@ -174,8 +174,12 @@ architecture str of sdp_statistics_offload is
   constant c_nof_streams               : natural := 1;
 
   -- Offload timing
-  constant c_offload_node_time_scaled : natural := (g_offload_node_time * 2**g_offload_scale_w) /
-                                                    g_ctrl_interval_size_min;
+  -- . use natural(real()) to avoid overflow due to intermediate natural result 600000 * 2**15 > 2*31
+  --   - natural: 600000 * 2**15 / 20000000 = -90 (from compile or sim load error message)
+  --   - real: 600000 * 2**15 / 20000000 = 983.04 --> 983
+  constant c_offload_node_time_scaled : natural := natural(real(g_offload_node_time) *
+                                                           real(2**g_offload_scale_w) /
+                                                           real(g_ctrl_interval_size_min));
   constant c_offload_packet_time_scaled : natural := (g_offload_packet_time * 2**g_offload_scale_w) /
                                                       g_ctrl_interval_size_min;
   constant c_offload_packet_time_max : natural := g_offload_packet_time *
-- 
GitLab