From c65b282da5afc7f9d59f6a57c94368fc33909c6f Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Tue, 19 Jan 2021 14:49:08 +0100
Subject: [PATCH] Fixed: keep angle in SIN(), COS() within 2pi to avoid: Error:
 XLOCAL <= 0.0 after reduction in COS(X).

---
 libraries/base/diag/tb/vhdl/tb_diag_pkg.vhd | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libraries/base/diag/tb/vhdl/tb_diag_pkg.vhd b/libraries/base/diag/tb/vhdl/tb_diag_pkg.vhd
index 715f1aed94..47474faa29 100644
--- a/libraries/base/diag/tb/vhdl/tb_diag_pkg.vhd
+++ b/libraries/base/diag/tb/vhdl/tb_diag_pkg.vhd
@@ -561,8 +561,9 @@ PACKAGE BODY tb_diag_pkg IS
     CONSTANT c_omega : REAL := MATH_2_PI * c_sub / c_Nfft;
     CONSTANT c_lat   : REAL := 1.0 * c_omega;  -- the I and Q start when in_val='1', this introduces 1 dp_clk latency, so adjust phase of ref_I and ref_Q to compensate
     CONSTANT c_k     : REAL := REAL(in_cnt);
-    CONSTANT c_I     : REAL := SIN(c_k * c_omega + c_lat);  -- I = in phase reference
-    CONSTANT c_Q     : REAL := COS(c_k * c_omega + c_lat);  -- Q = quadrature reference
+    CONSTANT c_angle : REAL := (c_k * c_omega + c_lat) MOD MATH_2_PI;  -- keep angle in SIN(), COS() within 2pi to avoid "Error: XLOCAL <= 0.0 after reduction in COS(X)"
+    CONSTANT c_I     : REAL := SIN(c_angle);  -- I = in phase reference
+    CONSTANT c_Q     : REAL := COS(c_angle);  -- Q = quadrature reference
     CONSTANT c_dat   : REAL := REAL(TO_SINT(in_dat));
     CONSTANT c_phase : REAL := ARCTAN(accum_Q, accum_I + c_eps);
     CONSTANT c_ampl  : REAL := SQRT((ABS(accum_I))**2.0 + (ABS(accum_Q))**2.0) * 2.0 / c_Nsamples;
@@ -650,7 +651,8 @@ PACKAGE BODY tb_diag_pkg IS
     CONSTANT c_lat         : REAL := 1.0 * c_omega;  -- adjust phase of c_cw to compensate for measurement latency
     CONSTANT c_k           : REAL := REAL(in_cnt);
     CONSTANT c_dat         : REAL := REAL(TO_SINT(in_dat));
-    CONSTANT c_cw          : REAL := cw_ampl * SIN(c_k * c_omega + cw_phase + c_lat);
+    CONSTANT c_angle       : REAL := (c_k * c_omega + cw_phase + c_lat) MOD MATH_2_PI;  -- keep angle in SIN(), COS() within 2pi to avoid "Error: XLOCAL <= 0.0 after reduction in COS(X)"
+    CONSTANT c_cw          : REAL := cw_ampl * SIN(c_angle);
     CONSTANT c_noise       : REAL := c_cw - c_dat;
     CONSTANT c_noise_power : REAL := (ABS(c_noise))**2.0;
   BEGIN
-- 
GitLab