From 2f89ae19092fc38e24cbe1e1ffc561b5400cb743 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Fri, 28 Jan 2022 14:17:47 +0100
Subject: [PATCH] Pass on g_data_signed, to support preserving sign extension
 at FIFO output.

---
 .../libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd | 1 +
 libraries/base/dp/src/vhdl/dp_fifo_dc.vhd                    | 2 ++
 libraries/base/dp/src/vhdl/dp_fifo_dc_arr.vhd                | 2 ++
 libraries/base/dp/src/vhdl/dp_fifo_fill_core.vhd             | 5 ++++-
 libraries/base/dp/src/vhdl/dp_fifo_fill_dc.vhd               | 4 +++-
 libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd              | 4 +++-
 libraries/base/dp/src/vhdl/dp_fifo_fill_sc.vhd               | 4 +++-
 libraries/base/dp/src/vhdl/dp_fifo_sc.vhd                    | 2 ++
 8 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
index 7be0497290..54d4befcf2 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
@@ -482,6 +482,7 @@ BEGIN
     GENERIC MAP (
       g_nof_streams    => c_sdp_S_pn,
       g_data_w         => c_sdp_W_adc,
+      g_data_signed    => TRUE,
       g_bsn_w          => c_bs_bsn_w,
       g_use_empty      => FALSE,
       g_use_ctrl       => TRUE,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_dc.vhd b/libraries/base/dp/src/vhdl/dp_fifo_dc.vhd
index d36166ae61..f5638052d7 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_dc.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_dc.vhd
@@ -33,6 +33,7 @@ ENTITY dp_fifo_dc IS
   GENERIC (
     g_technology     : NATURAL := c_tech_select_default;
     g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -76,6 +77,7 @@ BEGIN
     g_technology     => g_technology,
     g_use_dual_clock => TRUE,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_dc_arr.vhd b/libraries/base/dp/src/vhdl/dp_fifo_dc_arr.vhd
index e788c2b579..45d65e14cd 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_dc_arr.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_dc_arr.vhd
@@ -36,6 +36,7 @@ ENTITY dp_fifo_dc_arr IS
     g_technology     : NATURAL := c_tech_select_default;
     g_nof_streams    : NATURAL := 1;
     g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -84,6 +85,7 @@ BEGIN
     g_nof_streams    => g_nof_streams,
     g_use_dual_clock => TRUE,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_core.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_core.vhd
index 655faa6c83..ef89bbe422 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_fill_core.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_core.vhd
@@ -67,7 +67,8 @@ ENTITY dp_fifo_fill_core IS
   GENERIC (
     g_technology     : NATURAL := c_tech_select_default;
     g_use_dual_clock : BOOLEAN := FALSE;
-    g_data_w         : NATURAL := 16;
+    g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -161,6 +162,7 @@ BEGIN
     GENERIC MAP (
       g_technology     => g_technology,
       g_data_w         => g_data_w,
+      g_data_signed    => g_data_signed,
       g_bsn_w          => g_bsn_w,
       g_empty_w        => g_empty_w,
       g_channel_w      => g_channel_w,
@@ -199,6 +201,7 @@ BEGIN
     GENERIC MAP (
       g_technology     => g_technology,
       g_data_w         => g_data_w,
+      g_data_signed    => g_data_signed,
       g_bsn_w          => g_bsn_w,
       g_empty_w        => g_empty_w,
       g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_dc.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_dc.vhd
index 4939abf2ce..53f57dc77f 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_fill_dc.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_dc.vhd
@@ -33,7 +33,8 @@ USE technology_lib.technology_select_pkg.ALL;
 ENTITY dp_fifo_fill_dc IS
   GENERIC (
     g_technology     : NATURAL := c_tech_select_default;
-    g_data_w         : NATURAL := 16;
+    g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -81,6 +82,7 @@ BEGIN
     g_technology     => g_technology,
     g_use_dual_clock => TRUE,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd
index cd8c20ec66..b38116a290 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd
@@ -46,7 +46,8 @@ ENTITY dp_fifo_fill_eop IS
     g_technology     : NATURAL := c_tech_select_default;
     g_note_is_ful    : BOOLEAN := TRUE;
     g_use_dual_clock : BOOLEAN := FALSE;
-    g_data_w         : NATURAL := 16;
+    g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -151,6 +152,7 @@ BEGIN
     g_note_is_ful    => g_note_is_ful,
     g_use_dual_clock => g_use_dual_clock,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_sc.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_sc.vhd
index 86d1151bd3..6c677dc7e3 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_fill_sc.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_sc.vhd
@@ -33,7 +33,8 @@ USE technology_lib.technology_select_pkg.ALL;
 ENTITY dp_fifo_fill_sc IS
   GENERIC (
     g_technology     : NATURAL := c_tech_select_default;
-    g_data_w         : NATURAL := 16;
+    g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -81,6 +82,7 @@ BEGIN
     g_technology     => g_technology,
     g_use_dual_clock => FALSE,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
diff --git a/libraries/base/dp/src/vhdl/dp_fifo_sc.vhd b/libraries/base/dp/src/vhdl/dp_fifo_sc.vhd
index a504b5ba0a..6421ae0d6a 100644
--- a/libraries/base/dp/src/vhdl/dp_fifo_sc.vhd
+++ b/libraries/base/dp/src/vhdl/dp_fifo_sc.vhd
@@ -35,6 +35,7 @@ ENTITY dp_fifo_sc IS
     g_note_is_ful    : BOOLEAN := TRUE;   -- when TRUE report NOTE when FIFO goes full, fifo overflow is always reported as FAILURE
     g_use_lut        : BOOLEAN := FALSE;  -- when TRUE then force using LUTs instead of block RAM
     g_data_w         : NATURAL := 16; -- Should be 2 times the c_complex_w if g_use_complex = TRUE
+    g_data_signed    : BOOLEAN := FALSE; -- TRUE extends g_data_w bits with the sign bit, FALSE pads g_data_w bits with zeros.
     g_bsn_w          : NATURAL := 1;
     g_empty_w        : NATURAL := 1;
     g_channel_w      : NATURAL := 1;
@@ -77,6 +78,7 @@ BEGIN
     g_use_dual_clock => FALSE,
     g_use_lut_sc     => g_use_lut,
     g_data_w         => g_data_w,
+    g_data_signed    => g_data_signed,
     g_bsn_w          => g_bsn_w,
     g_empty_w        => g_empty_w,
     g_channel_w      => g_channel_w,
-- 
GitLab