diff --git a/boards/uniboard2/designs/unb2_test/src/vhdl/unb2_test.vhd b/boards/uniboard2/designs/unb2_test/src/vhdl/unb2_test.vhd index a2b2573d3fe5c47537a708c42824a4c3f5374a5c..0b7b33c4a041a42e6eac6d535d400c2fd6ec483b 100644 --- a/boards/uniboard2/designs/unb2_test/src/vhdl/unb2_test.vhd +++ b/boards/uniboard2/designs/unb2_test/src/vhdl/unb2_test.vhd @@ -174,10 +174,13 @@ ARCHITECTURE str OF unb2_test IS CONSTANT c_data_w_64 : NATURAL := c_xgmii_data_w; -- 10GbE -- ddr + CONSTANT c_ddr_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(g_ddr_MB_I); -- = 576, assume both MB_I and MB_II use the same ctlr_data_w CONSTANT c_ddr_dp_data_w : NATURAL := 144; -- DDR4 with dq_w = 72, rsl = 8 so ctrl data width = 576 and therefore the mixed width FIFO ratio is 576 /144 = 4 - CONSTANT c_ddr_dp_seq_dat_w : NATURAL := 17; -- >= 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. - CONSTANT c_ddr_dp_fifo_depth : NATURAL := 2048; -- >= 2048, write FIFO depth and read FIFO depth at DP side of the FIFOs + CONSTANT c_ddr_dp_seq_dat_w : NATURAL := 16; -- >= 1, test sequence data width. Choose c_ddr_dp_seq_dat_w <= c_ddr_dp_data_w. The seq data gets replicated to fill c_ddr_dp_data_w. + CONSTANT c_ddr_dp_wr_fifo_depth : NATURAL := 256 * (c_ddr_ctlr_data_w/c_ddr_dp_data_w); -- 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 + CONSTANT c_ddr_dp_rd_fifo_depth : NATURAL := 256 * (c_ddr_ctlr_data_w/c_ddr_dp_data_w); -- 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 CONSTANT c_ddr_db_buf_nof_data : NATURAL := 1024; + CONSTANT c_ddr_mixed_width_ratio : NATURAL := ratio2(c_ddr_ctlr_data_w, c_ddr_dp_data_w); -- Block generator constants CONSTANT c_bg_block_size : NATURAL := 900; @@ -373,6 +376,15 @@ ARCHITECTURE str OF unb2_test IS SIGNAL dp_offload_tx_10GbE_src_in_arr : t_dp_siso_arr(c_nof_streams_10GbE-1 DOWNTO 0); SIGNAL dp_offload_rx_10GbE_snk_in_arr : t_dp_sosi_arr(c_nof_streams_10GbE-1 DOWNTO 0); SIGNAL dp_offload_rx_10GbE_snk_out_arr : t_dp_siso_arr(c_nof_streams_10GbE-1 DOWNTO 0); + + -- DDR4 MB_I and MB_II + SIGNAL dbg_c_ddr_ctlr_data_w : NATURAL := c_ddr_ctlr_data_w; + SIGNAL dbg_c_ddr_dp_data_w : NATURAL := c_ddr_dp_data_w; + SIGNAL dbg_c_ddr_dp_seq_dat_w : NATURAL := c_ddr_dp_seq_dat_w; + SIGNAL dbg_c_ddr_dp_wr_fifo_depth : NATURAL := c_ddr_dp_wr_fifo_depth; + SIGNAL dbg_c_ddr_dp_rd_fifo_depth : NATURAL := c_ddr_dp_rd_fifo_depth; + SIGNAL dbg_c_ddr_db_buf_nof_data : NATURAL := c_ddr_db_buf_nof_data; + SIGNAL dbg_c_ddr_mixed_width_ratio : NATURAL := c_ddr_mixed_width_ratio; SIGNAL reg_io_ddr_MB_I_mosi : t_mem_mosi; SIGNAL reg_io_ddr_MB_I_miso : t_mem_miso; @@ -965,23 +977,30 @@ BEGIN END GENERATE; + ----------------------------------------------------------------------------- + -- Interface : DDR4 MB_I and MB_II + ----------------------------------------------------------------------------- + ASSERT c_ddr_mixed_width_ratio>0 AND is_pow2(c_ddr_mixed_width_ratio) REPORT "unb2_test: DDR4 data widths are not an integer ratio" SEVERITY FAILURE; + ASSERT func_tech_ddr_ctlr_data_w(g_ddr_MB_I)=func_tech_ddr_ctlr_data_w(g_ddr_MB_II) REPORT "unb2_test: DDR4 MB_I and MB_II must have the same ctlr data widths" SEVERITY FAILURE; + gen_stream_MB_I : IF c_use_MB_I = TRUE GENERATE u_mms_io_ddr_diag : ENTITY io_ddr_lib.mms_io_ddr_diag GENERIC MAP ( -- System - g_sim_model_ddr => g_sim_model_ddr, - g_technology => g_technology, + g_sim_model_ddr => g_sim_model_ddr, + g_technology => g_technology, - g_dp_data_w => c_ddr_dp_data_w, -- 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 => c_ddr_dp_seq_dat_w, -- >= 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 => c_ddr_dp_fifo_depth, -- >= 2048, write FIFO depth and read FIFO depth at DP side of the FIFOs + g_dp_data_w => c_ddr_dp_data_w, + g_dp_seq_dat_w => c_ddr_dp_seq_dat_w, + g_dp_wr_fifo_depth => c_ddr_dp_wr_fifo_depth, + g_dp_rd_fifo_depth => c_ddr_dp_rd_fifo_depth, -- IO_DDR - g_io_tech_ddr => g_ddr_MB_I, + g_io_tech_ddr => g_ddr_MB_I, -- DIAG data buffer - g_db_use_db => FALSE, - g_db_buf_nof_data => c_ddr_db_buf_nof_data -- nof words per data buffer + g_db_use_db => FALSE, + g_db_buf_nof_data => c_ddr_db_buf_nof_data -- nof words per data buffer ) PORT MAP ( --------------------------------------------------------------------------- @@ -1048,9 +1067,10 @@ BEGIN g_sim_model_ddr => g_sim_model_ddr, g_technology => g_technology, - g_dp_data_w => c_ddr_dp_data_w, -- 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 => c_ddr_dp_seq_dat_w, -- >= 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 => c_ddr_dp_fifo_depth, -- >= 2048, write FIFO depth and read FIFO depth at DP side of the FIFOs + g_dp_data_w => c_ddr_dp_data_w, + g_dp_seq_dat_w => c_ddr_dp_seq_dat_w, + g_dp_wr_fifo_depth => c_ddr_dp_wr_fifo_depth, + g_dp_rd_fifo_depth => c_ddr_dp_rd_fifo_depth, -- IO_DDR g_io_tech_ddr => g_ddr_MB_II,