diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd index 11271b1537b61de03e096f7ee3d0cfbf0230dc58..61b1c01df6f6f939664998cdeec1002c4364b1dc 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd @@ -51,13 +51,16 @@ ARCHITECTURE tb OF tb_ddrctrl IS CONSTANT c_in_data_w : NATURAL := g_nof_streams * g_data_w; -- output data with, 168 CONSTANT c_out_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); -- output data vector with, 576 + CONSTANT c_adr_w : NATURAL := 4; + CONSTANT c_max_adr : NATURAL := 2**c_adr_w-1; FUNCTION c_total_vector_init RETURN STD_LOGIC_VECTOR IS VARIABLE temp : STD_LOGIC_VECTOR(c_in_data_w*g_sim_lengt-1 DOWNTO 0); BEGIN - FOR I IN 0 TO g_sim_lengt-1 LOOP - temp(c_in_data_w*(I+1)-1 DOWNTO c_in_data_w*I) := TO_UVEC(I, c_in_data_w); + --temp(c_out_data_w-1 DOWNTO 0) := (OTHERS => '0'); + FOR I IN 0 TO g_sim_lengt*g_nof_streams-1 LOOP + temp(g_data_w*(I+1)-1 DOWNTO g_data_w*I) := TO_UVEC(I, g_data_w); END LOOP; RETURN temp; END FUNCTION c_total_vector_init; @@ -65,11 +68,11 @@ ARCHITECTURE tb OF tb_ddrctrl IS - SIGNAL ctr_of : NATURAL := 0; -- signal which contains the amount of overflow for checking SIGNAL in_data_cnt : NATURAL := 0; SIGNAL test_running : STD_LOGIC := '0'; -- signal to tell when the testing has started SIGNAL tb_end : STD_LOGIC := '0'; -- signal to turn the testbench off + SIGNAL lag_due_reset : NATURAL := 0; SIGNAL clk : STD_LOGIC := '1'; -- clock signal @@ -77,15 +80,19 @@ ARCHITECTURE tb OF tb_ddrctrl IS SIGNAL in_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init); -- input signal for ddrctrl_pack.vhd SIGNAL out_of : NATURAL := 0; -- output signal from ddrctrl_repack to determen how high the overflow is - SIGNAL out_mosi : t_mem_ctlr_mosi; -- output signal from ddrctrl_pack.vhd + SIGNAL out_mosi : t_mem_ctlr_mosi := c_mem_ctlr_mosi_rst; -- output signal from ddrctrl_pack.vhd BEGIN clk <= NOT clk OR tb_end AFTER c_clk_period/2; -- generating clock signal - p_mm : PROCESS + p_test : PROCESS BEGIN + fill_in_sosi_arr_1 : FOR I IN 0 TO g_nof_streams-1 LOOP + in_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= c_total_vector(g_data_w*(I+1)-1 DOWNTO g_data_w*I); + END LOOP; + -- Start the testbench. tb_end <= '0'; WAIT UNTIL rising_edge(clk); -- align to rising edge @@ -93,28 +100,40 @@ BEGIN WAIT UNTIL out_of = 0; -- align to ddrctrl_repack test_running <= '1'; -- start of test - -- The input data vectors get filled with the corresponding numbers. - make_data : FOR J IN 0 TO g_sim_lengt-1 LOOP + WAIT FOR c_clk_period*1; + make_data : FOR J IN 1 TO g_sim_lengt-1 LOOP fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP - in_sosi_arr(I).data(c_in_data_w - 1 DOWNTO 0) <= c_total_vector(c_in_data_w*(I+1)+(J+1)-1 DOWNTO c_in_data_w*I+(J+1)); + in_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w); END LOOP; - WAIT FOR c_clk_period*1; in_data_cnt <= in_data_cnt + 1; + WAIT FOR c_clk_period*1; END LOOP; test_running <= '0'; - -- Stop the testbench. WAIT FOR c_clk_period*4; tb_end <= '1'; - WAIT; END PROCESS; + + p_test_reset : PROCESS + BEGIN + + WAIT FOR c_clk_period*32; + rst <= '1'; + lag_due_reset <= TO_UINT(out_mosi.address)+1; + WAIT FOR c_clk_period*1; + rst <= '0'; + WAIT; + END PROCESS; + + + -- Verification by checking if the input vectors are correctly put into the output vector and the amount of overflow is as expected. - p_verify : PROCESS + p_verify_of_data : PROCESS VARIABLE ctr_of : NATURAL := 0; VARIABLE out_data_cnt : NATURAL := 0; @@ -122,19 +141,36 @@ BEGIN BEGIN WAIT UNTIL rising_edge(out_mosi.wr); - --WAIT FOR c_clk_period*1; + + IF test_running = '1' THEN - -- ASSERT FALSE REPORT "ik werk" SEVERITY NOTE; - IF out_data_cnt mod 2 = 0 THEN - ctr_of := c_in_data_w*in_data_cnt-c_out_data_w*(out_data_cnt); - ASSERT ctr_of = out_of REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) SEVERITY ERROR; + IF out_data_cnt > 0 THEN + IF out_data_cnt mod 2 = 0 THEN + ctr_of := c_in_data_w*in_data_cnt-c_out_data_w*out_data_cnt; + ASSERT ctr_of = out_of REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) SEVERITY ERROR; + END IF; + ASSERT out_mosi.wrdata(c_out_data_w -1 DOWNTO 0) = c_total_vector(c_out_data_w*(out_data_cnt)-1 DOWNTO c_out_data_w*(out_data_cnt-1)) REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt) SEVERITY ERROR; END IF; - ASSERT out_mosi.wrdata(c_out_data_w -1 DOWNTO 0) = c_total_vector(c_out_data_w*(out_data_cnt+1)-1 DOWNTO c_out_data_w*out_data_cnt) REPORT "Data does not match, out_data_cnt = " & NATURAL'image(out_data_cnt) SEVERITY ERROR; out_data_cnt := out_data_cnt + 1; END IF; END PROCESS; + p_verify_address : PROCESS + BEGIN + FOR I IN 0 TO c_max_adr LOOP + WAIT UNTIL rising_edge(out_mosi.wr); + IF I >= lag_due_reset THEN + ASSERT I-lag_due_reset = TO_UINT(out_mosi.address) REPORT "Wrong address, 1, I = " & NATURAL'image(I-lag_due_reset) SEVERITY ERROR; + ELSE + ASSERT I+c_max_adr-lag_due_reset+1 = TO_UINT(out_mosi.address) REPORT "Wrong address, 2, I = " & NATURAL'image(I+c_max_adr-lag_due_reset+1) SEVERITY ERROR; + END IF; + END LOOP; + END PROCESS; + + + + u_ddrctrl_pack : ENTITY work.ddrctrl GENERIC MAP ( g_tech_ddr => g_tech_ddr,