From b2b80701191947f716964f3b1d15753b6feb1003 Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Wed, 2 Nov 2016 12:25:58 +0000
Subject: [PATCH] Made tb_aduh_mean_sum and tb_aduh_power_sum self checking and
 added them to the ADUH regression test.

---
 libraries/io/aduh/hdllib.cfg                  |  2 +
 .../io/aduh/tb/vhdl/tb_aduh_mean_sum.vhd      | 58 ++++++++++++-----
 .../io/aduh/tb/vhdl/tb_aduh_power_sum.vhd     | 64 +++++++++++++------
 3 files changed, 86 insertions(+), 38 deletions(-)

diff --git a/libraries/io/aduh/hdllib.cfg b/libraries/io/aduh/hdllib.cfg
index 5ae338934a..281df2877a 100644
--- a/libraries/io/aduh/hdllib.cfg
+++ b/libraries/io/aduh/hdllib.cfg
@@ -39,6 +39,8 @@ test_bench_files =
 
 regression_test_vhdl = 
     tb/vhdl/tb_aduh_dd.vhd
+    tb/vhdl/tb_aduh_mean_sum.vhd
+    tb/vhdl/tb_aduh_power_sum.vhd
     tb/vhdl/tb_aduh_verify.vhd
     tb/vhdl/tb_mms_aduh_quad.vhd
     tb/vhdl/tb_tb_lvdsh_dd_phs4.vhd
diff --git a/libraries/io/aduh/tb/vhdl/tb_aduh_mean_sum.vhd b/libraries/io/aduh/tb/vhdl/tb_aduh_mean_sum.vhd
index 05d7c8765c..a8befa59a8 100644
--- a/libraries/io/aduh/tb/vhdl/tb_aduh_mean_sum.vhd
+++ b/libraries/io/aduh/tb/vhdl/tb_aduh_mean_sum.vhd
@@ -34,7 +34,7 @@ USE dp_lib.tb_dp_pkg.ALL;
 -- > as 10
 -- > run 1 us
 -- observe in_sosi, sum and sum_sync in wave window
--- expected sum after sum_sync are: 0, 120, 376, ...
+-- expected sum at sum_sync are: 0, 120, 376, ...
 -- . sum([ 0:15]) = 120
 -- . sum([16:31]) = 376
 -- . sum([32:47]) = 632
@@ -42,7 +42,8 @@ USE dp_lib.tb_dp_pkg.ALL;
 
 ENTITY tb_aduh_mean_sum IS
   GENERIC (
-    g_random_control : BOOLEAN := TRUE  -- use TRUE for random stream flow control, use FALSE for initial debugging
+    g_nof_symbols_per_data  : NATURAL := 1;    -- choose 1 or 4, nof symbols (= ADC samples) per data word
+    g_random_control        : BOOLEAN := TRUE  -- use TRUE for random stream flow control, use FALSE for initial debugging
   );
 END tb_aduh_mean_sum;
 
@@ -53,20 +54,22 @@ ARCHITECTURE tb OF tb_aduh_mean_sum IS
   
   CONSTANT c_rl                    : NATURAL := 1;
   CONSTANT c_symbol_w              : NATURAL := 8;
-  CONSTANT c_nof_symbols_per_data  : NATURAL := 4;
-  CONSTANT c_nof_symbols_per_block : NATURAL := 8;         -- nof symbols (= ADC samples) per block
   
   CONSTANT c_sum_truncate          : BOOLEAN := TRUE;
   CONSTANT c_sum_w                 : NATURAL := c_word_w;   -- = 32
   
-  CONSTANT c_data_w                : NATURAL := c_nof_symbols_per_data*c_symbol_w;
+  CONSTANT c_data_w                : NATURAL := g_nof_symbols_per_data*c_symbol_w;
   
   CONSTANT c_nof_sync              : NATURAL := 10;
   CONSTANT c_nof_block_per_sync    : NATURAL := 2;
+  CONSTANT c_nof_symbols_per_block : NATURAL := 8;    -- nof symbols (= ADC samples) per block
   CONSTANT c_nof_symbols_per_sync  : NATURAL := c_nof_block_per_sync * c_nof_symbols_per_block;
   
   CONSTANT c_nof_accumulations     : NATURAL := c_nof_symbols_per_sync;  -- integration time in symbols
   
+  CONSTANT c_exp_sum_arr           : t_natural_arr(0 TO 3) := (0, 120, 376, 632);
+  
+  SIGNAL tb_almost_end   : STD_LOGIC := '0';
   SIGNAL tb_end          : STD_LOGIC := '0';
   SIGNAL rst             : STD_LOGIC;
   SIGNAL clk             : STD_LOGIC := '1';
@@ -75,7 +78,6 @@ ARCHITECTURE tb OF tb_aduh_mean_sum IS
   
   SIGNAL st_en           : STD_LOGIC := '1';
   SIGNAL st_sosi         : t_dp_sosi := c_dp_sosi_rst;
-  SIGNAL st_sosi_dly     : t_dp_sosi := c_dp_sosi_rst;
   SIGNAL st_siso         : t_dp_siso := c_dp_siso_rdy;
   
   SIGNAL bsn             : NATURAL;
@@ -84,7 +86,8 @@ ARCHITECTURE tb OF tb_aduh_mean_sum IS
   
   SIGNAL sum             : STD_LOGIC_VECTOR(c_sum_w-1 DOWNTO 0);
   SIGNAL sum_sync        : STD_LOGIC;
-  SIGNAL sum_sop         : STD_LOGIC;
+  
+  SIGNAL verify_done     : STD_LOGIC := '0';
   
 BEGIN
 
@@ -117,28 +120,27 @@ BEGIN
     END LOOP;
     
     st_sosi <= c_dp_sosi_rst;
-    proc_common_wait_some_cycles(clk, 15);
+    proc_common_wait_some_cycles(clk, 10);
+    proc_common_gen_pulse(clk, tb_almost_end);
+    proc_common_wait_some_cycles(clk, 10);
     tb_end <= '1';
     WAIT;
   END PROCESS;
 
-  st_sosi_dly <= st_sosi WHEN rising_edge(clk);
-
   -- Time stimuli  
-  bsn <= bsn + 1 WHEN rising_edge(clk) AND st_sosi.sync='1';
+  bsn <= bsn + 1 WHEN rising_edge(clk) AND st_sosi.eop='1';
   
   -- Add BSN to the ST data
-  p_in_sosi : PROCESS(st_sosi, st_sosi_dly, bsn)
+  p_in_sosi : PROCESS(st_sosi, bsn)
   BEGIN
-    in_sosi      <= st_sosi_dly;       -- data
+    in_sosi      <= st_sosi;           -- sync at sop, data
     in_sosi.bsn  <= TO_DP_BSN(bsn);    -- bsn at sop
-    in_sosi.sync <= st_sosi.sync;      -- sync before sop
   END PROCESS;
   
   u_dut : ENTITY work.aduh_mean_sum
   GENERIC MAP (
     g_symbol_w             => c_symbol_w,
-    g_nof_symbols_per_data => c_nof_symbols_per_data,  -- big endian in_data, t0 in MSSymbol, so [h:0] = [t0]&[t1]&[t2]&[t3]
+    g_nof_symbols_per_data => g_nof_symbols_per_data,  -- big endian in_data, t0 in MSSymbol, so [h:0] = [t0]&[t1]&[t2]&[t3]
     g_nof_accumulations    => c_nof_accumulations,     -- integration time in symbols
     g_sum_truncate         => c_sum_truncate,          -- when TRUE truncate (keep MS part) else resize (keep sign and LS part)
     g_sum_w                => c_sum_w                  -- typcially MM word width = 32
@@ -154,8 +156,30 @@ BEGIN
     
     -- Accumulation outputs
     sum         => sum,
-    sum_sync    => sum_sync,
-    sum_sop     => sum_sop
+    sum_sync    => sum_sync
   );
+  
+  -- Only verify sum for a few sum_sync
+  p_verify_sum : PROCESS
+    VARIABLE vI : NATURAL := 0;
+  BEGIN
+    WHILE vI < c_exp_sum_arr'LENGTH LOOP
+      WAIT UNTIL rising_edge(clk);
+      IF sum_sync='1' THEN
+        ASSERT sum = TO_SVEC(c_exp_sum_arr(vI), c_sum_w) REPORT "Unexpected voltage sum." SEVERITY ERROR;
+        vI := vI + 1;
+      END IF;
+    END LOOP;
+    verify_done <= '1';
+    WAIT;
+  END PROCESS;
+  
+  -- Verify that the tb has run with active data
+  p_verify_done : PROCESS
+  BEGIN
+    proc_common_wait_until_high(clk, verify_done);
+    ASSERT verify_done='1' REPORT "No sum output" SEVERITY ERROR;
+    WAIT;
+  END PROCESS;
       
 END tb;
diff --git a/libraries/io/aduh/tb/vhdl/tb_aduh_power_sum.vhd b/libraries/io/aduh/tb/vhdl/tb_aduh_power_sum.vhd
index bdbf86f000..3d2c1219aa 100644
--- a/libraries/io/aduh/tb/vhdl/tb_aduh_power_sum.vhd
+++ b/libraries/io/aduh/tb/vhdl/tb_aduh_power_sum.vhd
@@ -35,13 +35,14 @@ USE dp_lib.tb_dp_pkg.ALL;
 -- > run 1 us
 -- observe in_sosi, pwr_sum and pwr_sum_sync in wave window
 -- expected pwr_sum after pwr_sync are: 0, 1240, 9176, ...
--- . sum([ 0:15].^2) =  1240
--- . sum([16:31].^2) =  9176
--- . sum([32:47].^2) = 25304
+-- . pwr_sum([ 0:15].^2) =  1240
+-- . pwr_sum([16:31].^2) =  9176
+-- . pwr_sum([32:47].^2) = 25304
 
 ENTITY tb_aduh_power_sum IS
   GENERIC (
-    g_random_control : BOOLEAN := TRUE  -- use TRUE for random stream flow control, use FALSE for initial debugging
+    g_nof_symbols_per_data  : NATURAL := 4;    -- choose 1 or 4, nof symbols (= ADC samples) per data word
+    g_random_control        : BOOLEAN := TRUE  -- use TRUE for random stream flow control, use FALSE for initial debugging
   );
 END tb_aduh_power_sum;
 
@@ -52,13 +53,12 @@ ARCHITECTURE tb OF tb_aduh_power_sum IS
   
   CONSTANT c_rl                    : NATURAL := 1;
   CONSTANT c_symbol_w              : NATURAL := 8;
-  CONSTANT c_nof_symbols_per_data  : NATURAL := 4;
   CONSTANT c_nof_symbols_per_block : NATURAL := 8;         -- nof symbols (= ADC samples) per block
   
   CONSTANT c_pwr_sum_truncate      : BOOLEAN := TRUE;
   CONSTANT c_pwr_sum_w             : NATURAL := c_word_w;   -- = 32
   
-  CONSTANT c_data_w                : NATURAL := c_nof_symbols_per_data*c_symbol_w;
+  CONSTANT c_data_w                : NATURAL := g_nof_symbols_per_data*c_symbol_w;
   
   CONSTANT c_nof_sync              : NATURAL := 10;
   CONSTANT c_nof_block_per_sync    : NATURAL := 2;
@@ -66,6 +66,9 @@ ARCHITECTURE tb OF tb_aduh_power_sum IS
   
   CONSTANT c_nof_accumulations     : NATURAL := c_nof_symbols_per_sync;  -- integration time in symbols
   
+  CONSTANT c_exp_sum_arr           : t_natural_arr(0 TO 3) := (0, 1240, 9176, 25304);
+  
+  SIGNAL tb_almost_end   : STD_LOGIC := '0';
   SIGNAL tb_end          : STD_LOGIC := '0';
   SIGNAL rst             : STD_LOGIC;
   SIGNAL clk             : STD_LOGIC := '1';
@@ -74,16 +77,14 @@ ARCHITECTURE tb OF tb_aduh_power_sum IS
   
   SIGNAL st_en           : STD_LOGIC := '1';
   SIGNAL st_sosi         : t_dp_sosi := c_dp_sosi_rst;
-  SIGNAL st_sosi_dly     : t_dp_sosi := c_dp_sosi_rst;
   SIGNAL st_siso         : t_dp_siso := c_dp_siso_rdy;
-  
-  SIGNAL bsn             : NATURAL;
-  
+  SIGNAL bsn             : NATURAL;  
   SIGNAL in_sosi         : t_dp_sosi := c_dp_sosi_rst;
   
   SIGNAL pwr_sum         : STD_LOGIC_VECTOR(c_pwr_sum_w-1 DOWNTO 0);
   SIGNAL pwr_sum_sync    : STD_LOGIC;
-  SIGNAL pwr_sum_sop     : STD_LOGIC;
+  
+  SIGNAL verify_done     : STD_LOGIC := '0';
   
 BEGIN
 
@@ -118,27 +119,26 @@ BEGIN
     
     st_sosi <= c_dp_sosi_rst;
     proc_common_wait_some_cycles(clk, 15);
+    proc_common_gen_pulse(clk, tb_almost_end);
+    proc_common_wait_some_cycles(clk, 10);
     tb_end <= '1';
     WAIT;
   END PROCESS;
   
-  st_sosi_dly <= st_sosi WHEN rising_edge(clk);
-
   -- Time stimuli  
-  bsn <= bsn + 1 WHEN rising_edge(clk) AND st_sosi.sync='1';
+  bsn <= bsn + 1 WHEN rising_edge(clk) AND st_sosi.eop='1';
   
   -- Add BSN to the ST data
-  p_in_sosi : PROCESS(st_sosi, st_sosi_dly, bsn)
+  p_in_sosi : PROCESS(st_sosi, bsn)
   BEGIN
-    in_sosi      <= st_sosi_dly;       -- data
-    in_sosi.bsn  <= TO_DP_BSN(bsn);    -- bsn at sop
-    in_sosi.sync <= st_sosi.sync;      -- sync before sop
+    in_sosi      <= st_sosi;         -- sync at sop, data
+    in_sosi.bsn  <= TO_DP_BSN(bsn);  -- bsn at sop
   END PROCESS;
   
   u_dut : ENTITY work.aduh_power_sum
   GENERIC MAP (
     g_symbol_w             => c_symbol_w,
-    g_nof_symbols_per_data => c_nof_symbols_per_data,  -- big endian in_data, t0 in MSSymbol, so [h:0] = [t0]&[t1]&[t2]&[t3]
+    g_nof_symbols_per_data => g_nof_symbols_per_data,  -- big endian in_data, t0 in MSSymbol, so [h:0] = [t0]&[t1]&[t2]&[t3]
     g_nof_accumulations    => c_nof_accumulations,     -- integration time in symbols
     g_pwr_sum_truncate     => c_pwr_sum_truncate,      -- when TRUE truncate (keep MS part) else resize (keep sign and LS part)
     g_pwr_sum_w            => c_pwr_sum_w              -- typcially MM word width = 32
@@ -154,8 +154,30 @@ BEGIN
     
     -- Accumulation outputs
     pwr_sum      => pwr_sum,
-    pwr_sum_sync => pwr_sum_sync,
-    pwr_sum_sop  => pwr_sum_sop
+    pwr_sum_sync => pwr_sum_sync
   );
       
+  -- Only verify pwr_sum for a few pwr_sum_sync
+  p_verify_sum : PROCESS
+    VARIABLE vI : NATURAL := 0;
+  BEGIN
+    WHILE vI < c_exp_sum_arr'LENGTH LOOP
+      WAIT UNTIL rising_edge(clk);
+      IF pwr_sum_sync='1' THEN
+        ASSERT pwr_sum = TO_SVEC(c_exp_sum_arr(vI), c_pwr_sum_w) REPORT "Unexpected power sum." SEVERITY ERROR;
+        vI := vI + 1;
+      END IF;
+    END LOOP;
+    verify_done <= '1';
+    WAIT;
+  END PROCESS;
+  
+  -- Verify that the tb has run with active data
+  p_verify_done : PROCESS
+  BEGIN
+    proc_common_wait_until_high(clk, verify_done);
+    ASSERT verify_done='1' REPORT "No power sum output" SEVERITY ERROR;
+    WAIT;
+  END PROCESS;
+  
 END tb;
-- 
GitLab