From f9b1a01f41386c02e12740f6ae95dc92cc264ac1 Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Tue, 6 Jan 2015 13:43:50 +0000
Subject: [PATCH] Use ctlr slv address instead of record address.

---
 libraries/io/ddr/src/vhdl/io_ddr.vhd          | 13 +++---
 .../io/ddr/src/vhdl/io_ddr_cross_domain.vhd   |  8 ++--
 libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd        | 43 +++++++------------
 3 files changed, 27 insertions(+), 37 deletions(-)

diff --git a/libraries/io/ddr/src/vhdl/io_ddr.vhd b/libraries/io/ddr/src/vhdl/io_ddr.vhd
index 12cde69052..30f4213129 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr.vhd
@@ -131,8 +131,8 @@ ENTITY io_ddr IS
     dvr_en             : IN    STD_LOGIC;
     dvr_done           : OUT   STD_LOGIC;
     dvr_wr_not_rd      : IN    STD_LOGIC;
-    dvr_start_addr     : IN    t_tech_ddr_addr;
-    dvr_end_addr       : IN    t_tech_ddr_addr;
+    dvr_start_addr     : IN    STD_LOGIC_VECTOR(func_tech_ddr_ctlr_address_w(g_tech_ddr)-1 DOWNTO 0);
+    dvr_end_addr       : IN    STD_LOGIC_VECTOR(func_tech_ddr_ctlr_address_w(g_tech_ddr)-1 DOWNTO 0);
     dvr_wr_flush_en    : IN    STD_LOGIC := '0';
 
     -- Write FIFO clock domain
@@ -165,6 +165,7 @@ ARCHITECTURE str OF io_ddr IS
   CONSTANT c_wr_use_ctrl       : BOOLEAN := sel_a_b(g_wr_flush_mode="SOP", TRUE, FALSE);
   CONSTANT c_wr_fifo_use_ctrl  : BOOLEAN := c_wr_use_sync OR c_wr_use_ctrl;
   
+  CONSTANT c_ctlr_address_w    : NATURAL := func_tech_ddr_ctlr_address_w(g_tech_ddr);
   CONSTANT c_ctlr_data_w       : NATURAL := func_tech_ddr_ctlr_data_w(g_tech_ddr);
   CONSTANT c_wr_fifo_depth     : NATURAL := g_wr_fifo_depth * (c_ctlr_data_w/g_wr_data_w);  -- get FIFO depth at write side
   
@@ -174,8 +175,8 @@ ARCHITECTURE str OF io_ddr IS
   SIGNAL ctlr_dvr_en           : STD_LOGIC;
   SIGNAL ctlr_dvr_done         : STD_LOGIC;
   SIGNAL ctlr_dvr_wr_not_rd    : STD_LOGIC;
-  SIGNAL ctlr_dvr_start_addr   : t_tech_ddr_addr;
-  SIGNAL ctlr_dvr_end_addr     : t_tech_ddr_addr;
+  SIGNAL ctlr_dvr_start_addr   : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0);
+  SIGNAL ctlr_dvr_end_addr     : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0);
   SIGNAL ctlr_dvr_wr_flush_en  : STD_LOGIC := '0';
     
   SIGNAL ctlr_init_done        : STD_LOGIC;
@@ -352,8 +353,8 @@ BEGIN
 
     dvr_en          => ctlr_dvr_en,
     dvr_wr_not_rd   => ctlr_dvr_wr_not_rd,
-    dvr_start_addr  => ctlr_dvr_start_addr,
-    dvr_end_addr    => ctlr_dvr_end_addr, 
+    dvr_start_address  => ctlr_dvr_start_addr,
+    dvr_end_address    => ctlr_dvr_end_addr, 
     dvr_done        => ctlr_dvr_done,
     
     wr_fifo_usedw   => ctlr_wr_fifo_usedw,
diff --git a/libraries/io/ddr/src/vhdl/io_ddr_cross_domain.vhd b/libraries/io/ddr/src/vhdl/io_ddr_cross_domain.vhd
index 555ebb8ede..765125c5e9 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr_cross_domain.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr_cross_domain.vhd
@@ -50,8 +50,8 @@ ENTITY io_ddr_cross_domain IS
     dvr_en                 : IN  STD_LOGIC;
     dvr_done               : OUT STD_LOGIC;
     dvr_wr_not_rd          : IN  STD_LOGIC;
-    dvr_start_addr         : IN  t_tech_ddr_addr;
-    dvr_end_addr           : IN  t_tech_ddr_addr;
+    dvr_start_addr         : IN  STD_LOGIC_VECTOR;
+    dvr_end_addr           : IN  STD_LOGIC_VECTOR;
     dvr_wr_flush_en        : IN  STD_LOGIC := '0';
     
     -- DDR controller clock domain
@@ -61,8 +61,8 @@ ENTITY io_ddr_cross_domain IS
     ctlr_dvr_en            : OUT STD_LOGIC;
     ctlr_dvr_done          : IN  STD_LOGIC;
     ctlr_dvr_wr_not_rd     : OUT STD_LOGIC;
-    ctlr_dvr_start_addr    : OUT t_tech_ddr_addr;
-    ctlr_dvr_end_addr      : OUT t_tech_ddr_addr;
+    ctlr_dvr_start_addr    : OUT STD_LOGIC_VECTOR;
+    ctlr_dvr_end_addr      : OUT STD_LOGIC_VECTOR;
     ctlr_dvr_wr_flush_en   : OUT STD_LOGIC := '0'
   );
 END io_ddr_cross_domain;
diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
index 9240262d39..df392db34c 100644
--- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
@@ -50,7 +50,7 @@ ENTITY tb_io_ddr IS
     g_ctlr_ref_clk_period   : TIME := 5 ns;     -- 200 MHz
     g_dvr_clk_period        : TIME := 5 ns;    -- 50 ns
     g_dp_clk_period         : TIME := 5000 ps;  -- 200 MHz
-    g_dp_data_w             : NATURAL := 32;    -- 32 for mixed width and 256 for equal width FIFO
+    g_dp_data_w             : NATURAL := 256;    -- 32 for mixed width and 256 for equal width FIFO
     g_nof_repeat            : NATURAL := 2;
     g_wr_flush_mode         : STRING := "SYN"  -- "VAL", "SOP", "SYN"
   );
@@ -62,20 +62,14 @@ ARCHITECTURE str of tb_io_ddr IS
 
   CONSTANT c_tech_ddr         : t_c_tech_ddr := c_tech_ddr3_4g_800m_master;
   
---  CONSTANT c_ddr_addr_hi      : t_tech_ddr_addr := ((OTHERS=>'0'),
---                                                    (OTHERS=>'0'),
---                                                    TO_UVEC(                                         3, c_tech_ddr_max.a_row_w),
---                                                    TO_UVEC(2**c_tech_ddr_4g.a_col_w-c_tech_ddr_4g.rsl, c_tech_ddr_max.a_col_w));
-  CONSTANT c_ddr_addr_hi      : t_tech_ddr_addr := ((OTHERS=>'0'),
-                                                    (OTHERS=>'0'),
-                                                    TO_UVEC(                                         3, c_tech_ddr_max.a_row_w),
-                                                    TO_UVEC(2**c_tech_ddr_4g.a_col_w-1, c_tech_ddr_max.a_col_w));
+  CONSTANT c_ctlr_address_w   : NATURAL := func_tech_ddr_ctlr_address_w(c_tech_ddr);
+  CONSTANT c_ctlr_data_w      : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr);
+  
   -- DDR access stimuli
-  CONSTANT c_address_lo_arr   : t_nat_natural_arr := (  0, 517,    0,     1,   2,   1,   2,   3,   5,  1900, 1900);
-  CONSTANT c_nof_address_arr  : t_nat_natural_arr := (517, 507, 1024,     1,   6,   1,   1,   2,   3,   153,  153);
-  CONSTANT c_wr_not_rd_arr    : STD_LOGIC_VECTOR  := ('1', '1',  '0',   '1', '1', '0', '0', '0', '0',    '1', '0');
+  CONSTANT c_ctlr_address_lo_arr   : t_nat_natural_arr := (  0, 517,    0,     1,   2,   1,   2,   3,   5,  1900, 1900);
+  CONSTANT c_ctlr_nof_address_arr  : t_nat_natural_arr := (517, 507, 1024,     1,   6,   1,   1,   2,   3,   153,  153);
+  CONSTANT c_ctlr_wr_not_rd_arr    : STD_LOGIC_VECTOR  := ('1', '1',  '0',   '1', '1', '0', '0', '0', '0',    '1', '0');
                                                     
-  CONSTANT c_ctlr_data_w      : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr);
   CONSTANT c_dp_factor        : NATURAL := c_ctlr_data_w/g_dp_data_w;
   
   CONSTANT c_wr_fifo_depth    : NATURAL := 128;
@@ -96,8 +90,8 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL dp_clk               : STD_LOGIC := '0';
   SIGNAL dp_rst               : STD_LOGIC;
 
-  SIGNAL dvr_start_addr       : t_tech_ddr_addr; 
-  SIGNAL dvr_end_addr         : t_tech_ddr_addr;
+  SIGNAL dvr_start_addr       : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); 
+  SIGNAL dvr_end_addr         : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0);
 
   SIGNAL dvr_en               : STD_LOGIC;
   SIGNAL dvr_done             : STD_LOGIC;
@@ -140,8 +134,6 @@ BEGIN
   dp_rst   <= '1', '0' AFTER 100 ns;
 
   p_stimuli : PROCESS
-    VARIABLE v_addr_lo : t_tech_ddr_addr;
-    VARIABLE v_addr_hi : t_tech_ddr_addr;
   BEGIN
     tb_end          <= '0';
     dvr_en          <= '0';
@@ -161,15 +153,12 @@ BEGIN
     proc_common_wait_some_cycles(ctlr_clk, 100);
     
     FOR R IN 0 TO g_nof_repeat-1 LOOP
-      FOR I IN c_address_lo_arr'RANGE LOOP
-        v_addr_lo := func_tech_ddr_dq_address(TO_DDR_CTLR_ADDRESS(4*c_address_lo_arr(I))                         , c_tech_ddr);
-        v_addr_hi := func_tech_ddr_dq_address(TO_DDR_CTLR_ADDRESS(4*c_address_lo_arr(I)+4*c_nof_address_arr(I)-1), c_tech_ddr);
-        
-        dvr_start_addr <= v_addr_lo;
-        dvr_end_addr   <= v_addr_hi;
-        
+      FOR I IN c_ctlr_address_lo_arr'RANGE LOOP
+        dvr_start_addr <= TO_UVEC(c_ctlr_address_lo_arr(I)                            , c_ctlr_address_w);
+        dvr_end_addr   <= TO_UVEC(c_ctlr_address_lo_arr(I)+c_ctlr_nof_address_arr(I)-1, c_ctlr_address_w);
+
         -- START ACCESS
-        dvr_wr_not_rd <= c_wr_not_rd_arr(I);
+        dvr_wr_not_rd <= c_ctlr_wr_not_rd_arr(I);
         dvr_en        <= '1';
         proc_common_wait_some_cycles(dvr_clk, 1);
         dvr_en        <= '0'; 
@@ -177,8 +166,8 @@ BEGIN
         -- ACCESS DONE
         proc_common_wait_until_lo_hi(dvr_clk, dvr_done);
         
-        IF c_wr_not_rd_arr(I)='0' THEN
-          expected_cnt <= expected_cnt + c_nof_address_arr(I)*c_dp_factor;
+        IF c_ctlr_wr_not_rd_arr(I)='0' THEN
+          expected_cnt <= expected_cnt + c_ctlr_nof_address_arr(I)*c_dp_factor;
         
           ASSERT snk_diag_res_val = '1' REPORT "[ERROR] DIAG_RES INVALID!"  SEVERITY FAILURE;
           ASSERT snk_diag_res = '0'     REPORT "[ERROR] NON-ZERO DIAG_RES!" SEVERITY FAILURE;
-- 
GitLab