From 0915bb14a67dca5bb294b2ca2366318f349bcd20 Mon Sep 17 00:00:00 2001 From: JobvanWee <wee@astron.nl> Date: Fri, 4 Mar 2022 11:03:09 +0100 Subject: [PATCH] Ready for review. --- .../libraries/ddrctrl/src/vhdl/ddrctrl.vhd | 30 ++++---- .../src/vhdl/ddrctrl_address_counter.vhd | 3 +- .../ddrctrl/src/vhdl/ddrctrl_pack.vhd | 9 +-- .../ddrctrl/src/vhdl/ddrctrl_repack.vhd | 6 +- .../libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd | 76 ++++++++----------- .../tb/vhdl/tb_ddrctrl_address_counter.vhd | 37 ++++----- .../ddrctrl/tb/vhdl/tb_ddrctrl_pack.vhd | 26 +++---- .../ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd | 23 +++--- 8 files changed, 94 insertions(+), 116 deletions(-) diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index 8a75aece94..1eb7a77635 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -45,15 +45,15 @@ USE dp_lib.dp_stream_pkg.ALL; ENTITY ddrctrl IS GENERIC ( g_tech_ddr : t_c_tech_ddr; -- type of memory - g_sim_model : BOOLEAN := TRUE; -- determens if this is a simulation - g_nof_streams : NATURAL := 12; -- number of input streams - g_data_w : NATURAL := 14 -- data with of input data vectors + g_sim_model : BOOLEAN := TRUE; -- determens if this is a simulation + g_nof_streams : NATURAL := 12; -- number of input streams + g_data_w : NATURAL := 14 -- data with of input data vectors ); PORT ( clk : IN STD_LOGIC := '0'; rst : IN STD_LOGIC; in_sosi_arr : IN t_dp_sosi_arr; -- input data - out_of : OUT NATURAL; -- amount of overflow this output + out_of : OUT NATURAL; -- amount of internal overflow this output out_mosi : OUT t_mem_ctlr_mosi -- output data ); END ddrctrl; @@ -62,7 +62,7 @@ END ddrctrl; ARCHITECTURE str OF ddrctrl IS -- constant for readability - CONSTANT c_out_data_w : NATURAL := g_nof_streams*g_data_w; + CONSTANT c_out_data_w : NATURAL := g_nof_streams*g_data_w; -- the input data with for ddrctrl_repack -- signals for connecting the components @@ -81,9 +81,8 @@ BEGIN ) PORT MAP( - clk => clk, - in_sosi_arr => in_sosi_arr, - out_data => data + in_sosi_arr => in_sosi_arr, -- input data + out_data => data -- output data ); @@ -95,22 +94,21 @@ BEGIN ) PORT MAP( clk => clk, - in_data => data, - out_of => out_of, - out_sosi => sosi + in_data => data, -- input data + out_of => out_of, -- amount of internal overflow + out_sosi => sosi -- output data ); -- creates address by counting input valids u_address_counter : ENTITY work.ddrctrl_address_counter GENERIC MAP( - g_tech_ddr => g_tech_ddr, - g_sim_model => g_sim_model + g_tech_ddr => g_tech_ddr, -- type of memory + g_sim_model => g_sim_model -- determens if this is a simulation ) PORT MAP( - clk => clk, rst => rst, - in_sosi => sosi, - out_mosi => out_mosi + in_sosi => sosi, -- input data + out_mosi => out_mosi -- output data ); END str; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd index 2a46b873dc..f8d6c54ed0 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_address_counter.vhd @@ -45,7 +45,6 @@ ENTITY ddrctrl_address_counter IS g_sim_model : BOOLEAN := TRUE -- determens if this is a simulation ); PORT ( - clk : IN STD_LOGIC; rst : IN STD_LOGIC; in_sosi : IN t_dp_sosi; -- input data out_mosi : OUT t_mem_ctlr_mosi := c_mem_ctlr_mosi_rst -- output data @@ -76,7 +75,7 @@ BEGIN IF rst = '1' THEN s_adr <= 0; ELSIF rising_edge(in_sosi.valid) THEN - IF (s_adr = c_max_adr) THEN + IF s_adr = c_max_adr THEN s_adr <= 0; ELSE s_adr <= s_adr + 1; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_pack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_pack.vhd index 2a897961ef..1fde708fef 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_pack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_pack.vhd @@ -34,15 +34,14 @@ USE dp_lib.dp_stream_pkg.ALL; ENTITY ddrctrl_pack IS GENERIC ( - g_nof_streams : POSITIVE := 12; -- number of input streams - g_data_w : NATURAL := 14 -- data with of input data vectors + g_nof_streams : POSITIVE := 12; -- number of input streams + g_data_w : NATURAL := 14 -- data with of input data vectors ); PORT ( - clk : IN STD_LOGIC; - in_sosi_arr : IN t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); -- input data - out_data : OUT STD_LOGIC_VECTOR((g_nof_streams*g_data_w)-1 DOWNTO 0) -- output data + in_sosi_arr : IN t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); -- input data + out_data : OUT STD_LOGIC_VECTOR((g_nof_streams*g_data_w)-1 DOWNTO 0) -- output data ); END ddrctrl_pack; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd index 7157e0b207..0011b9c691 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_repack.vhd @@ -41,9 +41,9 @@ ENTITY ddrctrl_repack IS ); PORT ( clk : IN STD_LOGIC; - in_data : IN STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0); - out_of : OUT NATURAL := 0; - out_sosi : OUT t_dp_sosi := c_dp_sosi_init + in_data : IN STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0); -- input data + out_of : OUT NATURAL := 0; -- amount of internal overflow this output + out_sosi : OUT t_dp_sosi := c_dp_sosi_init -- output data ); END ddrctrl_repack; diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd index 5bbdd33650..18f86c6629 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd @@ -18,7 +18,7 @@ -- ------------------------------------------------------------------------------- -- Author: Job van Wee --- Purpose: Self checking and self-stopping tb for ddrctrl_pack.vhd +-- Purpose: Self checking and self-stopping tb for ddrctrl.vhd -- Usage: -- > run -a @@ -39,7 +39,7 @@ ENTITY tb_ddrctrl IS g_sim_model : BOOLEAN := TRUE; -- determens if this is a simulation g_nof_streams : POSITIVE := 12; -- number of input streams g_data_w : NATURAL := 14; -- data with of input data vectors - g_sim_lengt : NATURAL := 52 + g_sim_length : NATURAL := 52 ); END tb_ddrctrl; @@ -58,16 +58,16 @@ ARCHITECTURE tb OF tb_ddrctrl IS -- function for making total data vector 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); + VARIABLE temp : STD_LOGIC_VECTOR(c_in_data_w*g_sim_length-1 DOWNTO 0); BEGIN - FOR I IN 0 TO g_sim_lengt*g_nof_streams-1 LOOP + FOR I IN 0 TO g_sim_length*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; -- constant for running the test - CONSTANT c_total_vector : STD_LOGIC_VECTOR(c_in_data_w*g_sim_lengt-1 DOWNTO 0) := c_total_vector_init; -- vector which contains all input data vectors to make it easy to fill ctr_vector + CONSTANT c_total_vector : STD_LOGIC_VECTOR(c_in_data_w*g_sim_length-1 DOWNTO 0) := c_total_vector_init; -- vector which contains all input data vectors to make it easy to fill ctr_vector -- input signals for ddrctrl.vhd @@ -96,11 +96,6 @@ BEGIN p_test : PROCESS BEGIN - -- initialize input data for ddrctrl.vhd - 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 test tb_end <= '0'; WAIT UNTIL rising_edge(clk); @@ -109,27 +104,26 @@ BEGIN test_running <= '1'; -- filling the input data vectors with the corresponding numbers - WAIT FOR c_clk_period*1; - make_data : FOR J IN 1 TO g_sim_lengt-1 LOOP + make_data : FOR J IN 0 TO g_sim_length-1 LOOP fill_in_sosi_arr : 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)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w); END LOOP; - in_data_cnt <= in_data_cnt + 1; WAIT FOR c_clk_period*1; + in_data_cnt <= in_data_cnt + 1; END LOOP; test_running <= '0'; -- stopping the testbench - WAIT FOR c_clk_period*4; + WAIT FOR c_clk_period*5; tb_end <= '1'; - ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; + ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; END PROCESS; - -- Excecuting the reset test. + -- excecuting the reset test p_test_reset : PROCESS BEGIN rst <= '0'; - WAIT FOR c_clk_period*g_sim_lengt*3/4; + WAIT FOR c_clk_period*(c_adr_size+3); IF lag_due_reset + TO_UINT(out_mosi.address) >= c_adr_size THEN lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address)-c_adr_size; ELSE @@ -139,26 +133,6 @@ BEGIN WAIT FOR c_clk_period*1; END PROCESS; - -- verifying if the input vectors are correctly put into the output vector and the amount of overflow is as expected - p_verify_of_data : PROCESS - - VARIABLE ctr_of : NATURAL := 0; - VARIABLE out_data_cnt : NATURAL := 0; - - BEGIN - WAIT UNTIL rising_edge(out_mosi.wr); - IF test_running = '1' THEN - 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; - out_data_cnt := out_data_cnt + 1; - END IF; - END PROCESS; - -- verifying if the address is correct by keeping trach of the address p_verify_address : PROCESS BEGIN @@ -168,13 +142,32 @@ BEGIN WAIT UNTIL out_mosi.wr = '1'; END IF; 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) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR; + ASSERT I-lag_due_reset = TO_UINT(out_mosi.address) REPORT "Wrong address, 1, I = " & NATURAL'image(I-lag_due_reset) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR; ELSE - ASSERT (I-lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address) REPORT "Wrong address, 2, I = " & NATURAL'image((I-lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR; + ASSERT (I-lag_due_reset)+c_adr_size = TO_UINT(out_mosi.address) REPORT "Wrong address, 2, I = " & NATURAL'image((I-lag_due_reset)+c_adr_size) & ", address = " & NATURAL'image(TO_UINT(out_mosi.address)) SEVERITY ERROR; END IF; END LOOP; 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 + + VARIABLE ctr_of : NATURAL := 0; + VARIABLE out_data_cnt : NATURAL := 0; + + BEGIN + WAIT UNTIL out_mosi.wr = '1' AND test_running = '1'; + IF out_data_cnt >= 1 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) & ", out_of = " & NATURAL'image(out_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; + out_data_cnt := out_data_cnt+1; + END PROCESS; + + -- DUT u_ddrctrl_pack : ENTITY work.ddrctrl GENERIC MAP ( @@ -192,8 +185,3 @@ BEGIN ); END tb; - - - - - diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd index 14c4720aa3..0f3e4d414a 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_address_counter.vhd @@ -35,7 +35,7 @@ ENTITY tb_ddrctrl_address_counter IS g_tech_ddr : t_c_tech_ddr := c_tech_ddr4_8g_1600m; -- type of memory g_sim_model : BOOLEAN := TRUE; -- determens if this is a simulation - g_sim_lengt : NATURAL := 52 -- determens the lengt of the duration of the test + g_sim_length : NATURAL := 52 -- determens the length of the duration of the test ); END tb_ddrctrl_address_counter; @@ -54,7 +54,7 @@ ARCHITECTURE tb OF tb_ddrctrl_address_counter IS -- input signals for ddrctrl_address_counter.vhd SIGNAL clk : STD_LOGIC := '1'; - SIGNAL rst : STD_LOGIC; + SIGNAL rst : STD_LOGIC := '0'; SIGNAL in_sosi : t_dp_sosi := c_dp_sosi_init; -- signal which is the input for ddrctrl_address_counter.vhd -- output signal from ddrctrl_address_counter.vhd @@ -68,25 +68,25 @@ ARCHITECTURE tb OF tb_ddrctrl_address_counter IS BEGIN - -- Wiring the input signals to the inputs of the testbench. - in_sosi.data(c_data_w-1 DOWNTO 0) <= in_data(c_data_w-1 DOWNTO 0); - in_sosi.valid <= in_data_enable; + -- wiring the input signals to the inputs of the testbench + in_sosi.data(c_data_w-1 DOWNTO 0) <= in_data(c_data_w-1 DOWNTO 0); + in_sosi.valid <= in_data_enable; - -- Generating clock. + -- generating clock clk <= NOT clk OR tb_end AFTER c_clk_period/2; - -- Excecuting the test. + -- excecuting the test p_test : PROCESS BEGIN - -- Initialize inputs. + -- initialize inputs tb_end <= '0'; in_data <= (OTHERS => '0'); in_data_enable <= '0'; WAIT UNTIL rising_edge(clk); - -- Changing inputs to start the address counting. - FOR I IN 0 TO g_sim_lengt-1 LOOP + -- changing inputs to start the address counting + FOR I IN 0 TO g_sim_length-1 LOOP in_data_enable <= '1'; in_data <= NOT in_data; WAIT FOR c_clk_period*1; @@ -94,13 +94,13 @@ BEGIN WAIT FOR c_clk_period*2; END LOOP; - -- Stopping the test. + -- stopping the test WAIT FOR c_clk_period*4; tb_end <= '1'; ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; END PROCESS; - -- Verifying if the data is correct and if valid is correct. + -- verifying if the data is correct and if valid is correct p_verify_data_valid : PROCESS BEGIN WAIT UNTIL rising_edge(clk); @@ -110,11 +110,11 @@ BEGIN END IF; END PROCESS; - -- Excecuting the reset test. + -- excecuting the reset test p_test_reset : PROCESS BEGIN rst <= '0'; - WAIT FOR c_clk_period*g_sim_lengt*3/4; + WAIT FOR c_clk_period*(c_adr_size+3); IF lag_due_reset + TO_UINT(out_mosi.address) >= c_adr_size THEN lag_due_reset <= lag_due_reset+TO_UINT(out_mosi.address)-c_adr_size; ELSE @@ -140,14 +140,14 @@ BEGIN END LOOP; END PROCESS; - -- DUT. + + -- DUT u_ddrctrl_address_counter : ENTITY work.ddrctrl_address_counter GENERIC MAP ( g_tech_ddr => g_tech_ddr, g_sim_model => g_sim_model ) PORT MAP ( - clk => clk, rst => rst, in_sosi => in_sosi, @@ -155,8 +155,3 @@ BEGIN ); END tb; - - - - - diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_pack.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_pack.vhd index 292219045b..6f81b6cb22 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_pack.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_pack.vhd @@ -35,10 +35,11 @@ USE common_lib.common_pkg.ALL; ENTITY tb_ddrctrl_pack IS GENERIC ( - g_nof_streams : POSITIVE := 12; -- number of input streams - g_data_w : NATURAL := 14 -- data with of input data vectors + g_nof_streams : POSITIVE := 12; -- number of input streams + g_data_w : NATURAL := 14; -- data with of input data vectors + g_sim_length : NATURAL := 52 -- determens the lengt of the duration of the test - ); + ); END tb_ddrctrl_pack; ARCHITECTURE tb OF tb_ddrctrl_pack IS @@ -76,27 +77,27 @@ ARCHITECTURE tb OF tb_ddrctrl_pack IS BEGIN - -- Generating clock. + -- generating clock clk <= NOT clk OR tb_end AFTER c_clk_period/2; - -- Excecuting the test. + -- excecuting the test p_test : PROCESS BEGIN - -- Start the test. + -- starting the test tb_end <= '0'; WAIT UNTIL rising_edge(clk); WAIT FOR c_clk_period*2; - -- The input data vectors get filled with the corresponding number. + -- the input data vectors get filled with the corresponding number fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP in_sosi_arr(I).data(g_data_w - 1 DOWNTO 0) <= c_testv(g_data_w * (I + 1) - 1 DOWNTO g_data_w * I); END LOOP; - -- The numbers get cycled trough the input vectors. - change_in_sosi_arr : FOR J IN 0 TO 4 LOOP + -- the numbers get cycled trough the input vectors + change_in_sosi_arr : FOR J IN 0 TO g_sim_length-1 LOOP WAIT FOR c_clk_period*1; in_sosi_arr(0).data(g_data_w - 1 DOWNTO 0) <= in_sosi_arr(g_nof_streams-1).data(g_data_w - 1 DOWNTO 0); loop_switch_data : FOR I IN 1 TO g_nof_streams-1 LOOP @@ -104,13 +105,13 @@ BEGIN END LOOP; END LOOP; - -- Stopping the testbench. + -- stopping the testbench WAIT FOR c_clk_period*4; tb_end <= '1'; ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; END PROCESS; - -- Verification by checking if the input vectors equel the corresponding index of the output vector. + -- verification by checking if the input vectors equel the corresponding index of the output vector p_verify : PROCESS BEGIN WAIT UNTIL rising_edge(clk); @@ -121,14 +122,13 @@ BEGIN END IF; END PROCESS; - -- DUT. + -- DUT u_ddrctrl_pack : ENTITY work.ddrctrl_pack GENERIC MAP ( g_nof_streams => g_nof_streams, g_data_w => g_data_w ) PORT MAP ( - clk => clk, in_sosi_arr => in_sosi_arr, out_data => out_data diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd index c9542f7ed5..ce51bf4b8e 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl_repack.vhd @@ -77,7 +77,6 @@ ARCHITECTURE tb OF tb_ddrctrl_repack IS SIGNAL tb_end : STD_LOGIC := '0'; -- signal to turn the testbench off -- singals for running the test - SIGNAL ctr_of : NATURAL := 0; -- signal which contains the amount of overflow for checking SIGNAL in_data_cnt : NATURAL := 0; -- signal which contains the amount of times there has been input data for ddrctrl_repack.vhd SIGNAL test_running : STD_LOGIC := '0'; -- signal to tell wheter the testing has started @@ -108,28 +107,28 @@ BEGIN -- stopping the testbench WAIT FOR c_clk_period*5; tb_end <= '1'; - ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; + ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; 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 - VARIABLE ctr_of : NATURAL := 0; - VARIABLE out_data_cnt : NATURAL := 0; + VARIABLE ctr_of : NATURAL := 0; + VARIABLE out_data_cnt : NATURAL := 0; BEGIN - WAIT UNTIL rising_edge(out_sosi.valid); - IF test_running = '1' THEN - IF out_data_cnt mod 2 = 1 THEN - ctr_of := g_in_data_w*in_data_cnt-c_out_data_w*(out_data_cnt+1); - ASSERT ctr_of = out_of REPORT "The amount of overflow does not match, ctr_of = " & NATURAL'image(ctr_of) SEVERITY ERROR; + WAIT UNTIL out_sosi.valid = '1' AND test_running = '1'; + IF out_data_cnt >= 1 THEN + IF out_data_cnt mod 2 = 0 THEN + ctr_of := g_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) & ", out_of = " & NATURAL'image(out_of) SEVERITY ERROR; END IF; - ASSERT out_sosi.data(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; + ASSERT out_sosi.data(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; + out_data_cnt := out_data_cnt+1; END PROCESS; + -- DUT u_ddrctrl_repack : ENTITY work.ddrctrl_repack GENERIC MAP ( -- GitLab