From ba49caa0c9129598ca046f45eaed1c75221e9472 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Mon, 28 Feb 2022 16:41:32 +0100
Subject: [PATCH] Revert to master version. Keep ctrl as it is already
 refelcting the current WG state.

---
 libraries/base/diag/tb/vhdl/tb_diag_wg.vhd    | 62 +++++++------
 .../base/diag/tb/vhdl/tb_diag_wg_wideband.vhd | 87 ++++++++-----------
 2 files changed, 64 insertions(+), 85 deletions(-)

diff --git a/libraries/base/diag/tb/vhdl/tb_diag_wg.vhd b/libraries/base/diag/tb/vhdl/tb_diag_wg.vhd
index 853ec384d6..520bf017d1 100644
--- a/libraries/base/diag/tb/vhdl/tb_diag_wg.vhd
+++ b/libraries/base/diag/tb/vhdl/tb_diag_wg.vhd
@@ -19,7 +19,7 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 --
 --------------------------------------------------------------------------------
- 
+
 LIBRARY IEEE, common_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
@@ -49,7 +49,7 @@ ARCHITECTURE tb OF tb_diag_wg IS
 
   CONSTANT c_clk_freq       : NATURAL := 200*10**6;  -- Hz
   CONSTANT c_clk_period     : TIME    := (10**9 / c_clk_freq) * 1 ns;
-  
+
   -- Default settings
   CONSTANT c_buf            : t_c_mem := (latency  => 1,
                                           adr_w    => g_buf_adr_w,
@@ -59,87 +59,86 @@ ARCHITECTURE tb OF tb_diag_wg IS
   CONSTANT c_buf_file       : STRING := sel_a_b(c_buf.adr_w=11 AND c_buf.dat_w=18, "data/diag_sin_2048x18.hex",
                                         sel_a_b(c_buf.adr_w=10 AND c_buf.dat_w=18, "data/diag_sin_1024x18.hex",
                                         sel_a_b(c_buf.adr_w=10 AND c_buf.dat_w= 8, "data/diag_sin_1024x8.hex", "UNUSED")));
-                                        
-                                        
+
+
   CONSTANT c_wg_nof_samples : NATURAL := c_buf.nof_dat;  -- must be <= c_buf.nof_dat
   CONSTANT c_wg_gain_w      : NATURAL := 1;   -- Normalized range [0 1>  maps to fixed point range [0:2**c_diag_wg_ampl_w>
                                               -- . use gain 2**0             = 1 to have fulle scale without clipping
                                               -- . use gain 2**g_calc_gain_w > 1 to cause clipping
-                                              
+
   CONSTANT c_buf_full_scale : NATURAL := 2**(g_buf_dat_w-1)-1;  -- The stored waveform range should also be [-c_buf_full_scale +c_buf_full_scale], so not including -c_buf_full_scale-1
   CONSTANT c_wg_full_scale  : NATURAL := 2**(g_wg_dat_w-1)-1;
   CONSTANT c_ampl_norm      : REAL := sel_a_b(g_wg_dat_w < g_buf_dat_w, REAL(c_wg_full_scale)/REAL(c_wg_full_scale+1), 1.0);
   --CONSTANT c_ampl_norm    : REAL := REAL(c_wg_full_scale)/REAL(c_wg_full_scale+1);     -- Use this if g_wg_dat_w < g_buf_dat_w, to avoid clipping
   --CONSTANT c_ampl_norm    : REAL := 1.0;                                               -- Use this if g_wg_dat_w = g_buf_dat_w, because the stored waveform range is already -+c_buf_full_scale
   --CONSTANT c_ampl_norm    : REAL := REAL(c_buf_full_scale)/REAL(c_buf_full_scale+1);   -- No need to use this, because the stored waveform range is already -+c_buf_full_scale
-  
+
   CONSTANT c_freq_unit      : REAL := c_diag_wg_freq_unit;              -- ^= c_clk_freq = Fs (sample frequency), assuming one sinus waveform in the buffer
   CONSTANT c_ampl_unit      : REAL := c_diag_wg_ampl_unit*c_ampl_norm;  -- ^= Full Scale range [-c_wg_full_scale +c_wg_full_scale] without clipping
   CONSTANT c_phase_unit     : REAL := c_diag_wg_phase_unit;             -- ^= 1 degree
-  
+
   SIGNAL tb_end         : STD_LOGIC;
   SIGNAL rst            : STD_LOGIC;
   SIGNAL clk            : STD_LOGIC := '1';
   SIGNAL restart        : STD_LOGIC;
-  
+
   SIGNAL buf_rddat      : STD_LOGIC_VECTOR(c_buf.dat_w-1 DOWNTO 0);
   SIGNAL buf_rdval      : STD_LOGIC;
   SIGNAL buf_addr       : STD_LOGIC_VECTOR(c_buf.adr_w-1 DOWNTO 0);
   SIGNAL buf_rden       : STD_LOGIC;
-  
+
   SIGNAL wg_ctrl        : t_diag_wg;
-  SIGNAL wg_ctrl_act    : t_diag_wg;
 
   SIGNAL wg_mode        : NATURAL;
   SIGNAL wg_freq        : NATURAL;
   SIGNAL wg_ampl        : NATURAL;
   SIGNAL wg_nof_samples : NATURAL;
   SIGNAL wg_phase       : NATURAL;
-    
+
   SIGNAL wg_ovr         : STD_LOGIC;
   SIGNAL wg_dat         : STD_LOGIC_VECTOR(c_buf.dat_w-1 DOWNTO 0);
   SIGNAL wg_val         : STD_LOGIC;
   SIGNAL wg_sync        : STD_LOGIC;
 
-  
+
 BEGIN
 
   rst <= '1', '0' AFTER c_clk_period/10;
   clk <= NOT clk OR tb_end AFTER c_clk_period/2;
-  
+
   wg_ctrl.mode        <= TO_UVEC(wg_mode,        c_diag_wg_mode_w);
   wg_ctrl.freq        <= TO_UVEC(wg_freq,        c_diag_wg_freq_w);
   wg_ctrl.ampl        <= TO_UVEC(wg_ampl,        c_diag_wg_ampl_w);
   wg_ctrl.nof_samples <= TO_UVEC(wg_nof_samples, c_diag_wg_nofsamples_w);
   wg_ctrl.phase       <= TO_UVEC(wg_phase,       c_diag_wg_phase_w);
-  
+
   p_mm : PROCESS
   BEGIN
     tb_end         <= '0';
     restart        <= '0';
     wg_mode        <= c_diag_wg_mode_off;
-    
+
     ---------------------------------------------------------------------------
     -- >>> Single, repeat mode
     wg_nof_samples <= c_wg_nof_samples;
-    
+
     -- >>> CALC mode
     -- Cosinus with frequency Fs/2 (note sinus Fs/2 yields DC = 0)
 --     wg_freq        <= INTEGER(0.5 * c_freq_unit);
 --     wg_phase       <= INTEGER(90.0 * c_phase_unit);
-    
+
     -- Choosing 1.0*Fs to select Fs which is equivalent to DC, hence the DC value is then determined by phase
-    -- this also applies to 2.0, 3.0, 4.0 etc 
+    -- this also applies to 2.0, 3.0, 4.0 etc
 --     wg_freq        <= INTEGER(1.0 * c_freq_unit);
 --     wg_phase       <= INTEGER(45.0 * c_phase_unit);
-    
+
     -- Sinus Fs/16
     wg_freq        <= INTEGER(0.0625 * c_freq_unit);
     --wg_freq        <= INTEGER(511.0/512.0 * c_freq_unit);
     --wg_freq        <= INTEGER(1.0/512.0 * c_freq_unit);
     --wg_freq        <= INTEGER(1.0);  -- minimum value, yields Fs/c_freq_unit Hz sinus
     wg_phase       <= INTEGER(0.0 * c_phase_unit);
-    
+
     -- Sinus Fs/17
 --     wg_freq        <= INTEGER(1.0/17.0 * c_freq_unit);
 --     wg_phase       <= INTEGER(0.0 * c_phase_unit);
@@ -147,13 +146,13 @@ BEGIN
     wg_ampl        <= INTEGER(1.0 * c_ampl_unit);                         -- yields amplitude of c_wg_full_scale
 --     wg_ampl        <= INTEGER(1.0/REAL(c_wg_full_scale) * c_ampl_unit);  -- yields amplitude of 1
 --     wg_ampl        <= INTEGER(3.0/REAL(c_wg_full_scale) * c_ampl_unit);  -- yields amplitude of 3
-    
+
     WAIT UNTIL rising_edge(clk);  -- align to rising edge
     WAIT FOR c_clk_period*200;
-    
+
     ---------------------------------------------------------------------------
     -- >>> Select the different modes
-    
+
     -- CALC mode
     wg_mode        <= c_diag_wg_mode_calc;
     restart        <= '1';
@@ -165,14 +164,14 @@ BEGIN
     restart        <= '0';
     WAIT FOR c_clk_period*3000;
     --WAIT FOR 1 sec;
-    
+
     -- OFF mode
     wg_mode        <= c_diag_wg_mode_off;
     restart        <= '1';
     WAIT FOR c_clk_period*1;
     restart        <= '0';
     WAIT FOR c_clk_period*200;
-    
+
     -- SINGLE mode
     wg_mode        <= c_diag_wg_mode_single;
     FOR I IN 0 TO 1 LOOP
@@ -182,7 +181,7 @@ BEGIN
       WAIT FOR c_clk_period*c_buf.nof_dat;
       WAIT FOR c_clk_period*300;
     END LOOP;
-    
+
     -- REPEAT mode
     wg_mode        <= c_diag_wg_mode_repeat;
     restart        <= '1';
@@ -195,19 +194,19 @@ BEGIN
     restart        <= '0';
     WAIT FOR c_clk_period*c_buf.nof_dat*5;
     WAIT FOR c_clk_period*200;
-    
+
     -- OFF mode
     wg_mode        <= c_diag_wg_mode_off;
     restart        <= '1';
     WAIT FOR c_clk_period*1;
     restart        <= '0';
     WAIT FOR c_clk_period*200;
-    
+
     WAIT FOR c_clk_period*100;
     tb_end <= '1';
     WAIT;
   END PROCESS;
-  
+
   -- Waveform buffer
   u_buf : ENTITY common_lib.common_ram_crw_crw
   GENERIC MAP (
@@ -232,7 +231,7 @@ BEGIN
     rd_val_a  => OPEN,
     rd_val_b  => buf_rdval
   );
-  
+
   -- Waveform generator
   u_wg : ENTITY work.diag_wg
   GENERIC MAP (
@@ -253,13 +252,12 @@ BEGIN
     buf_rden       => buf_rden,
 
     ctrl           => wg_ctrl,
-    ctrl_act       => wg_ctrl_act,
 
     out_ovr        => wg_ovr,
     out_dat        => wg_dat,
     out_val        => wg_val,
     out_sync       => wg_sync
   );
-    
+
 END tb;
 
diff --git a/libraries/base/diag/tb/vhdl/tb_diag_wg_wideband.vhd b/libraries/base/diag/tb/vhdl/tb_diag_wg_wideband.vhd
index 65b32019f7..5c61df8091 100644
--- a/libraries/base/diag/tb/vhdl/tb_diag_wg_wideband.vhd
+++ b/libraries/base/diag/tb/vhdl/tb_diag_wg_wideband.vhd
@@ -19,7 +19,7 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 --
 --------------------------------------------------------------------------------
- 
+
 LIBRARY IEEE, common_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
@@ -52,50 +52,49 @@ ARCHITECTURE tb OF tb_diag_wg_wideband IS
 
   CONSTANT c_clk_freq       : NATURAL := 200;  -- MHz
   CONSTANT c_clk_period     : TIME    := (10**6 / c_clk_freq) * 1 ps;
-  
+
   -- Default WG settings
   CONSTANT c_buf_nof_dat    : NATURAL := 2**g_buf_addr_w;
-  
+
   CONSTANT c_wg_gain_w      : NATURAL := 1;   -- Normalized range [0 1>  maps to fixed point range [0:2**c_diag_wg_ampl_w>
                                               -- . use gain 2**0             = 1 to have fulle scale without clipping
                                               -- . use gain 2**g_calc_gain_w > 1 to cause clipping
-                                              
+
   CONSTANT c_buf_full_scale : NATURAL := 2**(g_buf_dat_w-1)-1;  -- The stored waveform range should also be [-c_buf_full_scale +c_buf_full_scale], so not including -c_buf_full_scale-1
   CONSTANT c_wg_full_scale  : NATURAL := 2**(g_wg_dat_w-1)-1;
   CONSTANT c_ampl_norm      : REAL := sel_a_b(g_wg_dat_w < g_buf_dat_w, REAL(c_wg_full_scale)/REAL(c_wg_full_scale+1), 1.0);
   --CONSTANT c_ampl_norm    : REAL := REAL(c_wg_full_scale)/REAL(c_wg_full_scale+1);     -- Use this if g_wg_dat_w < g_buf_dat_w, to avoid clipping
   --CONSTANT c_ampl_norm    : REAL := 1.0;                                               -- Use this if g_wg_dat_w = g_buf_dat_w, because the stored waveform range is already -+c_buf_full_scale
   --CONSTANT c_ampl_norm    : REAL := REAL(c_buf_full_scale)/REAL(c_buf_full_scale+1);   -- No need to use this, because the stored waveform range is already -+c_buf_full_scale
-  
+
   CONSTANT c_freq_unit      : REAL := c_diag_wg_freq_unit;              -- ^= c_clk_freq = Fs (sample frequency), assuming one sinus waveform in the buffer
   CONSTANT c_ampl_unit      : REAL := c_diag_wg_ampl_unit*c_ampl_norm;  -- ^= Full Scale range [-c_wg_full_scale +c_wg_full_scale] without clipping
   CONSTANT c_phase_unit     : REAL := c_diag_wg_phase_unit;             -- ^= 1 degree
-  
+
   -- Wideband WG settings
   CONSTANT c_sample_period   : TIME    := (10**6 / (c_clk_freq*g_wideband_factor)) * 1 ps;
-  
+
   TYPE t_buf_dat_arr IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(g_buf_dat_w-1 DOWNTO 0);
-                                         
+
   SIGNAL tb_end         : STD_LOGIC;
   SIGNAL rst            : STD_LOGIC;
   SIGNAL clk            : STD_LOGIC := '1';
   SIGNAL restart        : STD_LOGIC;
-  
+
   SIGNAL wg_ctrl        : t_diag_wg;
-  SIGNAL wg_ctrl_act    : t_diag_wg;
 
   SIGNAL wg_mode        : NATURAL;
   SIGNAL wg_freq        : NATURAL;
   SIGNAL wg_ampl        : NATURAL;
   SIGNAL wg_nof_samples : NATURAL;
   SIGNAL wg_phase       : NATURAL;
-    
+
   -- Wideband WG output is big endian, so first output sample in MSBit, MSData
   SIGNAL out_ovr        : STD_LOGIC_VECTOR(g_wideband_factor            -1 DOWNTO 0);
   SIGNAL out_dat        : STD_LOGIC_VECTOR(g_wideband_factor*g_buf_dat_w-1 DOWNTO 0);
   SIGNAL out_val        : STD_LOGIC_VECTOR(g_wideband_factor            -1 DOWNTO 0);
   SIGNAL out_sync       : STD_LOGIC_VECTOR(g_wideband_factor            -1 DOWNTO 0);
-  
+
   SIGNAL wg_ovr         : STD_LOGIC_VECTOR(0 TO g_wideband_factor-1);
   SIGNAL wg_dat         : t_buf_dat_arr(0 TO g_wideband_factor-1);
   SIGNAL wg_val         : STD_LOGIC_VECTOR(0 TO g_wideband_factor-1);
@@ -107,47 +106,47 @@ ARCHITECTURE tb OF tb_diag_wg_wideband IS
   SIGNAL sample_dat     : STD_LOGIC_VECTOR(g_buf_dat_w-1 DOWNTO 0);
   SIGNAL sample_val     : STD_LOGIC;
   SIGNAL sample_sync    : STD_LOGIC;
-    
+
 BEGIN
 
   rst <= '1', '0' AFTER c_clk_period/10;
   clk <= NOT clk OR tb_end AFTER c_clk_period/2;
-  
+
   sample_clk <= NOT sample_clk OR tb_end AFTER c_sample_period/2;
-  
+
   wg_ctrl.mode        <= TO_UVEC(wg_mode,        c_diag_wg_mode_w);
   wg_ctrl.freq        <= TO_UVEC(wg_freq,        c_diag_wg_freq_w);
   wg_ctrl.ampl        <= TO_UVEC(wg_ampl,        c_diag_wg_ampl_w);
   wg_ctrl.nof_samples <= TO_UVEC(wg_nof_samples, c_diag_wg_nofsamples_w);
   wg_ctrl.phase       <= TO_UVEC(wg_phase,       c_diag_wg_phase_w);
-  
+
   p_mm : PROCESS
   BEGIN
     tb_end         <= '0';
     restart        <= '0';
     wg_mode        <= c_diag_wg_mode_off;
-    
+
     ---------------------------------------------------------------------------
     -- >>> Single, repeat mode
     wg_nof_samples <= c_buf_nof_dat;  -- must be <= c_buf_nof_dat
-    
+
     -- >>> CALC mode
     -- Cosinus with frequency Fs/2 (note sinus Fs/2 yields DC = 0)
 --     wg_freq        <= INTEGER(0.5 * c_freq_unit);
 --     wg_phase       <= INTEGER(90.0 * c_phase_unit);
-    
+
     -- Choosing 1.0*Fs to select Fs which is equivalent to DC, hence the DC value is then determined by phase
-    -- this also applies to 2.0, 3.0, 4.0 etc 
+    -- this also applies to 2.0, 3.0, 4.0 etc
 --     wg_freq        <= INTEGER(1.0 * c_freq_unit);
 --     wg_phase       <= INTEGER(45.0 * c_phase_unit);
-    
+
     -- Sinus Fs/16
     wg_freq        <= INTEGER(0.0625 * c_freq_unit);
     --wg_freq        <= INTEGER(511.0/512.0 * c_freq_unit);
     wg_freq        <= INTEGER(1.0/512.0 * c_freq_unit);
     --wg_freq        <= INTEGER(1.0);  -- minimum value, yields Fs/c_freq_unit Hz sinus
     wg_phase       <= INTEGER(0.0 * c_phase_unit);
-    
+
     -- Sinus Fs/17
 --     wg_freq        <= INTEGER(1.0/17.0 * c_freq_unit);
 --     wg_phase       <= INTEGER(0.0 * c_phase_unit);
@@ -155,30 +154,18 @@ BEGIN
     wg_ampl        <= INTEGER(1.0 * c_ampl_unit);                         -- yields amplitude of c_wg_full_scale
 --     wg_ampl        <= INTEGER(1.0/REAL(c_wg_full_scale) * c_ampl_unit);  -- yields amplitude of 1
 --     wg_ampl        <= INTEGER(3.0/REAL(c_wg_full_scale) * c_ampl_unit);  -- yields amplitude of 3
-    
-    WAIT FOR c_clk_period*10;
 
     WAIT UNTIL rising_edge(clk);  -- align to rising edge
     WAIT FOR c_clk_period*200;
-    
+
     ---------------------------------------------------------------------------
     -- >>> Select the different modes
-    
+
     -- CALC mode
     wg_mode        <= c_diag_wg_mode_calc;
-
-    -- Verify that wg_ctrl_act does not change without restart
-    WAIT FOR c_clk_period*3;
-    ASSERT TO_UINT(wg_ctrl_act.mode) = c_diag_wg_mode_off REPORT "Wrong wg_ctrl_act mode before restart" SEVERITY ERROR;
-
     restart        <= '1';
     WAIT FOR c_clk_period*1;
     restart        <= '0';
-
-    -- Verify that wg_ctrl_act updated after restart
-    WAIT FOR c_clk_period*3;
-    ASSERT TO_UINT(wg_ctrl_act.mode) = c_diag_wg_mode_calc REPORT "Wrong wg_ctrl_act mode after restart" SEVERITY ERROR;
-
     WAIT FOR c_clk_period*3000;
     restart        <= '1';
     WAIT FOR c_clk_period*1;
@@ -188,11 +175,6 @@ BEGIN
 
     -- OFF mode
     wg_mode        <= c_diag_wg_mode_off;
-
-    -- Verify that wg_ctrl_act updated after WG off
-    WAIT FOR c_clk_period*3;
-    ASSERT TO_UINT(wg_ctrl_act.mode) = c_diag_wg_mode_off REPORT "Wrong wg_ctrl_act mode after WG off" SEVERITY ERROR;
-
     restart        <= '1';
     WAIT FOR c_clk_period*1;
     restart        <= '0';
@@ -207,7 +189,7 @@ BEGIN
       WAIT FOR c_clk_period*c_buf_nof_dat;
       WAIT FOR c_clk_period*300;
     END LOOP;
-    
+
     -- REPEAT mode
     wg_mode        <= c_diag_wg_mode_repeat;
     restart        <= '1';
@@ -220,20 +202,20 @@ BEGIN
     restart        <= '0';
     WAIT FOR c_clk_period*c_buf_nof_dat*5;
     WAIT FOR c_clk_period*200;
-    
+
     -- OFF mode
     wg_mode        <= c_diag_wg_mode_off;
     restart        <= '1';
     WAIT FOR c_clk_period*1;
     restart        <= '0';
     WAIT FOR c_clk_period*200;
-    
+
     WAIT FOR c_clk_period*100;
     tb_end         <= '1';
     WAIT;
   END PROCESS;
-  
-  
+
+
   u_wideband_wg : ENTITY work.diag_wg_wideband
   GENERIC MAP (
     -- Wideband parameters
@@ -249,7 +231,7 @@ BEGIN
     -- Memory-mapped clock domain
     mm_rst               => '0',
     mm_clk               => '0',
-    
+
     mm_wrdata            => (OTHERS=>'0'),
     mm_address           => (OTHERS=>'0'),
     mm_wr                => '0',
@@ -261,16 +243,15 @@ BEGIN
     st_rst               => rst,
     st_clk               => clk,
     st_restart           => restart,
-    
+
     st_ctrl              => wg_ctrl,
-    st_ctrl_act          => wg_ctrl_act,
 
     out_ovr              => out_ovr,
     out_dat              => out_dat,
     out_val              => out_val,
     out_sync             => out_sync
   );
-  
+
   -- Map wideband WG out_* slv to wg_* arrays to ease interpretation in wave window
   gen_wires : FOR I IN 0 TO g_wideband_factor-1 GENERATE
     wg_ovr(I)  <= out_ovr(                                            g_wideband_factor-I-1);
@@ -278,8 +259,8 @@ BEGIN
     wg_val(I)  <= out_val(                                            g_wideband_factor-I-1);
     wg_sync(I) <= out_sync(                                           g_wideband_factor-I-1);
   END GENERATE;
-  
-  -- View WG output at the sample rate  
+
+  -- View WG output at the sample rate
   p_sample : PROCESS(sample_clk)
   BEGIN
     IF rising_edge(sample_clk) THEN
@@ -294,6 +275,6 @@ BEGIN
       sample_sync <= wg_sync(sample_cnt);
     END IF;
   END PROCESS;
-  
+
 END tb;
 
-- 
GitLab