From d1e0547bade54ffe6f6f95e407fefb145ee11c73 Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Tue, 6 Jan 2015 08:54:41 +0000
Subject: [PATCH] Define g_dp_data_w as generic to be able to select mixed
 width or equal width FIFO.

---
 libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd    | 32 +++++++++++++----------
 libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd | 13 +++++----
 2 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
index 71b8fef17b..9240262d39 100644
--- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
@@ -50,6 +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_nof_repeat            : NATURAL := 2;
     g_wr_flush_mode         : STRING := "SYN"  -- "VAL", "SOP", "SYN"
   );
@@ -75,9 +76,7 @@ ARCHITECTURE str of tb_io_ddr IS
   CONSTANT c_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_data_w        : NATURAL := 32;
-  CONSTANT c_dp_data_w        : NATURAL := 256;
-  CONSTANT c_dp_factor        : NATURAL := c_ctlr_data_w/c_dp_data_w;
+  CONSTANT c_dp_factor        : NATURAL := c_ctlr_data_w/g_dp_data_w;
   
   CONSTANT c_wr_fifo_depth    : NATURAL := 128;
   CONSTANT c_rd_fifo_depth    : NATURAL := 256;
@@ -104,16 +103,17 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL dvr_done             : STD_LOGIC;
   SIGNAL dvr_wr_not_rd        : STD_LOGIC;
   SIGNAL dvr_wr_flush_en      : STD_LOGIC;
-  SIGNAL dvr_wr_fifo_usedw    : STD_LOGIC_VECTOR(ceil_log2(c_wr_fifo_depth * c_dp_factor)-1 DOWNTO 0);    
   
   SIGNAL diag_wr_src_in       : t_dp_siso;
   SIGNAL diag_wr_src_out      : t_dp_sosi;
   
+  SIGNAL wr_fifo_usedw        : STD_LOGIC_VECTOR(ceil_log2(c_wr_fifo_depth * c_dp_factor)-1 DOWNTO 0);    
   SIGNAL wr_src_out           : t_dp_sosi;
   SIGNAL wr_val_cnt           : NATURAL := 0;
 
   SIGNAL diag_rd_snk_out      : t_dp_siso;
   SIGNAL diag_rd_snk_in       : t_dp_sosi;
+  SIGNAL rd_fifo_usedw        : STD_LOGIC_VECTOR(ceil_log2(c_rd_fifo_depth * c_dp_factor)-1 DOWNTO 0);    
 
   SIGNAL src_diag_en          : STD_LOGIC;
   SIGNAL src_val_cnt          : STD_LOGIC_VECTOR(31 DOWNTO 0);
@@ -174,7 +174,7 @@ BEGIN
         proc_common_wait_some_cycles(dvr_clk, 1);
         dvr_en        <= '0'; 
         
-        -- ACCESS DONE  
+        -- ACCESS DONE
         proc_common_wait_until_lo_hi(dvr_clk, dvr_done);
         
         IF c_wr_not_rd_arr(I)='0' THEN
@@ -194,8 +194,10 @@ BEGIN
       proc_common_wait_some_cycles(dvr_clk, 1);
       dvr_wr_flush_en <= '0';
       
-      proc_common_wait_some_cycles(ctlr_clk, 500);
-      ASSERT UNSIGNED(dvr_wr_fifo_usedw) = 0      REPORT "[ERROR] Write FIFO is flushed but not empty!" SEVERITY FAILURE;
+      -- Wait until the wr fifo has been flushed and the rd fifo has been read empty
+      proc_common_wait_some_cycles(ctlr_clk, 500*c_dp_factor);
+      ASSERT UNSIGNED(wr_fifo_usedw) = 0          REPORT "[ERROR] Write FIFO is flushed but not empty!" SEVERITY FAILURE;
+      ASSERT UNSIGNED(rd_fifo_usedw) = 0          REPORT "[ERROR] Read FIFO is not empty!" SEVERITY FAILURE;
       ASSERT UNSIGNED(snk_val_cnt) = expected_cnt REPORT "[ERROR] Unexpected number of read data!" SEVERITY FAILURE;
       
       -- Restart diagnostics source and sink
@@ -211,7 +213,7 @@ BEGIN
 
   u_diagnostics: ENTITY diagnostics_lib.diagnostics 
   GENERIC MAP (
-    g_dat_w             => c_dp_data_w,
+    g_dat_w             => g_dp_data_w,
     g_nof_streams       => 1
      ) 
   PORT MAP (
@@ -263,10 +265,10 @@ BEGIN
     g_technology             => g_technology,
     g_tech_ddr               => c_tech_ddr,
     g_cross_domain_dvr_ctlr  => c_cross_domain_dvr_ctlr,
-    g_wr_data_w              => c_dp_data_w,
+    g_wr_data_w              => g_dp_data_w,
     g_wr_fifo_depth          => c_wr_fifo_depth,  -- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
     g_rd_fifo_depth          => c_rd_fifo_depth,  -- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO. 
-    g_rd_data_w              => c_dp_data_w,
+    g_rd_data_w              => g_dp_data_w,
     g_wr_flush_mode          => g_wr_flush_mode,
     g_wr_flush_use_channel   => FALSE,
     g_wr_flush_start_channel => 0,
@@ -293,22 +295,24 @@ BEGIN
     dvr_start_addr     => dvr_start_addr,
     dvr_end_addr       => dvr_end_addr,
     dvr_wr_flush_en    => dvr_wr_flush_en,
-    dvr_wr_fifo_usedw  => dvr_wr_fifo_usedw,
     
     -- Write FIFO clock domain
     wr_clk             => dp_clk,
     wr_rst             => dp_rst,
 
+    wr_fifo_usedw      => wr_fifo_usedw,
     wr_sosi            => wr_src_out, 
     wr_siso            => diag_wr_src_in,
   
     -- Read FIFO clock domain
-    rd_sosi            => diag_rd_snk_in,
-    rd_siso            => diag_rd_snk_out,
-
     rd_clk             => dp_clk,
     rd_rst             => dp_rst,
 
+    rd_fifo_usedw      => rd_fifo_usedw,
+    rd_sosi            => diag_rd_snk_in,
+    rd_siso            => diag_rd_snk_out,
+
+    -- DDR PHY external interface
     phy_ou             => phy_ou,
     phy_io             => phy_io,
     phy_in             => phy_in
diff --git a/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd
index ac4f8ff367..ca347012eb 100644
--- a/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd
@@ -43,14 +43,17 @@ BEGIN
   -- g_ctlr_ref_clk_period  : TIME := 5 ns;     -- 200 MHz
   -- g_dvr_clk_period       : TIME := 20 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_nof_repeat           : NATURAL := 2;
   -- g_wr_flush_mode        : STRING := "SYN"  -- "VAL", "SOP", "SYN"
 
-  u_fill_wrfifo_on_next_valid     : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns, 5 ns, 5 ns, 2, "VAL");
-  u_fill_wrfifo_on_next_sop       : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns, 5 ns, 5 ns, 2, "SOP");
-  u_fill_wrfifo_on_next_sync      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns, 5 ns, 5 ns, 2, "SYN");
+  u_fill_wrfifo_on_next_valid     : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  5 ns, 5 ns, 256, 2, "VAL");
+  u_fill_wrfifo_on_next_sop       : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  5 ns, 5 ns, 256, 2, "SOP");
+  u_fill_wrfifo_on_next_sync      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  5 ns, 5 ns, 256, 2, "SYN");
   
-  u_cross_dvr_to_faster_ctlr      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns, 20 ns, 5 ns, 1, "VAL");
-  u_cross_dvr_to_slower_ctlr      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  1 ns, 5 ns, 1, "VAL");
+  u_mixed_width                   : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  5 ns, 5 ns,  32, 1, "VAL");
+  
+  u_cross_dvr_to_faster_ctlr      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns, 20 ns, 5 ns, 256, 1, "VAL");
+  u_cross_dvr_to_slower_ctlr      : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, 5 ns,  1 ns, 5 ns, 256, 1, "VAL");
   
 END tb;
-- 
GitLab