diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd index 27239f05789ef3f0a5317ba0408a1dc738ff2609..03f715308242a93f66576406a97ecc7148d20e3d 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -89,9 +89,19 @@ END node_sdp_correlator; ARCHITECTURE str OF node_sdp_correlator IS - CONSTANT c_nof_controllers : POSITIVE := 2; - CONSTANT c_block_size : NATURAL := c_sdp_N_crosslets_max * c_sdp_S_pn; - CONSTANT c_data_w : NATURAL := c_sdp_W_crosslet * c_nof_complex; + CONSTANT c_nof_controllers : POSITIVE := 2; + CONSTANT c_block_size : NATURAL := c_sdp_N_crosslets_max * c_sdp_S_pn; + CONSTANT c_block_size_longwords : NATURAL := ceil_div(c_block_size, 2); -- 32b -> 64b + CONSTANT c_data_w : NATURAL := c_sdp_W_crosslet * c_nof_complex; + +-- The size for 1 block is probably already enough as the number of blocks received +-- on the remote input of the mux probably have enough gap time in between. Just +-- to be sure to not run into issues in the future, the fifo size is increased to +-- buffer the maximum nof blocks per block period. + CONSTANT c_mux_fifo_size : NATURAL := 2**ceil_log2(g_P_sq * c_block_size_longwords); +-- c_fifo_fill_size should be at least 2 * c_block_size_longwords as dp_repack_data +-- repacks from 64bit to 32bit. Chosing 3x to have some room. + CONSTANT c_fifo_fill_size : NATURAL := 2**ceil_log2(3 * c_block_size_longwords); -- crosslet statistics offload SIGNAL ram_st_offload_copi : t_mem_copi := c_mem_copi_rst; @@ -110,6 +120,8 @@ ARCHITECTURE str OF node_sdp_correlator IS SIGNAL ring_mux_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL ring_mux_siso : t_dp_siso := c_dp_siso_rdy; + SIGNAL dp_fifo_fill_sosi : t_dp_sosi := c_dp_sosi_rst; + SIGNAL dp_fifo_fill_siso : t_dp_siso := c_dp_siso_rdy; SIGNAL rx_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL dispatch_invert_sosi_arr : t_dp_sosi_arr(0 TO g_P_sq-1) := (OTHERS => c_dp_sosi_rst); SIGNAL dispatch_sosi_arr : t_dp_sosi_arr(g_P_sq-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); @@ -215,7 +227,7 @@ BEGIN g_data_w => c_longword_w, g_channel_w => c_word_w, g_use_error => FALSE, - g_fifo_size => array_init(c_block_size, 2) + g_fifo_size => array_init(c_mux_fifo_size, 2) ) PORT MAP ( dp_clk => dp_clk, @@ -229,6 +241,35 @@ BEGIN to_ri_sosi <= ring_mux_sosi; + -- fill fifo to remove gaps + u_dp_fifo_fill_eop : ENTITY dp_lib.dp_fifo_fill_eop + GENERIC MAP ( + g_data_w => c_longword_w, + g_bsn_w => c_dp_stream_bsn_w, + g_empty_w => c_dp_stream_empty_w, + g_channel_w => c_dp_stream_channel_w, + g_error_w => c_dp_stream_error_w, + g_use_bsn => TRUE, + g_use_empty => TRUE, + g_use_channel => TRUE, + g_use_error => TRUE, + g_use_sync => TRUE, + g_fifo_fill => c_block_size_longwords, + g_fifo_size => c_fifo_fill_size + ) + PORT MAP ( + wr_rst => dp_rst, + wr_clk => dp_clk, + rd_rst => dp_rst, + rd_clk => dp_clk, + + snk_out => ring_mux_siso, + snk_in => ring_mux_sosi, + + src_in => dp_fifo_fill_siso, + src_out => dp_fifo_fill_sosi + ); + --------------------------------------------------------------- -- Repack 64b to 32b --------------------------------------------------------------- @@ -244,8 +285,8 @@ BEGIN rst => dp_rst, clk => dp_clk, - snk_in => ring_mux_sosi, - snk_out => ring_mux_siso, + snk_in => dp_fifo_fill_sosi, + snk_out => dp_fifo_fill_siso, src_out => rx_sosi ); @@ -266,7 +307,9 @@ BEGIN snk_in => rx_sosi, src_out_arr => dispatch_invert_sosi_arr ); + dispatch_sosi_arr <= func_dp_stream_arr_reverse_range(dispatch_invert_sosi_arr); + --------------------------------------------------------------- -- dp_bsn_aligner_v2 diff --git a/libraries/base/dp/dp.peripheral.yaml b/libraries/base/dp/dp.peripheral.yaml index a86b46f92569d9c4223533d3bec2c8fcd3688568..64e18fe4e39c713ae535859a07f67f936db76315 100644 --- a/libraries/base/dp/dp.peripheral.yaml +++ b/libraries/base/dp/dp.peripheral.yaml @@ -127,7 +127,7 @@ peripherals: - - field_name: replaced_pkt_cnt field_description: "Count of packets that contain replacement data per sync interval." address_offset: 1 * MM_BUS_SIZE - access_mode: R0 + access_mode: RO - peripheral_name: dp_bsn_source # pi_dp_bsn_source.py