From 77934c0899928dcffe7ad2c7708463844a8c80aa Mon Sep 17 00:00:00 2001
From: JobvanWee <wee@astron.nl>
Date: Thu, 31 Mar 2022 17:33:08 +0200
Subject: [PATCH] only a test bench is needed for ddrctrl_controller.

---
 .../lofar2/libraries/ddrctrl/hdllib.cfg       |   1 -
 .../libraries/ddrctrl/src/vhdl/ddrctrl.vhd    |   9 +-
 .../ddrctrl/src/vhdl/ddrctrl_controller.vhd   | 100 ++++++++----------
 .../libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd  |  34 ++++--
 4 files changed, 77 insertions(+), 67 deletions(-)

diff --git a/applications/lofar2/libraries/ddrctrl/hdllib.cfg b/applications/lofar2/libraries/ddrctrl/hdllib.cfg
index 6800878092..53fe5f5958 100644
--- a/applications/lofar2/libraries/ddrctrl/hdllib.cfg
+++ b/applications/lofar2/libraries/ddrctrl/hdllib.cfg
@@ -11,7 +11,6 @@ synth_files =
     src/vhdl/ddrctrl_input.vhd
     src/vhdl/ddrctrl_controller.vhd
     src/vhdl/ddrctrl.vhd
-    src/vhdl/ddrctrl_pkg.vhd
 
 test_bench_files =
     tb/vhdl/tb_ddrctrl_input_address_counter.vhd
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
index 507909186e..a803641e0b 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
@@ -32,7 +32,7 @@
 --  https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding
 --  The maximum value of the address is determend by g_tech_ddr.
 
-LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib, io_ddr_lib, lofar2_ddrctrl_lib;
+LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib, io_ddr_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE technology_lib.technology_pkg.ALL;
@@ -42,7 +42,6 @@ USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE io_ddr_lib.ALL;
-USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL;
 
 
 ENTITY ddrctrl IS
@@ -52,8 +51,8 @@ ENTITY ddrctrl IS
     g_technology      : NATURAL                                             := c_tech_select_default;
     g_nof_streams     : NATURAL                                             := 12;                                            -- number of input streams
     g_data_w          : NATURAL                                             := 14;                                            -- data with of input data vectors
-    g_stop_pos        : t_c_stop_pos
-   );
+    g_stop_percentage : NATURAL                                             := 50
+  );
   PORT (
     clk               : IN  STD_LOGIC                                       := '0';
     rst               : IN  STD_LOGIC;
@@ -196,7 +195,7 @@ BEGIN
   u_ddrctrl_controller : ENTITY work.ddrctrl_controller
   GENERIC MAP(
     g_tech_ddr                => g_tech_ddr,
-    g_stop_pos                => g_stop_pos
+    g_stop_percentage         => g_stop_percentage
   )
   PORT MAP(
   clk                         => clk,
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
index 7d596e9ade..09de03e44b 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
@@ -27,37 +27,36 @@
 --  https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding
 --  
 
-LIBRARY IEEE, dp_lib, common_lib, tech_ddr_lib, lofar2_ddrctrl_lib;
+LIBRARY IEEE, dp_lib, common_lib, tech_ddr_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE common_lib.common_pkg.ALL;
 USE tech_ddr_lib.tech_ddr_pkg.ALL;
-USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL;
 
 
 ENTITY ddrctrl_controller IS
   GENERIC (
-    g_tech_ddr  : t_c_tech_ddr;
-    g_stop_pos  : t_c_stop_pos
+    g_tech_ddr                : t_c_tech_ddr;
+    g_stop_percentage         : NATURAL     := 50
   );
   PORT (
-    clk	     	  : IN  STD_LOGIC;
-    rst         : IN  STD_LOGIC;
+    clk	     	                : IN  STD_LOGIC;
+    rst                       : IN  STD_LOGIC;
 
     -- ddrctrl_input
-    out_of      : IN NATURAL;
-    out_sosi    : IN t_dp_sosi;
-    out_adr     : IN NATURAL;
+    out_of                    : IN NATURAL;
+    out_sosi                  : IN t_dp_sosi;
+    out_adr                   : IN NATURAL;
 
     -- io_ddr
-    dvr_mosi    : OUT t_mem_ctlr_mosi;
-    wr_sosi     : OUT t_dp_sosi;
-    rd_siso     : OUT t_dp_siso;
+    dvr_mosi                  : OUT t_mem_ctlr_mosi;
+    wr_sosi                   : OUT t_dp_sosi;
+    rd_siso                   : OUT t_dp_siso;
 
     -- ddrctrl
-    stop_in	    : IN  STD_LOGIC
+    stop_in	                  : IN  STD_LOGIC
   );
 END ddrctrl_controller;
 
@@ -67,6 +66,7 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
   CONSTANT  c_bitshift_adr    : NATURAL                                     := ceil_log2(c_burstsize);
   CONSTANT  c_adr_w           : NATURAL                                     := func_tech_ddr_ctlr_address_w( g_tech_ddr );    -- the lengt of the address vector, for simulation this is smaller, otherwise the simulation would take to long, 27
   CONSTANT  c_max_adr         : NATURAL                                     := 2**(c_adr_w)-1;                                -- the maximal address that is possible within the vector length of the address
+  CONSTANT  c_pof_ma          : NATURAL                                     := (c_max_adr*(100-g_stop_percentage))/100;
   CONSTANT  c_zeros           : STD_LOGIC_VECTOR(c_bitshift_adr-1 DOWNTO 0) := (OTHERS => '0');
 
   -- type for statemachine
@@ -75,24 +75,24 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
   -- record for readability
   TYPE t_reg IS RECORD
   -- state of program
-  state                     : t_state;
+  state                       : t_state;
 
   -- signals
-  stop_adr                  : NATURAL;
-  stopped                   : STD_LOGIC;
+  stop_adr                    : STD_LOGIC_VECTOR(c_adr_w-1 DOWNTO 0);
+  stopped                     : STD_LOGIC;
 
   -- output
-  dvr_mosi                  : t_mem_ctlr_mosi;
-  wr_sosi                   : t_dp_sosi;
-  rd_siso                   : t_dp_siso;
+  dvr_mosi                    : t_mem_ctlr_mosi;
+  wr_sosi                     : t_dp_sosi;
+  rd_siso                     : t_dp_siso;
   END RECORD;
 
-  CONSTANT c_t_reg_init     : t_reg         := (RESET, 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init, c_dp_siso_rst);
+  CONSTANT c_t_reg_init       : t_reg         := (RESET, TO_UVEC(c_max_adr, c_adr_w), '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init, c_dp_siso_rst);
 
 
   -- signals for readability
-  SIGNAL d_reg              : t_reg         := c_t_reg_init;
-  SIGNAL q_reg              : t_reg         := c_t_reg_init;
+  SIGNAL d_reg                : t_reg         := c_t_reg_init;
+  SIGNAL q_reg                : t_reg         := c_t_reg_init;
 
 BEGIN
 
@@ -133,53 +133,39 @@ BEGIN
 
 
     WHEN SET_STOP =>
-      --setting a stop address dependend on the g_stop_pos
-      IF g_stop_pos=START THEN
-        v.stop_adr := 0;
-      END IF;
-
-      IF g_stop_pos=HALFWAY THEN
-        IF (out_adr + (c_max_adr / 2)  >= c_max_adr) THEN
-          v.stop_adr := out_adr - (c_max_adr / 2);
-        ELSE
-          v.stop_adr := out_adr + (c_max_adr / 2);
-        END IF;
-        IF (stop_in = '1' AND out_adr = v.stop_adr) THEN
-          --stop_out <= '1';
-          v.dvr_mosi.address := TO_UVEC(out_adr, dvr_mosi.address'length);
-        ELSE
-          --stop_out <= '0';
-        END IF;
-      END IF;
-
-      IF g_stop_pos=IMMIDIATE THEN
-        v.stop_adr := c_max_adr;
+      --setting a stop address dependend on the g_stop_percentage
+      IF out_adr+c_pof_ma >= c_max_adr THEN
+        v.stop_adr(c_adr_w-1 DOWNTO c_bitshift_adr) := TO_UVEC(out_adr-c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO c_bitshift_adr);
+      ELSE
+        v.stop_adr(c_adr_w-1 DOWNTO c_bitshift_adr) := TO_UVEC(out_adr+c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO c_bitshift_adr);
       END IF;
-
+      v.stop_adr(c_bitshift_adr-1 DOWNTO 0)         := c_zeros;
 
       -- still a write cyle
       IF TO_UVEC(out_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN                        -- adr mod 64 = 0
-        v.dvr_mosi.burstbegin := '1';
+        v.dvr_mosi.burstbegin                   := '1';
         IF out_adr = 0 THEN
-          v.dvr_mosi.address    := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
+          v.dvr_mosi.address                    := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
         ELSE
-          v.dvr_mosi.address    := TO_UVEC(out_adr-c_burstsize, dvr_mosi.address'length);
+          v.dvr_mosi.address                    := TO_UVEC(out_adr-c_burstsize, dvr_mosi.address'length);
         END IF;
       ELSE
-        v.dvr_mosi.burstbegin := '0';
+        v.dvr_mosi.burstbegin                   := '0';
       END IF;
-      v.dvr_mosi.burstsize  := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length);
-      v.dvr_mosi.wr         := '1';
-      v.dvr_mosi.rd         := '0';
-      v.wr_sosi             := out_sosi;
+      v.dvr_mosi.burstsize                      := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length);
+      v.dvr_mosi.wr                             := '1';
+      v.dvr_mosi.rd                             := '0';
+      v.wr_sosi                                 := out_sosi;
 
 
 
     WHEN STOP_WRITING =>
-      v.stopped             := '0';
-      v.wr_sosi.valid       := '0';
-      -- enable flush
+      v.stopped                                 := '1';
+      v.wr_sosi.valid                           := '0';
+      v.dvr_mosi.flush                          := '1';
 
+    WHEN IDLE =>
+    
 
 
     WHEN OTHERS =>
@@ -193,6 +179,10 @@ BEGIN
       v.state := RESET;
     ELSIF stop_in = '1' THEN
       v.state := SET_STOP;
+    ELSIF v.stop_adr = TO_UVEC(out_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN
+      v.state := STOP_WRITING;
+    ELSIF v.stopped = '1' THEN
+      v.state := IDLE;
     ELSE
       v.state := WRITING;
     END IF;
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
index f16bee3854..df1980ae0a 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
@@ -22,7 +22,7 @@
 -- Usage:
 -- > run -a
 
-LIBRARY IEEE, common_lib, technology_lib, tech_ddr_lib, dp_lib, lofar2_ddrctrl_lib;
+LIBRARY IEEE, common_lib, technology_lib, tech_ddr_lib, dp_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE IEEE.MATH_REAL.ALL;
@@ -32,7 +32,6 @@ USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE common_lib.common_pkg.ALL;
 USE technology_lib.technology_select_pkg.ALL;
-USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL;
 
 
 ENTITY tb_ddrctrl IS
@@ -45,7 +44,7 @@ ENTITY tb_ddrctrl IS
     g_technology              : NATURAL                                               := c_tech_select_default;
     g_tech_ddr3               : t_c_tech_ddr                                          := c_tech_ddr3_4g_800m_master;
     g_tech_ddr4               : t_c_tech_ddr                                          := c_tech_ddr4_4g_1600m;
-    g_stop_pos                : t_c_stop_pos                                            := HALFWAY
+    g_stop_percentage         : NATURAL                                               := 80                                       -- percentage there needs to be already written in the ddr memory when a stop gets triggered
   );
 END tb_ddrctrl;
 
@@ -91,6 +90,7 @@ ARCHITECTURE tb OF tb_ddrctrl IS
   SIGNAL    mm_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    wr_not_rd         : STD_LOGIC;
+  SIGNAL    stop_in           : STD_LOGIC                                             := '0';
 
 
   -- testbench signal
@@ -131,9 +131,29 @@ BEGIN
 
 
     -- filling the input data vectors with the corresponding numbers
-    make_data : FOR J IN 0 TO c_sim_length-1 LOOP
+    make_data_0 : FOR J IN 0 TO c_sim_length-1 LOOP
       in_data_cnt     <= in_data_cnt+1;
-      fill_in_sosi_arr_rest : FOR I IN 0 TO g_nof_streams-1 LOOP
+      fill_in_sosi_arr_0 : FOR I IN 0 TO g_nof_streams-1 LOOP
+        in_sosi_arr(I).data(g_data_w-1 DOWNTO 0)   <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w);
+      END LOOP;
+      WAIT FOR c_clk_period*1;
+    END LOOP;
+
+    -- sending a stop signal
+    stop_in <= '1';
+
+    -- filling the input data vectors with the corresponding numbers
+    make_data_1 : FOR J IN 0 TO c_sim_length-1 LOOP
+      in_data_cnt     <= in_data_cnt+1;
+      fill_in_sosi_arr_1 : FOR I IN 0 TO g_nof_streams-1 LOOP
+        in_sosi_arr(I).data(g_data_w-1 DOWNTO 0)   <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w);
+      END LOOP;
+      WAIT FOR c_clk_period*1;
+      stop_in <= '0';
+    END LOOP;
+    make_data_2 : FOR J IN 0 TO c_sim_length-1 LOOP
+      in_data_cnt     <= in_data_cnt+1;
+      fill_in_sosi_arr_2 : FOR I IN 0 TO g_nof_streams-1 LOOP
         in_sosi_arr(I).data(g_data_w-1 DOWNTO 0)   <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w);
       END LOOP;
       WAIT FOR c_clk_period*1;
@@ -141,6 +161,7 @@ BEGIN
     test_running      <= '0';
     wr_not_rd         <= '0';
 
+
     -- stopping the testbench
     WAIT FOR c_clk_period*4;
     tb_end <= '1';
@@ -158,7 +179,7 @@ BEGIN
     g_technology      => g_technology,
     g_nof_streams     => g_nof_streams,
     g_data_w          => g_data_w,
-    g_stop_pos        => g_stop_pos
+    g_stop_percentage => g_stop_percentage
   )
   PORT MAP (
     clk               => clk,
@@ -167,6 +188,7 @@ BEGIN
     mm_rst            => mm_rst,
     in_sosi_arr       => in_sosi_arr,
     wr_not_rd         => wr_not_rd,
+    stop_in           => stop_in,
 
     --PHY
     phy3_io           => phy3_io,
-- 
GitLab