diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd index b7d21e4d26b4e19b8d37746769700675fac59620..331542621cf66037cf10de149c95bc11d70e0a7b 100644 --- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd +++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd @@ -25,7 +25,7 @@ -- - uphy_4g_800_master -- - uphy_4g_800_slave -- --- The DUT can be selected, using the c_tech_ddr constants. +-- The DUT can be selected, using the g_tech_ddr constants. -- -- Testbench is selftesting: -- @@ -47,11 +47,13 @@ USE tech_ddr_lib.tech_ddr_pkg.ALL; ENTITY tb_io_ddr IS GENERIC ( g_technology : NATURAL := c_tech_select_default; + g_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; + --g_tech_ddr : t_c_tech_ddr := c_tech_ddr4_4g_1600m; g_sim : BOOLEAN := TRUE; -- when TRUE use the internal DDR memory model, else use the DDR model in this tb. 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" ); @@ -61,18 +63,19 @@ ARCHITECTURE str of tb_io_ddr IS CONSTANT c_cross_domain_dvr_ctlr : BOOLEAN := g_ctlr_ref_clk_period/=g_dvr_clk_period; - CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; - - 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); + 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); -- DDR access stimuli - -- . write 517 and 507 words and then read back these 1024, to verify that 2 block writes can be readback in 1 block read + -- . write the words in two parts and the read back all these, to verify that 2 block writes can be readback in 1 block read -- . write 1 + 6 words and then readback the 1+1+2+3 = 7 words, in between also write 0 and read back 0 words (to verify that these are indeed void) -- . write 1900 words and read back to verify an access can span more than one DDR address column (a_col_w=10). - CONSTANT c_ctlr_address_lo_arr : t_nat_natural_arr := ( 0, 517, 0, 1, 2, 1, 1, 1, 2, 3, 5, 1900, 1900); - CONSTANT c_ctlr_nof_address_arr : t_nat_natural_arr := (517, 507, 1024, 1, 6, 0, 0, 1, 1, 2, 3, 153, 153); - CONSTANT c_ctlr_wr_not_rd_arr : STD_LOGIC_VECTOR := ('1', '1', '0', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0'); + CONSTANT c_all : NATURAL := 3017; + CONSTANT c_part : NATURAL := c_all/2; + CONSTANT c_rest : NATURAL := c_all-c_part; + CONSTANT c_ctlr_address_lo_arr : t_nat_natural_arr := ( 0, c_part, 0, 1, 2, 1, 1, 1, 2, 3, 5, 1900, 1900); + CONSTANT c_ctlr_nof_address_arr : t_nat_natural_arr := (c_part, c_rest, c_all, 1, 6, 0, 0, 1, 1, 2, 3, 153, 153); + CONSTANT c_ctlr_wr_not_rd_arr : STD_LOGIC_VECTOR := ( '1', '1', '0', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0'); CONSTANT c_dp_factor : NATURAL := c_ctlr_data_w/g_dp_data_w; @@ -159,7 +162,7 @@ BEGIN snk_diag_en <= '1'; -- After reset the write FIFO is flushed until the first write access is started, even when dvr_wr_flush_en='0' - proc_common_wait_some_cycles(ctlr_clk, 100); + proc_common_wait_some_cycles(ctlr_clk, 1000); FOR R IN 0 TO g_nof_repeat-1 LOOP FOR I IN c_ctlr_address_lo_arr'RANGE LOOP @@ -271,7 +274,7 @@ BEGIN u_io_ddr: ENTITY work.io_ddr GENERIC MAP( g_technology => g_technology, - g_tech_ddr => c_tech_ddr, + g_tech_ddr => g_tech_ddr, g_sim => g_sim, -- when TRUE use internal DDR memory model g_cross_domain_dvr_ctlr => c_cross_domain_dvr_ctlr, g_wr_data_w => g_dp_data_w, @@ -327,7 +330,7 @@ BEGIN external_ddr_memory_model : IF g_sim=FALSE GENERATE u_tech_ddr_memory_model : ENTITY tech_ddr_lib.tech_ddr_memory_model GENERIC MAP ( - g_tech_ddr => c_tech_ddr + g_tech_ddr => g_tech_ddr ) PORT MAP ( mem_in => phy_ou, 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 f138f5bee6ef74ab25decbe0e7ac692ae1350754..4fc74d94b59b5dfd3e1bc582966d9f809f90fbd0 100644 --- a/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd +++ b/libraries/io/ddr/tb/vhdl/tb_tb_io_ddr.vhd @@ -25,10 +25,11 @@ -- > as 5 -- > run -all -LIBRARY IEEE, technology_lib; +LIBRARY IEEE, technology_lib, tech_ddr_lib; USE IEEE.std_logic_1164.ALL; USE technology_lib.technology_pkg.ALL; USE technology_lib.technology_select_pkg.ALL; +USE tech_ddr_lib.tech_ddr_pkg.ALL; ENTITY tb_tb_io_ddr IS @@ -37,9 +38,13 @@ END tb_tb_io_ddr; ARCHITECTURE tb OF tb_tb_io_ddr IS + CONSTANT c_technology : NATURAL := c_tech_select_default; + CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; + BEGIN -- g_technology : NATURAL := c_tech_select_default; + -- g_tech_ddr : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; -- g_sim : BOOLEAN := TRUE; -- when TRUE use the internal DDR memory model, else use the DDR model in this tb. -- g_ctlr_ref_clk_period : TIME := 5 ns; -- 200 MHz -- g_dvr_clk_period : TIME := 20 ns; -- 50 ns @@ -48,14 +53,14 @@ BEGIN -- 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, FALSE, 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, FALSE, 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, FALSE, 5 ns, 5 ns, 5 ns, 256, 2, "SYN"); + u_fill_wrfifo_on_next_valid : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 5 ns, 5 ns, 5 ns, 256, 2, "VAL"); + u_fill_wrfifo_on_next_sop : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 5 ns, 5 ns, 5 ns, 256, 2, "SOP"); + u_fill_wrfifo_on_next_sync : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 5 ns, 5 ns, 5 ns, 256, 2, "SYN"); - u_ext_memory_model : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, TRUE, 5 ns, 5 ns, 5 ns, 256, 1, "VAL"); - u_mixed_width : ENTITY work.tb_io_ddr GENERIC MAP (c_tech_select_default, FALSE, 5 ns, 5 ns, 5 ns, 32, 1, "VAL"); + u_ext_memory_model : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, TRUE, 5 ns, 5 ns, 5 ns, 256, 1, "VAL"); + u_mixed_width : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 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, FALSE, 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, FALSE, 5 ns, 1 ns, 5 ns, 256, 1, "VAL"); + u_cross_dvr_to_faster_ctlr : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 5 ns, 20 ns, 5 ns, 256, 1, "VAL"); + u_cross_dvr_to_slower_ctlr : ENTITY work.tb_io_ddr GENERIC MAP (c_technology, c_tech_ddr, FALSE, 5 ns, 1 ns, 5 ns, 256, 1, "VAL"); END tb;