diff --git a/libraries/io/ddr/src/vhdl/mms_io_ddr_diag.vhd b/libraries/io/ddr/src/vhdl/mms_io_ddr_diag.vhd index ec39b0cd88d1875380faf3e41d73171239f005db..236ebeae36608994b6804d83a855e3b30cb779af 100644 --- a/libraries/io/ddr/src/vhdl/mms_io_ddr_diag.vhd +++ b/libraries/io/ddr/src/vhdl/mms_io_ddr_diag.vhd @@ -32,8 +32,9 @@ -- MM --+---------+----------+-- -- -- Remark: --- . The ratio of g_dp_data_w and func_tech_ddr_ctlr_data_w(g_io_tech_ddr)must be a power of 2 due to the mixed width FIFO. By --- using a wider g_dp_data_w the DDR data access rate can be increased to the maximum that is possible for the DDR memory. +-- . The mixed width ratio of g_dp_data_w and ctrl_data_w=func_tech_ddr_ctlr_data_w(g_io_tech_ddr) must be a power of 2 due to the +-- mixed width FIFO. By using a wider g_dp_data_w the DDR data access rate can be increased to the maximum that is possible for +-- the DDR memory. -- - For DDR3 with ctrl_data_w = dq_w * rsl = 64 * 4 = 256 choose g_dp_data_w e.g. 16, 32, 64, 128, 256, 512. -- - For DDR4 with ctrl_data_w = dq_w * rsl = 72 * 8 = 576 choose g_dp_data_w e.g. 18, 36, 72, 144, 288, 576, 1152. -- . The DB RAM gets refilled with new read data from the DDR after the last word has been read via the MM. @@ -56,19 +57,20 @@ USE tech_ddr_lib.tech_ddr_pkg.ALL; ENTITY mms_io_ddr_diag IS GENERIC ( -- System - g_sim_model_ddr : BOOLEAN := FALSE; - g_technology : NATURAL := c_tech_select_default; + g_sim_model_ddr : BOOLEAN := FALSE; + g_technology : NATURAL := c_tech_select_default; - g_dp_data_w : NATURAL := 32; -- DP data width, func_tech_ddr_ctlr_data_w(g_io_tech_ddr)/g_dp_data_w must be a power of 2 due to the mixed width FIFO - g_dp_seq_dat_w : NATURAL := 32; -- >= 1, test sequence data width. Choose g_dp_seq_dat_w <= g_dp_data_w. The seq data gets replicated to fill g_dp_data_w. - g_dp_fifo_depth : NATURAL := 2048; -- defined at DP side of the FIFOs, write FIFO depth and read FIFO depth + g_dp_data_w : NATURAL := 32; -- DP data width, func_tech_ddr_ctlr_data_w(g_io_tech_ddr)/g_dp_data_w must be a power of 2 due to the mixed width FIFO + g_dp_seq_dat_w : NATURAL := 32; -- >= 1, test sequence data width. Choose g_dp_seq_dat_w <= g_dp_data_w. The seq data gets replicated to fill g_dp_data_w. + g_dp_wr_fifo_depth : NATURAL := 2048; -- defined at DP side of the FIFO, choose 256 * (ctrl_data_w/g_dp_data_w) to make full use of M9K which have at least 256 words + g_dp_rd_fifo_depth : NATURAL := 2048; -- defined at DP side of the FIFO, choose 256 * (ctrl_data_w/g_dp_data_w) or factors of 2 more to fit max number of read bursts -- IO_DDR - g_io_tech_ddr : t_c_tech_ddr; + g_io_tech_ddr : t_c_tech_ddr; -- DIAG data buffer - g_db_use_db : BOOLEAN := FALSE; - g_db_buf_nof_data : NATURAL := 1024 -- nof words per data buffer + g_db_use_db : BOOLEAN := FALSE; + g_db_buf_nof_data : NATURAL := 1024 -- nof words per data buffer ); PORT ( --------------------------------------------------------------------------- @@ -98,8 +100,8 @@ ENTITY mms_io_ddr_diag IS reg_io_ddr_miso : OUT t_mem_miso; -- Write / read FIFO status for monitoring purposes (in dp_clk domain) - wr_fifo_usedw : OUT STD_LOGIC_VECTOR(ceil_log2(g_dp_fifo_depth)-1 DOWNTO 0); - rd_fifo_usedw : OUT STD_LOGIC_VECTOR(ceil_log2(g_dp_fifo_depth)-1 DOWNTO 0); + wr_fifo_usedw : OUT STD_LOGIC_VECTOR(ceil_log2(g_dp_wr_fifo_depth)-1 DOWNTO 0); + rd_fifo_usedw : OUT STD_LOGIC_VECTOR(ceil_log2(g_dp_rd_fifo_depth)-1 DOWNTO 0); -- DDR3 pass on termination control from master to slave controller term_ctrl_out : OUT t_tech_ddr3_phy_terminationcontrol; @@ -140,8 +142,8 @@ END mms_io_ddr_diag; ARCHITECTURE str OF mms_io_ddr_diag IS - CONSTANT c_io_wr_fifo_depth : NATURAL := (g_dp_fifo_depth * g_dp_data_w) / func_tech_ddr_ctlr_data_w(g_io_tech_ddr); -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K - CONSTANT c_io_rd_fifo_depth : NATURAL := (g_dp_fifo_depth * g_dp_data_w) / func_tech_ddr_ctlr_data_w(g_io_tech_ddr); -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K + CONSTANT c_io_wr_fifo_depth : NATURAL := (g_dp_wr_fifo_depth * g_dp_data_w) / func_tech_ddr_ctlr_data_w(g_io_tech_ddr); -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K + CONSTANT c_io_rd_fifo_depth : NATURAL := (g_dp_rd_fifo_depth * g_dp_data_w) / func_tech_ddr_ctlr_data_w(g_io_tech_ddr); -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K SIGNAL bg_siso_arr : t_dp_siso_arr(0 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); -- Default xon='1' SIGNAL bg_sosi_arr : t_dp_sosi_arr(0 DOWNTO 0); -- Output SOSI that contains the waveform data