diff --git a/libraries/base/reorder/tb/vhdl/tb_reorder_transpose.vhd b/libraries/base/reorder/tb/vhdl/tb_reorder_transpose.vhd index 708a8e5412b4b2f9c4eec7402ad1c55598af36e1..c8af8bd15e2870b7eecd5e6ea3217060397f3a76 100644 --- a/libraries/base/reorder/tb/vhdl/tb_reorder_transpose.vhd +++ b/libraries/base/reorder/tb/vhdl/tb_reorder_transpose.vhd @@ -56,7 +56,9 @@ ENTITY tb_reorder_transpose IS g_rd_nof_chunks : POSITIVE := 4; g_gapsize : NATURAL := 0; g_nof_blocks : POSITIVE := 4; - g_nof_blk_per_sync : POSITIVE := 64 + g_nof_blk_per_sync : POSITIVE := 64; + g_nof_streams : POSITIVE := 4; + g_in_dat_w : POSITIVE := 8 ); END tb_reorder_transpose; @@ -78,6 +80,8 @@ ARCHITECTURE tb OF tb_reorder_transpose IS SIGNAL dp_rst : STD_LOGIC; SIGNAL dp_clk : STD_LOGIC := '0'; + SIGNAL dp_rst_in : STD_LOGIC; + SIGNAL dp_clk_in : STD_LOGIC := '0'; ---------------------------------------------------------------------------- -- MM buses @@ -122,35 +126,46 @@ ARCHITECTURE tb OF tb_reorder_transpose IS END COMPONENT; -- Compose the Constants for the DUT - CONSTANT c_reorder_seq_conf : t_reorder_seq := (g_wr_chunksize, - g_wr_nof_chunks, - g_rd_chunksize, - g_rd_nof_chunks, - g_gapsize, - g_nof_blocks); + CONSTANT c_reorder_seq_conf : t_reorder_seq := (g_wr_chunksize, + g_wr_nof_chunks, + g_rd_chunksize, + g_rd_nof_chunks, + g_gapsize, + g_nof_blocks); - CONSTANT c_blocksize : POSITIVE := g_wr_nof_chunks * g_wr_chunksize; - CONSTANT c_page_size : POSITIVE := c_blocksize * g_nof_blocks; - - CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; - - CONSTANT c_data_w : NATURAL := 64; - - CONSTANT c_ctrl_ref_clk_period : TIME := 5000 ps; + CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; + + CONSTANT c_min_fifo_size : POSITIVE := 256; + CONSTANT c_blocksize : POSITIVE := c_reorder_seq.wr_nof_chunks * (c_reorder_seq.wr_chunksize + c_reorder_seq.gapsize); + CONSTANT c_pagesize : POSITIVE := c_reorder_seq.nof_blocks * c_blocksize; + CONSTANT c_mem_size : POSITIVE := 2*c_pagesize; + CONSTANT c_mem_size_w : POSITIVE := ceil_log2(c_mem_size); + + CONSTANT c_wr_fifo_depth : NATURAL := sel_a_b(c_blocksize > c_min_fifo_size, c_blocksize, c_min_fifo_size);--c_blocksize * 2; + CONSTANT c_rd_fifo_depth : NATURAL := sel_a_b(c_blocksize > c_min_fifo_size, c_blocksize, c_min_fifo_size);--c_blocksize * 2; + + + CONSTANT c_use_complex : BOOLEAN := TRUE; + CONSTANT c_total_data_w : NATURAL := g_nof_streams*g_in_dat_w; + CONSTANT c_complex_data_w : NATURAL := c_total_data_w*c_nof_complex; + CONSTANT c_data_w : NATURAL := sel_a_b(c_use_complex, c_complex_data_w, c_total_data_w); + + + CONSTANT c_ctrl_ref_clk_period : TIME := 5000 ps; -- Custom definitions of constants CONSTANT c_bg_block_len : NATURAL := c_blocksize * g_rd_chunksize; CONSTANT c_db_block_len : NATURAL := c_blocksize * g_rd_chunksize; -- Configuration of the block generator: - CONSTANT c_bg_nof_output_streams : POSITIVE := 4; - CONSTANT c_bg_buf_dat_w : POSITIVE := c_nof_complex*8; + CONSTANT c_bg_nof_output_streams : POSITIVE := g_nof_streams; + CONSTANT c_bg_buf_dat_w : POSITIVE := c_nof_complex*g_in_dat_w; CONSTANT c_bg_buf_adr_w : POSITIVE := ceil_log2(c_bg_block_len); CONSTANT c_bg_data_file_prefix : STRING := "UNUSED"; -- "../../../src/hex/tb_bg_dat"; CONSTANT c_bg_data_file_index_arr : t_nat_natural_arr := array_init(0, 128, 1); -- Configuration of the databuffers: - CONSTANT c_db_nof_streams : POSITIVE := 4; + CONSTANT c_db_nof_streams : POSITIVE := g_nof_streams; CONSTANT c_db_data_w : POSITIVE := c_diag_db_max_data_w; CONSTANT c_db_buf_nof_data : POSITIVE := c_db_block_len; CONSTANT c_db_buf_use_sync : BOOLEAN := FALSE; @@ -163,10 +178,19 @@ ARCHITECTURE tb OF tb_reorder_transpose IS SIGNAL out_sosi_arr : t_dp_sosi_arr(c_bg_nof_output_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL out_siso_arr : t_dp_siso_arr(c_bg_nof_output_streams-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy); - -- Signals to interface with the DDR3 memory model. - SIGNAL phy_in : t_tech_ddr_phy_in; - SIGNAL phy_io : t_tech_ddr_phy_io; - SIGNAL phy_ou : t_tech_ddr_phy_ou; + -- Signals to interface with the DDR conroller and memory model. + SIGNAL ctlr_dvr_miso : t_mem_ctlr_miso; + SIGNAL ctlr_dvr_mosi : t_mem_ctlr_mosi; + + SIGNAL to_mem_siso : t_dp_siso := c_dp_siso_rdy; + SIGNAL to_mem_sosi : t_dp_sosi; + SIGNAL from_mem_siso : t_dp_siso := c_dp_siso_rdy; + SIGNAL from_mem_sosi : t_dp_sosi; + + SIGNAL phy_in : t_tech_ddr_phy_in; + SIGNAL phy_io : t_tech_ddr_phy_io; + SIGNAL phy_ou : t_tech_ddr_phy_ou; + BEGIN @@ -176,8 +200,8 @@ BEGIN mm_clk <= NOT mm_clk AFTER c_mm_clk_period/2; mm_rst <= '1', '0' AFTER c_mm_clk_period*5; - dp_clk <= NOT dp_clk AFTER c_dp_clk_period/2; - dp_rst <= '1', '0' AFTER c_dp_clk_period*5; + dp_clk_in <= NOT dp_clk_in AFTER c_dp_clk_period/2; + dp_rst_in <= '1', '0' AFTER c_dp_clk_period*5; ------------------------------------------------------------------------------ -- External PPS @@ -249,14 +273,13 @@ BEGIN u_dut: ENTITY work.reorder_transpose GENERIC MAP( g_sim => c_sim, - g_technology => c_tech_select_default, g_tech_ddr => c_tech_ddr, g_nof_streams => c_bg_nof_output_streams, g_in_dat_w => c_bg_buf_dat_w/c_nof_complex, g_frame_size_in => g_wr_chunksize, g_frame_size_out => g_wr_chunksize, g_nof_blk_per_sync => g_nof_blk_per_sync, - g_use_complex => TRUE, + g_use_complex => c_use_complex, g_ena_pre_transp => FALSE, g_reorder_seq => c_reorder_seq_conf ) @@ -266,25 +289,84 @@ BEGIN dp_rst => dp_rst, dp_clk => dp_clk, - + + -- ST sink snk_out_arr => bg_siso_arr, snk_in_arr => bg_sosi_arr, + -- ST source src_in_arr => out_siso_arr, src_out_arr => out_sosi_arr, ram_ss_ss_transp_mosi => ram_ss_ss_transp_mosi, ram_ss_ss_transp_miso => ram_ss_ss_transp_miso, + + -- Control interface to the external memory + dvr_miso => ctlr_dvr_miso, + dvr_mosi => ctlr_dvr_mosi, + + -- Data interface to the external memory + to_mem_src_out => to_mem_sosi, + to_mem_src_in => to_mem_siso, - ser_term_ctrl_out => OPEN, - par_term_ctrl_out => OPEN, - - ser_term_ctrl_in => OPEN, - par_term_ctrl_in => OPEN, - - phy_in => phy_in, - phy_io => phy_io, - phy_ou => phy_ou + from_mem_snk_in => from_mem_sosi, + from_mem_snk_out => from_mem_siso + + ); + + u_ddr_mem_ctrl : ENTITY io_ddr_lib.io_ddr + GENERIC MAP( + g_sim => c_sim, + g_technology => c_tech_select_default, -- : NATURAL := c_tech_select_default; + g_tech_ddr => c_tech_ddr, -- : t_c_tech_ddr; + g_cross_domain_dvr_ctlr => FALSE, --TRUE, -- : BOOLEAN := TRUE; + g_wr_data_w => c_data_w, -- : NATURAL := 32; + g_wr_fifo_depth => c_wr_fifo_depth, -- : NATURAL := 128; -- >=16 , defined at DDR side of the FIFO. + g_rd_fifo_depth => c_rd_fifo_depth, -- : NATURAL := 256; -- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO. + g_rd_data_w => c_data_w, -- : NATURAL := 32; + g_wr_flush_mode => "SYN", -- : STRING := "VAL"; -- "VAL", "SOP", "SYN" + g_wr_flush_use_channel => FALSE, -- : BOOLEAN := FALSE; + g_wr_flush_start_channel => 0, -- : NATURAL := 0; + g_wr_flush_nof_channels => 1 -- : POSITIVE := 1 + ) + PORT MAP ( + -- DDR reference clock + ctlr_ref_clk => dp_clk_in, + ctlr_ref_rst => dp_rst_in, + + -- DDR controller clock domain + ctlr_clk_out => dp_clk, -- output clock of the ddr controller is used as DP clk. + ctlr_rst_out => dp_rst, + + ctlr_clk_in => dp_clk, + ctlr_rst_in => dp_rst, + + -- Driver clock domain + dvr_clk => dp_clk, + dvr_rst => dp_rst, + + dvr_miso => ctlr_dvr_miso, + dvr_mosi => ctlr_dvr_mosi, + + -- Write FIFO clock domain + wr_clk => dp_clk, + wr_rst => dp_rst, + + wr_fifo_usedw => OPEN, + wr_sosi => to_mem_sosi, + wr_siso => to_mem_siso, + + -- Read FIFO clock domain + rd_clk => dp_clk, + rd_rst => dp_rst, + + rd_fifo_usedw => OPEN, + rd_sosi => from_mem_sosi, + rd_siso => from_mem_siso, + + phy_in => phy_in, + phy_io => phy_io, + phy_ou => phy_ou ); external_ddr_memory_model : IF c_sim=FALSE GENERATE