From 41ffb62e9ce5abdc2714d80ebe903bac0410f15b Mon Sep 17 00:00:00 2001
From: JobvanWee <wee@astron.nl>
Date: Tue, 8 Mar 2022 17:25:35 +0100
Subject: [PATCH] Ready for review.

---
 .../libraries/ddrctrl/src/vhdl/ddrctrl.vhd    |   3 +-
 .../ddrctrl/src/vhdl/ddrctrl_repack.vhd       |  84 +++++++++---
 .../libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd  | 121 +++++++++---------
 .../tb/vhdl/tb_ddrctrl_address_counter.vhd    |  32 ++---
 .../ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd     |  25 ++--
 .../avs2_eth_coe_10/sim/dp_stream_pkg.vhd     |   2 +-
 6 files changed, 163 insertions(+), 104 deletions(-)

diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
index 1dc40c4935..9f20e268cf 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
@@ -62,7 +62,7 @@ END ddrctrl;
 ARCHITECTURE str OF ddrctrl IS
 
   -- constant for readability
-  CONSTANT  c_out_data_w : NATURAL := g_nof_streams*g_data_w;           -- the input data with for ddrctrl_repack
+  CONSTANT  c_out_data_w : NATURAL    := g_nof_streams*g_data_w;           -- the input data with for ddrctrl_repack
 
 
   -- signals for connecting the components
@@ -94,6 +94,7 @@ BEGIN
   )
   PORT MAP(
     clk	     	        => clk,
+    rst               => rst,
     in_data           => data,                                          -- input data
     out_of      	    => out_of,                                        -- amount of internal overflow
     out_sosi          => sosi                                           -- output data
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd
index 0011b9c691..8bf4c5c339 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd
@@ -41,6 +41,7 @@ ENTITY ddrctrl_repack IS
   );
   PORT (
     clk	     	              : IN  STD_LOGIC;
+    rst                     : IN  STD_LOGIC;
     in_data  	              : IN  STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0);                                                             -- input data
     out_of      	          : OUT NATURAL                           := 0;                                                               -- amount of internal overflow this output
     out_sosi                : OUT t_dp_sosi                         := c_dp_sosi_init                                                   -- output data
@@ -50,6 +51,8 @@ END ddrctrl_repack;
 
 ARCHITECTURE rtl OF ddrctrl_repack IS
 
+  TYPE t_state IS (OVER_FLOW, FIRST_HALF, SECOND_HALF, RESET);
+
   -- constant for readability
   CONSTANT c_out_data_w     : NATURAL                               := func_tech_ddr_ctlr_data_w( g_tech_ddr );                         -- the output data with, 576
   CONSTANT k_c_v_w			    : NATURAL                               := c_out_data_w*2;                                                  -- the c_v data with, 2*576=1152
@@ -63,34 +66,77 @@ BEGIN
   VARIABLE c_v				      : STD_LOGIC_VECTOR (k_c_v_w-1 DOWNTO 0) := (OTHERS => '0');                                                 -- the vector that stores the input data until the data is put into the output data vector
   VARIABLE c_v_count			  : NATURAL                               := 0;                                                               -- the amount of times the c_v vector received data from the input since the last time it was filled completely
   VARIABLE out_data_count		: NATURAL                               := 0;                                                               -- the amount of times the output data vector has been filled since the last time c_v was filled completely
+  VARIABLE state            : t_state                               := FIRST_HALF;                                                      -- the state the process is currently in;
 
   BEGIN
     IF rising_edge(clk) THEN
-      IF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) THEN								                                      -- if the input data exceeds the output data vector width
-
-	      IF (out_data_count = 1) THEN													                                                                         	-- if the input data exceeds c_v widt
-          a_of := a_of + (g_in_data_w*(c_v_count+1)) - (c_out_data_w*(out_data_count+1));							                                  -- check how much overflow there is and safe it in a_of
-        	out_of <= a_of;													                                                                                 		  -- set the output overflow to the overflow that maches the out_sosi.data vector
-	        c_v(k_c_v_w - 1 DOWNTO k_c_v_w-(g_in_data_w - a_of)) := in_data(g_in_data_w - a_of - 1 DOWNTO 0);			                        -- fill the rest of c_v untill the end
-	        c_v(a_of - 1 DOWNTO 0) := in_data(g_in_data_w - 1 DOWNTO g_in_data_w - a_of);							                                    -- fill the start of c_v untill the a_of
-	        out_sosi.data(c_out_data_w - 1 DOWNTO 0) <= c_v(k_c_v_w - 1 DOWNTO c_out_data_w);							                                -- fill out_sosi.data with 2nd part of c_v
-	        out_sosi.valid <= '1';													                                                          	                  -- out_sosi.valid 1
-	        c_v_count	:= 0; 													                                                                                   	-- reset counter
-          out_data_count := 0;													                                                                               	-- reset counter
-
-	      Else															                                                                                            	-- if the input data exceeds output data vector width but not the c_v vector widt
+      CASE state IS
+      WHEN FIRST_HALF =>										                                                                                          	-- if the input data doesn't exceeds the output data vector width
+        c_v(g_in_data_w * (c_v_count + 1) + a_of - 1 DOWNTO g_in_data_w * c_v_count + a_of) := in_data(g_in_data_w - 1 DOWNTO 0);	      -- fill c_v
+	      c_v_count := c_v_count + 1;														                                                                        	-- increase the counter of c_v with 1
+        out_sosi.valid <= '0';														                                                                              -- out_sosi.valid 0
+
+        IF rst = '1' THEN
+          state := RESET;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 0) THEN
+          state := SECOND_HALF;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 1) THEN
+          state := OVER_FLOW;
+        ELSE
+          state := FIRST_HALF;
+        END IF;
+
+      WHEN SECOND_HALF =>                         	                                                                                    -- if the input data exceeds output data vector width but not the c_v width
 	        c_v(g_in_data_w * (c_v_count + 1) + a_of - 1 DOWNTO g_in_data_w * c_v_count + a_of) := in_data(g_in_data_w - 1 DOWNTO 0); 	  -- fill c_v
 	        c_v_count := c_v_count + 1;													                                                                          -- increase the counter of c_v with 1
 	        out_sosi.data(c_out_data_w - 1 DOWNTO 0) <= c_v(c_out_data_w - 1 DOWNTO 0);						                                        -- fill out_sosi.data with 1st part of c_v
 	        out_sosi.valid <= '1';													                                                                              -- out_sosi.valid 1
 	        out_data_count := out_data_count + 1;													                                                                -- increase the counter of out_sosi.data with 1
-	      END IF;
 
-      ELSE															                                                                                              	-- if the input data doesn't exceeds the output data vector width
-        c_v(g_in_data_w * (c_v_count + 1) + a_of - 1 DOWNTO g_in_data_w * c_v_count + a_of) := in_data(g_in_data_w - 1 DOWNTO 0);	      -- fill c_v
-	      c_v_count := c_v_count + 1;														                                                                        	-- increase the counter of c_v with 1
-        out_sosi.valid <= '0';														                                                                              -- out_sosi.valid 0
-      END IF;
+        IF rst = '1' THEN
+          state := RESET;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 0) THEN
+          state := SECOND_HALF;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 1) THEN
+          state := OVER_FLOW;
+        ELSE
+          state := FIRST_HALF;
+        END IF;
+
+      WHEN OVER_FLOW =>                                                                                                                 -- if the input data exceeds the output data vector width and the c_v width
+        a_of := a_of + (g_in_data_w*(c_v_count+1)) - (c_out_data_w*(out_data_count+1));							                                    -- check how much overflow there is and safe it in a_of
+        out_of <= a_of;													                                                                                 		    -- set the output overflow to the overflow that maches the out_sosi.data vector
+	      c_v(k_c_v_w - 1 DOWNTO k_c_v_w-(g_in_data_w - a_of)) := in_data(g_in_data_w - a_of - 1 DOWNTO 0);			                          -- fill the rest of c_v untill the end
+	      c_v(a_of - 1 DOWNTO 0) := in_data(g_in_data_w - 1 DOWNTO g_in_data_w - a_of);							                                      -- fill the start of c_v untill the a_of
+	      out_sosi.data(c_out_data_w - 1 DOWNTO 0) <= c_v(k_c_v_w - 1 DOWNTO c_out_data_w);							                                  -- fill out_sosi.data with 2nd part of c_v
+	      out_sosi.valid <= '1';													                                                          	                    -- out_sosi.valid 1
+	      c_v_count	:= 0; 													                                                                                   	  -- reset counter
+        out_data_count := 0;													                                                                               	  -- reset counter
+
+        IF rst = '1' THEN
+          state := RESET;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 0) THEN
+          state := SECOND_HALF;
+        ELSIF ((g_in_data_w*(c_v_count+1))+a_of >= c_out_data_w*(out_data_count+1)) AND (out_data_count = 1) THEN
+          state := OVER_FLOW;
+        ELSE
+          state := FIRST_HALF;
+        END IF;
+
+      WHEN RESET =>
+        a_of           := 0;
+        c_v				     := (OTHERS => '0');
+        c_v_count			 := 0;
+        out_data_count := 0;
+        out_of         <= 0;
+        out_sosi       <= c_dp_sosi_init;
+        IF rst = '1' THEN
+          state        := RESET;
+        ELSE
+          state        := FIRST_HALF;
+        END IF;
+
+      END CASE;
     END IF;
   END PROCESS;
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
index dfafad5569..12a9abbd26 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
@@ -35,11 +35,11 @@ USE common_lib.common_pkg.ALL;
 ENTITY tb_ddrctrl IS
   GENERIC (
 
-    g_tech_ddr                : t_c_tech_ddr                                := c_tech_ddr4_8g_1600m;                    -- type of memory
-    g_sim_model               : BOOLEAN                                     := TRUE;                                    -- determens if this is a simulation
-    g_nof_streams             : POSITIVE                                    := 12;                                      -- number of input streams
-    g_data_w                  : NATURAL                                     := 14;                                      -- data with of input data vectors
-    g_sim_length              : NATURAL                                     := 52
+    g_tech_ddr                : t_c_tech_ddr                                          := c_tech_ddr4_8g_1600m;                    -- type of memory
+    g_sim_model               : BOOLEAN                                               := TRUE;                                    -- determens if this is a simulation
+    g_nof_streams             : POSITIVE                                              := 12;                                      -- number of input streams
+    g_data_w                  : NATURAL                                               := 14;                                      -- data with of input data vectors
+    g_sim_length              : NATURAL                                               := 52
 
   );
 END tb_ddrctrl;
@@ -47,14 +47,14 @@ END tb_ddrctrl;
 ARCHITECTURE tb OF tb_ddrctrl IS
 
   -- constants for testbench
-  CONSTANT  c_clk_freq        : NATURAL                                     := 200;                                     -- clock frequency in MHz
-  CONSTANT  c_clk_period      : TIME                                        := (10**6 / c_clk_freq) * 1 ps;             -- clock priod, 5 ns
+  CONSTANT  c_clk_freq        : NATURAL                                               := 200;                                     -- clock frequency in MHz
+  CONSTANT  c_clk_period      : TIME                                                  := (10**6 / c_clk_freq) * 1 ps;             -- clock priod, 5 ns
 
   -- constants for readability
-  CONSTANT  c_in_data_w       : NATURAL                                     := g_nof_streams * g_data_w;                -- output data with, 168
-  CONSTANT  c_out_data_w      : NATURAL                                     := func_tech_ddr_ctlr_data_w( g_tech_ddr ); -- output data vector with, 576
-  CONSTANT  c_adr_w           : NATURAL                                     := 4;                                       -- address with in simulation
-  CONSTANT  c_adr_size        : NATURAL                                     := 2**c_adr_w;                              -- address size in simulation
+  CONSTANT  c_in_data_w       : NATURAL                                               := g_nof_streams * g_data_w;                -- output data with, 168
+  CONSTANT  c_out_data_w      : NATURAL                                               := func_tech_ddr_ctlr_data_w( g_tech_ddr ); -- output data vector with, 576
+  CONSTANT  c_adr_w           : NATURAL                                               := 4;                                       -- address with in simulation
+  CONSTANT  c_adr_size        : NATURAL                                               := 2**c_adr_w;                              -- address size in simulation
 
   -- function for making total data vector
   FUNCTION  c_total_vector_init RETURN STD_LOGIC_VECTOR IS
@@ -67,27 +67,27 @@ ARCHITECTURE tb OF tb_ddrctrl IS
   END FUNCTION c_total_vector_init;
 
   -- constant for running the test
-  CONSTANT  c_total_vector    : STD_LOGIC_VECTOR(c_in_data_w*g_sim_length-1 DOWNTO 0)   := c_total_vector_init;          -- vector which contains all input data vectors to make it easy to fill ctr_vector
+  CONSTANT  c_total_vector    : STD_LOGIC_VECTOR(c_in_data_w*g_sim_length-1 DOWNTO 0) := c_total_vector_init;                     -- vector which contains all input data vectors to make it easy to fill ctr_vector
 
 
   -- input signals for ddrctrl.vhd
-  SIGNAL    clk               : STD_LOGIC                                   := '1';
-  SIGNAL    rst               : STD_LOGIC                                   := '0';
-  SIGNAL    in_sosi_arr       : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0)     := (OTHERS => c_dp_sosi_init);              -- input data signal for ddrctrl_pack.vhd 
+  SIGNAL    clk               : STD_LOGIC                                             := '1';
+  SIGNAL    rst               : STD_LOGIC                                             := '0';
+  SIGNAL    in_sosi_arr       : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0)               := (OTHERS => c_dp_sosi_init);              -- input data signal for ddrctrl_pack.vhd 
 
   -- output singals from ddrctrl.vhd
-  SIGNAL    out_of            : NATURAL                                                := 0;                            -- output signal from ddrctrl_repack to determen how high the overflow is
-  SIGNAL    out_mosi          : t_mem_ctlr_mosi                             := c_mem_ctlr_mosi_rst;                     -- output signal from ddrctrl_pack.vhd
+  SIGNAL    out_of            : NATURAL                                               := 0;                                       -- output signal from ddrctrl_repack to determen how high the overflow is
+  SIGNAL    out_mosi          : t_mem_ctlr_mosi                                       := c_mem_ctlr_mosi_rst;                     -- output signal from ddrctrl_pack.vhd
 
   -- testbench signal
-  SIGNAL    tb_end            : STD_LOGIC                                   := '0';                                     -- signal to turn the testbench off
+  SIGNAL    tb_end            : STD_LOGIC                                             := '0';                                     -- signal to turn the testbench off
 
   -- signals for running test
-  SIGNAL    in_data_cnt       : NATURAL                                     := 0;                                       -- signal which contains the amount of times there has been input data for ddrctrl_repack.vhd
-  SIGNAL    test_running      : STD_LOGIC                                   := '0';                                     -- signal to tell wheter the testing has started
-  SIGNAL    lag_due_reset     : NATURAL                                     := 0;                                       -- signal to hold the address lag after a rest
-  SIGNAL    d_lag_due_reset   : NATURAL                                     := 0;
-  SIGNAL    d_rst             : STD_LOGIC                                   := '0';
+  SIGNAL    in_data_cnt       : NATURAL                                               := 0;                                       -- signal which contains the amount of times there has been input data for ddrctrl_repack.vhd
+  SIGNAL    test_running      : STD_LOGIC                                             := '0';                                     -- signal to tell wheter the testing has started
+  SIGNAL    lag_due_reset     : NATURAL                                               := 0;                                       -- signal to hold the address lag after a rest
+  SIGNAL    q_lag_due_reset   : NATURAL                                               := 0;
+  SIGNAL    q_rst             : STD_LOGIC                                             := '0';
 
 BEGIN
 
@@ -100,10 +100,18 @@ BEGIN
 
     -- start the test
     tb_end            <= '0';
-    WAIT UNTIL rising_edge(clk);
-    WAIT UNTIL out_of /= 0; 
-    WAIT UNTIL out_of = 0; 
-    test_running      <= '1';
+    WAIT UNTIL rising_edge(clk);                                                                                                   -- align to rising edge
+    WAIT FOR c_clk_period*5;
+    rst <= '1';
+    WAIT FOR c_clk_period*1;
+    rst <= '0';
+    IF lag_due_reset + TO_UINT(out_mosi.address) >= c_adr_size THEN
+      lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address)-c_adr_size;
+    ELSE
+      lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address);
+    END IF;
+    WAIT FOR c_clk_period*1;
+    test_running      <= '1';                                                                                                      -- start of test
 
     -- filling the input data vectors with the corresponding numbers
     make_data : FOR J IN 0 TO g_sim_length-1 LOOP
@@ -115,49 +123,48 @@ BEGIN
     END LOOP;
     test_running      <= '0';
 
+    -- testing reset
+    FOR I IN 0 TO g_sim_length-1 LOOP
+      rst <= '1';
+      WAIT FOR c_clk_period*1;
+      rst <= '0';
+      IF lag_due_reset + TO_UINT(out_mosi.address) >= c_adr_size THEN
+        lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address)-c_adr_size;
+      ELSE
+        lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address);
+      END IF;
+      WAIT FOR c_clk_period*((((c_out_data_w / c_in_data_w)+1)*c_adr_size)+4);
+    END LOOP;
+
+
     -- stopping the testbench
     WAIT FOR c_clk_period*5;
     tb_end <= '1';
     ASSERT FALSE                                                                                                                        REPORT "Test: OK"                                                                                                                           SEVERITY FAILURE;
   END PROCESS;
 
-  -- excecuting the reset test
-  p_test_reset : PROCESS
-  BEGIN
-    rst <= '0';
-    --WAIT FOR c_clk_period*1;
-    IF lag_due_reset + TO_UINT(out_mosi.address) >= c_adr_size THEN
-      lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address)-c_adr_size;
-    ELSE
-      lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address);
-    END IF;
-    WAIT FOR c_clk_period*(c_adr_size+3);
-    rst <= '1';
-    WAIT FOR c_clk_period*1;
-  END PROCESS;
-
   -- generating compare data for out_mosi
   p_out_mosi : PROCESS
   BEGIN
     WAIT UNTIL rising_edge(clk);
     if rising_edge(clk) THEN
-      d_lag_due_reset  <= lag_due_reset;
-      d_rst            <= rst;
+      q_lag_due_reset  <= lag_due_reset;
+      q_rst            <= rst;
     END IF;
   END PROCESS;
 
-  -- verifying if the address is correct by keeping trach of the address
+  -- verifying if the address is correct by keeping track of the address
   p_verify_address : PROCESS
   BEGIN
     FOR I IN 0 TO c_adr_size-1 LOOP
       WAIT UNTIL out_mosi.wr = '1';
-      IF d_rst = '1' THEN
+      IF q_rst = '1' THEN
         WAIT UNTIL out_mosi.wr = '1';
       END IF;
-      IF I >= d_lag_due_reset THEN
-        ASSERT I-d_lag_due_reset   = TO_UINT(out_mosi.address)                                                                          REPORT "Wrong address, 1, I = " & NATURAL'image(I-d_lag_due_reset) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address))              SEVERITY ERROR;
+      IF I >= q_lag_due_reset THEN
+        ASSERT I-q_lag_due_reset   = TO_UINT(out_mosi.address)                                                                          REPORT "Wrong address, 1, I = " & NATURAL'image(I-q_lag_due_reset) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address))              SEVERITY ERROR;
       ELSE
-        ASSERT (I-d_lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address)                                                               REPORT "Wrong address, 2, I = " & NATURAL'image((I-d_lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR;
+        ASSERT (I-q_lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address)                                                               REPORT "Wrong address, 2, I = " & NATURAL'image((I-q_lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR;
       END IF;
     END LOOP;
   END PROCESS;
@@ -169,15 +176,15 @@ BEGIN
   VARIABLE  out_data_cnt      : NATURAL                                     := 0;
 
   BEGIN
-  WAIT UNTIL out_mosi.wr = '1' AND test_running = '1';
-  IF out_data_cnt >= 1 THEN
-    IF out_data_cnt mod 2 = 0 THEN
-      ctr_of := c_in_data_w*(in_data_cnt-1)-c_out_data_w*out_data_cnt;
-      ASSERT ctr_of                                 = out_of                                                                            REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) & ", out_of = " & NATURAL'image(out_of)                   SEVERITY ERROR;
-    END IF;
-    ASSERT out_mosi.wrdata(c_out_data_w-1 DOWNTO 0) = c_total_vector(c_out_data_w*out_data_cnt-1 DOWNTO c_out_data_w*(out_data_cnt-1))  REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt)                                                                 SEVERITY ERROR;
+  WAIT UNTIL test_running = '1';
+  WAIT UNTIL out_mosi.wr = '1';
+  out_data_cnt      := out_data_cnt+1;
+  IF out_data_cnt mod 2 = 0 THEN
+    assert false report "in_data_cnt = " & NATURAL'image(in_data_cnt) & ", out_data_cnt = " & NATURAL'image(out_data_cnt) severity note;
+    ctr_of := c_in_data_w*in_data_cnt-c_out_data_w*out_data_cnt;
+    ASSERT ctr_of                                   = out_of                                                                            REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) & ", out_of = " & NATURAL'image(out_of)                   SEVERITY ERROR;
   END IF;
-  out_data_cnt := out_data_cnt+1;
+    ASSERT out_mosi.wrdata(c_out_data_w-1 DOWNTO 0) = c_total_vector(c_out_data_w*out_data_cnt-1 DOWNTO c_out_data_w*(out_data_cnt-1))  REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt)                                                                 SEVERITY ERROR;
   END PROCESS;
 
 
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd
index 678abd6b76..bcd20dfdec 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd
@@ -55,6 +55,7 @@ ARCHITECTURE tb OF tb_ddrctrl_address_counter IS
   -- input signals for ddrctrl_address_counter.vhd
   SIGNAL    clk               : STD_LOGIC       := '1';
   SIGNAL    rst               : STD_LOGIC       := '0';
+  SIGNAL    q_rst             : STD_LOGIC       := '0';
   SIGNAL    in_sosi           : t_dp_sosi       := c_dp_sosi_init;                          -- signal which is the input for ddrctrl_address_counter.vhd
 
   -- output signal from ddrctrl_address_counter.vhd
@@ -63,12 +64,11 @@ ARCHITECTURE tb OF tb_ddrctrl_address_counter IS
   -- testbench signals
   SIGNAL    tb_end            : STD_LOGIC       := '0';                                     -- signal to turn the testbench off
   SIGNAL    in_data           : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0) := (OTHERS => '0');   -- signal which contains the data that is set as input
-  SIGNAL    d_in_data         : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0) := (OTHERS => '0');
+  SIGNAL    q_in_data         : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0) := (OTHERS => '0');   -- signal which contains the data that is set as input with a delay of 1 clockcycle
   SIGNAL    in_data_enable    : STD_LOGIC       := '0';                                     -- signal to determen if in_data is ready for reading
-  SIGNAL    d_in_data_enable  : STD_LOGIC       := '0';
-  SIGNAL    lag_due_reset     : NATURAL         := 0;                                       -- signal to hold the address lag after a rest
-  SIGNAL    d_lag_due_reset   : NATURAL         := 0;
-  SIGNAL    d_rst             : STD_LOGIC       := '0';
+  SIGNAL    q_in_data_enable  : STD_LOGIC       := '0';                                     -- signal to determen if in_data is ready for reading with a delay of 1 clockcycle
+  SIGNAL    lag_due_reset     : NATURAL         := 0;                                       -- signal to hold the address lag after a reset
+  SIGNAL    q_lag_due_reset   : NATURAL         := 0;                                       -- signal to hold the address lag after a reset with a delay of 1 clockcycle
 
 BEGIN
 
@@ -109,10 +109,10 @@ BEGIN
   BEGIN
     WAIT UNTIL rising_edge(clk);
     if rising_edge(clk) THEN
-      d_in_data_enable <= in_data_enable;
-      d_in_data        <= in_data;
-      d_lag_due_reset  <= lag_due_reset;
-      d_rst            <= rst;
+      q_in_data_enable <= in_data_enable;
+      q_in_data        <= in_data;
+      q_lag_due_reset  <= lag_due_reset;
+      q_rst            <= rst;
     END IF;
   END PROCESS;
       
@@ -122,8 +122,8 @@ BEGIN
   BEGIN
     WAIT UNTIL rising_edge(clk);
     IF rising_edge(clk) THEN
-      ASSERT d_in_data(c_data_w-1 DOWNTO 0) = out_mosi.wrdata(c_data_w-1 DOWNTO 0)     REPORT "in_sosi.data does not match out_mosi.wrdata"                         SEVERITY ERROR;
-      ASSERT d_in_data_enable               = out_mosi.wr                              REPORT "in_sosi.valid does not match out_mosi.wr"                            SEVERITY ERROR;
+      ASSERT q_in_data(c_data_w-1 DOWNTO 0) = out_mosi.wrdata(c_data_w-1 DOWNTO 0)     REPORT "in_sosi.data does not match out_mosi.wrdata"                         SEVERITY ERROR;
+      ASSERT q_in_data_enable               = out_mosi.wr                              REPORT "in_sosi.valid does not match out_mosi.wr"                            SEVERITY ERROR;
     END IF;
   END PROCESS;
 
@@ -142,18 +142,18 @@ BEGIN
     WAIT FOR c_clk_period*1;
   END PROCESS;
 
-  -- verifying if the address is correct by keeping trach of the address
+  -- verifying if the address is correct by keeping track of the address
   p_verify_address : PROCESS
   BEGIN
     FOR I IN 0 TO c_adr_size-1 LOOP
       WAIT UNTIL out_mosi.wr = '1';
-      IF d_rst = '1' THEN
+      IF q_rst = '1' THEN
         WAIT UNTIL out_mosi.wr = '1';
       END IF;
-      IF I >= d_lag_due_reset THEN
-        ASSERT I-d_lag_due_reset   = TO_UINT(out_mosi.address)                         REPORT "Wrong address, 1, I = " & NATURAL'image(I-d_lag_due_reset) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address))              SEVERITY ERROR;
+      IF I >= q_lag_due_reset THEN
+        ASSERT I-q_lag_due_reset   = TO_UINT(out_mosi.address)                         REPORT "Wrong address, 1, I = " & NATURAL'image(I-q_lag_due_reset) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address))              SEVERITY ERROR;
       ELSE
-        ASSERT (I-d_lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address)                REPORT "Wrong address, 2, I = " & NATURAL'image((I-d_lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address))   SEVERITY ERROR;
+        ASSERT (I-q_lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address)              REPORT "Wrong address, 2, I = " & NATURAL'image((I-q_lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR;
       END IF;
     END LOOP;
   END PROCESS;
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd
index ce51bf4b8e..9406fe0472 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd
@@ -67,6 +67,7 @@ ARCHITECTURE tb OF tb_ddrctrl_repack IS
 
   -- input signals for ddrctrl_repack.vhd
   SIGNAL    clk               : STD_LOGIC                                              := '1';                                     -- clock signal
+  SIGNAL    rst               : STD_LOGIC                                              := '0';                                     -- reset signal
   SIGNAL    in_data           : STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0)               := (OTHERS => '0');                         -- input data signal for ddrctrl_repack
 
   -- output signals from ddrctrl_repack.vhd
@@ -92,8 +93,11 @@ BEGIN
     -- start the test
     tb_end            <= '0';
     WAIT UNTIL rising_edge(clk);                                                                                                   -- align to rising edge
-    WAIT UNTIL out_of /= 0;                                                                                                        -- wait for out_of /= 0 to align to ddrctrl_repack properly 
-    WAIT UNTIL out_of = 0;                                                                                                         -- align to ddrctrl_repack 
+    WAIT FOR c_clk_period*5;
+    rst <= '1';
+    WAIT FOR c_clk_period*1;
+    rst <= '0';
+    WAIT FOR c_clk_period*1;
     test_running      <= '1';                                                                                                      -- start of test
 
     -- filling the input vector g_sim_lengt amount of times
@@ -117,15 +121,15 @@ BEGIN
   VARIABLE  out_data_cnt      : NATURAL                                     := 0;
 
   BEGIN
-  WAIT UNTIL out_sosi.valid = '1' AND test_running = '1';
-  IF out_data_cnt >= 1 THEN
-    IF out_data_cnt mod 2 = 0 THEN
-      ctr_of := g_in_data_w*in_data_cnt-c_out_data_w*out_data_cnt;
-      ASSERT ctr_of                                   = out_of                                                                        REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) & ", out_of = " & NATURAL'image(out_of) SEVERITY ERROR;
-    END IF;
-    ASSERT out_sosi.data(c_out_data_w-1 DOWNTO 0) = c_total_vector(c_out_data_w*out_data_cnt-1 DOWNTO c_out_data_w*(out_data_cnt-1))  REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt)                                               SEVERITY ERROR;
-  END IF;
+  WAIT UNTIL test_running = '1';
+  WAIT UNTIL out_sosi.valid = '1';
   out_data_cnt      := out_data_cnt+1;
+  IF out_data_cnt mod 2 = 0 THEN
+    assert false report "in_data_cnt = " & NATURAL'image(in_data_cnt) & ", out_data_cnt = " & NATURAL'image(out_data_cnt) severity note;
+    ctr_of := g_in_data_w*in_data_cnt-c_out_data_w*out_data_cnt;
+    ASSERT ctr_of                                 = out_of                                                                            REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) & ", out_of = " & NATURAL'image(out_of) SEVERITY ERROR;
+  END IF;
+    ASSERT out_sosi.data(c_out_data_w-1 DOWNTO 0) = c_total_vector(c_out_data_w*out_data_cnt-1 DOWNTO c_out_data_w*(out_data_cnt-1))  REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt)                                               SEVERITY ERROR;
   END PROCESS;
 
 
@@ -137,6 +141,7 @@ BEGIN
   )
   PORT MAP (
     clk               => clk,
+    rst               => rst,
     in_data           => in_data,
 
     out_of            => out_of,
diff --git a/boards/uniboard2b/designs/unb2b_jesd/revisions/unb2b_jesd_node0/quartus/ip/qsys_unb2b_minimal/qsys_unb2b_minimal_avs_eth_0/avs2_eth_coe_10/sim/dp_stream_pkg.vhd b/boards/uniboard2b/designs/unb2b_jesd/revisions/unb2b_jesd_node0/quartus/ip/qsys_unb2b_minimal/qsys_unb2b_minimal_avs_eth_0/avs2_eth_coe_10/sim/dp_stream_pkg.vhd
index a9782fa140..2fca455f62 100644
--- a/boards/uniboard2b/designs/unb2b_jesd/revisions/unb2b_jesd_node0/quartus/ip/qsys_unb2b_minimal/qsys_unb2b_minimal_avs_eth_0/avs2_eth_coe_10/sim/dp_stream_pkg.vhd
+++ b/boards/uniboard2b/designs/unb2b_jesd/revisions/unb2b_jesd_node0/quartus/ip/qsys_unb2b_minimal/qsys_unb2b_minimal_avs_eth_0/avs2_eth_coe_10/sim/dp_stream_pkg.vhd
@@ -33,7 +33,7 @@ PACKAGE dp_stream_pkg Is
   -- Remarks:
   -- * Choose smallest maximum SOSI slv lengths that fit all use cases, because unconstrained record fields slv is not allowed
   -- * The large SOSI data field width of 256b has some disadvantages:
-  --   . about 10% extra simulation time and PC memory usage compared to 72b (measured using tb_unb_tse_board)
+  --   . about 1ni0% extra simulation time and PC memory usage compared to 72b (measured using tb_unb_tse_board)
   --   . a 256b number has 64 hex digits in the Wave window which is awkward because of the leading zeros when typically
   --     only 32b are used, fortunately integer representation still works OK (except 0 which is shown as blank).
   --   However the alternatives are not attractive, because they affect the implementation of the streaming
-- 
GitLab