diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd index ef138ef401394ac4bc761ad43bb35c2141114224..56f91879bf03794f81ad23870ae24cf2e45d1b9b 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -108,26 +108,28 @@ ARCHITECTURE str OF sdp_statistics_offload IS CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type); CONSTANT c_mm_step_size : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type); CONSTANT c_mm_nof_data : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type); + CONSTANT c_mm_ram_size : NATURAL := c_mm_nof_data * c_mm_data_size * c_nof_packets_max; -- offload control TYPE t_reg IS RECORD - packet_count : NATURAL; - start_address : NATURAL; + packet_count : NATURAL RANGE 0 TO c_nof_packets_max; + start_address : NATURAL RANGE 0 TO c_mm_ram_size; start_pulse : STD_LOGIC; dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0); payload_err : STD_LOGIC; in_sop_cnt : NATURAL; integration_interval : NATURAL; interleave_count : NATURAL RANGE 0 TO c_sdp_Q_fft; + interleave_address : NATURAL RANGE 0 TO c_mm_ram_size; crosslet_count : NATURAL RANGE 0 TO c_sdp_N_crosslets_max; instance_count : NATURAL RANGE 0 TO c_sdp_P_sq; - instance_address : NATURAL; + instance_address : NATURAL RANGE 0 TO c_mm_ram_size; nof_crosslets : NATURAL RANGE 0 TO c_sdp_N_crosslets_max; crosslets_info_rec : t_sdp_crosslets_info; END RECORD; CONSTANT c_crosslets_info_rst : t_sdp_crosslets_info := (offset_arr => (OTHERS => 0), step => 0); - CONSTANT c_reg_rst : t_reg := (0, 0, '0', (OTHERS => '0'), '0', 0, 0, 0, 0, 0, 0, 0, c_crosslets_info_rst); + CONSTANT c_reg_rst : t_reg := (0, 0, '0', (OTHERS => '0'), '0', 0, 0, 0, 0, 0, 0, 0, 0, c_crosslets_info_rst); SIGNAL r : t_reg; SIGNAL nxt_r : t_reg; @@ -158,6 +160,18 @@ ARCHITECTURE str OF sdp_statistics_offload IS SIGNAL bsn_at_sync : STD_LOGIC_VECTOR(63 DOWNTO 0) := (OTHERS => '0'); SIGNAL dp_header_info : STD_LOGIC_VECTOR(1023 DOWNTO 0):= (OTHERS => '0'); + -- Debug signals for view in Wave window + SIGNAL dbg_c_marker : NATURAL := c_marker; + SIGNAL dbg_c_nof_signal_inputs : NATURAL := c_nof_signal_inputs; + SIGNAL dbg_c_nof_statistics_per_packet : NATURAL := c_nof_statistics_per_packet; + SIGNAL dbg_c_udp_total_length : NATURAL := c_udp_total_length; + SIGNAL dbg_c_ip_total_length : NATURAL := c_ip_total_length; + SIGNAL dbg_c_nof_packets_max : NATURAL := c_nof_packets_max; + SIGNAL dbg_c_beamlet_id : NATURAL := c_beamlet_id; + SIGNAL dbg_c_mm_data_size : NATURAL := c_mm_data_size; + SIGNAL dbg_c_mm_step_size : NATURAL := c_mm_step_size; + SIGNAL dbg_c_mm_nof_data : NATURAL := c_mm_nof_data; + BEGIN bsn_at_sync <= RESIZE_UVEC(in_sosi.bsn, 64) WHEN rising_edge(dp_clk) AND in_sosi.sync = '1'; @@ -286,13 +300,14 @@ BEGIN -- Issue start_pulse per packet offload IF trigger_offload = '1' THEN -- Use trigger_offload to start first packet offload, all g_statistics_type start from start address 0 - v.start_pulse := '1'; - v.start_address := 0; - v.packet_count := 0; - v.interleave_count := 0; -- only used for SST - v.crosslet_count := 0; -- only used for XST - v.instance_count := 0; -- only used for XST - v.instance_address := 0; -- only used for XST + v.start_pulse := '1'; + v.start_address := 0; + v.packet_count := 0; + v.interleave_count := 0; -- only used for SST + v.interleave_address := 0; -- only used for SST + v.crosslet_count := 0; -- only used for XST + v.instance_count := 0; -- only used for XST + v.instance_address := 0; -- only used for XST ELSIF mm_done = '1' THEN -- Use mm_done to start next packets offloads. @@ -303,8 +318,10 @@ BEGIN v.start_address := r.start_address + c_mm_data_size; -- default step to next packet in this step v.interleave_count := r.interleave_count + 1; IF r.interleave_count = c_sdp_Q_fft - 1 THEN - v.start_address := r.packet_count * c_sdp_N_sub * c_sdp_Q_fft * c_sdp_W_statistic_sz; -- jump to first packet for next step + -- jump to first packet for next step, + v.start_address := r.interleave_address + c_sdp_N_sub * c_sdp_Q_fft * c_sdp_W_statistic_sz; -- = + 512 * 2 * 2 = + 2048 v.interleave_count := 0; + v.interleave_address := v.start_address; END IF; v.start_pulse := '1'; v.packet_count := r.packet_count + 1; diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd index 8aebbf2dac663a51a35744457c222b43655c8540..33b59b65c850bef7be1f1f6503e2b333b343bac1 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd @@ -139,10 +139,11 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS SIGNAL in_crosslets_info_rec : t_sdp_crosslets_info; SIGNAL in_crosslets_info_slv : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0); - SIGNAL offload_data : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL offload_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit SIGNAL offload_sosi : t_dp_sosi; SIGNAL offload_siso : t_dp_siso := c_dp_siso_rst; + SIGNAL test_offload_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); -- 32 bit SIGNAL test_offload_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL test_offload_en : STD_LOGIC := '0'; SIGNAL test_offload_sop_cnt : NATURAL; @@ -577,6 +578,7 @@ BEGIN ASSERT c_crosslets_info_rec = func_sdp_map_crosslets_info(c_crosslets_info_slv) REPORT "Error in func_sdp_map_crosslets_info()" SEVERITY FAILURE; -- To view the 32 bit 1GbE offload data more easily in the Wave window - offload_data <= offload_sosi.data(31 DOWNTO 0); + offload_data <= offload_sosi.data(c_word_w-1 DOWNTO 0); + test_offload_data <= test_offload_sosi.data(c_word_w-1 DOWNTO 0); END tb; diff --git a/libraries/base/dp/src/vhdl/dp_block_from_mm_dc.vhd b/libraries/base/dp/src/vhdl/dp_block_from_mm_dc.vhd index bb061f3bd196a17361a220bc9eb2a6806fab28f2..cdf640ced48b4b93bd1906b931864646998525b6 100644 --- a/libraries/base/dp/src/vhdl/dp_block_from_mm_dc.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_from_mm_dc.vhd @@ -62,9 +62,11 @@ ARCHITECTURE str OF dp_block_from_mm_dc IS CONSTANT c_packet_size : NATURAL := g_nof_data * g_data_size; -- 512 * 2 = 1024 words. CONSTANT c_fifo_size : NATURAL := c_packet_size * 2; CONSTANT c_start_addr_w : NATURAL := c_natural_w; + CONSTANT c_delay_len : NATURAL := c_meta_delay_len; SIGNAL mm_fifo_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL mm_fifo_siso : t_dp_siso; + SIGNAL start_pulse_dly : STD_LOGIC_VECTOR(0 TO c_delay_len) := (OTHERS => '0'); SIGNAL mm_start_pulse : STD_LOGIC := '0'; SIGNAL mm_done : STD_LOGIC := '0'; SIGNAL start_address_slv : STD_LOGIC_VECTOR(c_start_addr_w-1 DOWNTO 0) := (OTHERS => '0'); @@ -72,18 +74,22 @@ ARCHITECTURE str OF dp_block_from_mm_dc IS SIGNAL mm_start_address : NATURAL := 0; BEGIN - - p_common_spulse_start_pulse : ENTITY common_lib.common_spulse + -- Use start_pulse_dly to make sure mm_start_address_slv is stable before + -- mm_start_pulse, also when mm_clk is faster than dp_clk (e.g. in sim). + start_pulse_dly(0) <= start_pulse; + start_pulse_dly(1 TO c_delay_len) <= start_pulse_dly(0 TO c_delay_len-1) WHEN rising_edge(dp_clk); + + u_common_spulse_start_pulse : ENTITY common_lib.common_spulse PORT MAP ( in_rst => dp_rst, in_clk => dp_clk, - in_pulse => start_pulse, + in_pulse => start_pulse_dly(c_delay_len), out_rst => mm_rst, out_clk => mm_clk, out_pulse => mm_start_pulse ); - p_common_spulse_mm_done : ENTITY common_lib.common_spulse + u_common_spulse_mm_done : ENTITY common_lib.common_spulse PORT MAP ( in_rst => mm_rst, in_clk => mm_clk, @@ -96,7 +102,10 @@ BEGIN start_address_slv <= TO_UVEC(start_address, c_start_addr_w); mm_start_address <= TO_UINT(mm_start_address_slv); - p_common_async_slv_start_address : ENTITY common_lib.common_async_slv + u_common_async_slv_start_address : ENTITY common_lib.common_async_slv + GENERIC MAP ( + g_delay_len => c_meta_delay_len + ) PORT MAP ( rst => dp_rst, clk => dp_clk, @@ -104,7 +113,7 @@ BEGIN dout => mm_start_address_slv ); - p_dp_fifo_fill_eop : ENTITY work.dp_fifo_fill_eop + u_dp_fifo_fill_eop : ENTITY work.dp_fifo_fill_eop GENERIC MAP ( g_use_dual_clock => TRUE, g_data_w => c_word_w, @@ -124,7 +133,7 @@ BEGIN src_in => out_siso ); - p_dp_block_from_mm : ENTITY work.dp_block_from_mm + u_dp_block_from_mm : ENTITY work.dp_block_from_mm GENERIC MAP ( g_data_size => g_data_size, g_step_size => g_step_size,