From 70c040a8536ae4a9dfdc597fe4e755bd9d5decb9 Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Fri, 8 Mar 2024 07:45:44 +0100 Subject: [PATCH] Use sdp_beamformer_remote.vhd --- applications/lofar2/libraries/sdp/hdllib.cfg | 3 + .../sdp/src/vhdl/node_sdp_correlator.vhd | 211 +++--------------- 2 files changed, 29 insertions(+), 185 deletions(-) diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg index 7ad34980c3..f9d9833330 100644 --- a/applications/lofar2/libraries/sdp/hdllib.cfg +++ b/applications/lofar2/libraries/sdp/hdllib.cfg @@ -22,6 +22,7 @@ synth_files = src/vhdl/sdp_beamformer_output.vhd src/vhdl/sdp_statistics_offload.vhd src/vhdl/sdp_crosslets_subband_select.vhd + src/vhdl/sdp_crosslets_remote.vhd src/vhdl/node_sdp_adc_input_and_timing.vhd src/vhdl/node_sdp_filterbank.vhd src/vhdl/node_sdp_oversampled_filterbank.vhd @@ -38,6 +39,7 @@ test_bench_files = tb/vhdl/tb_sdp_beamformer_output.vhd tb/vhdl/tb_tb_sdp_beamformer_output.vhd tb/vhdl/tb_sdp_beamformer_remote_ring.vhd + tb/vhdl/tb_sdp_crosslets_remote_ring.vhd regression_test_vhdl = tb/vhdl/tb_sdp_info.vhd @@ -46,6 +48,7 @@ regression_test_vhdl = tb/vhdl/tb_sdp_crosslets_subband_select.vhd tb/vhdl/tb_tb_sdp_beamformer_output.vhd tb/vhdl/tb_sdp_beamformer_remote_ring.vhd + tb/vhdl/tb_sdp_crosslets_remote_ring.vhd [modelsim_project_file] 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 d5c96ea99d..9a1d0fe6f2 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -94,20 +94,8 @@ 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_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 + + -- crosslet statistics offload signal ram_st_offload_copi : t_mem_copi := c_mem_copi_rst; signal ram_st_offload_cipo : t_mem_cipo := c_mem_cipo_rst; @@ -117,21 +105,9 @@ architecture str of node_sdp_correlator is signal controller_cipo_arr : t_mem_cipo_arr(0 to c_nof_controllers - 1) := (others => c_mem_cipo_rst); signal quant_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb - 1 downto 0) := (others => c_dp_sosi_rst); - signal dp_bsn_sync_scheduler_src_out : t_dp_sosi := c_dp_sosi_rst; signal xsel_sosi : t_dp_sosi := c_dp_sosi_rst; - signal xsel_data_sosi : t_dp_sosi := c_dp_sosi_rst; - signal local_sosi : t_dp_sosi := c_dp_sosi_rst; - signal new_interval : std_logic; - 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); - signal crosslets_sosi : t_dp_sosi := c_dp_sosi_rst; signal crosslets_copi : t_mem_copi := c_mem_copi_rst; signal crosslets_cipo_arr : t_mem_cipo_arr(g_P_sq - 1 downto 0) := (others => c_mem_cipo_rst); @@ -203,168 +179,33 @@ begin xst_bs_sosi <= xsel_sosi; --------------------------------------------------------------- - -- Repack 32b to 64b - --------------------------------------------------------------- - -- repacking xsel re/im to data field. - p_wire_xsel_sosi : process(xsel_sosi) - begin - xsel_data_sosi <= xsel_sosi; - xsel_data_sosi.data( c_sdp_W_crosslet - 1 downto 0) <= xsel_sosi.re(c_sdp_W_crosslet - 1 downto 0); - xsel_data_sosi.data(c_nof_complex * c_sdp_W_crosslet - 1 downto c_sdp_W_crosslet) <= xsel_sosi.im(c_sdp_W_crosslet - 1 downto 0); - end process; - - u_dp_repack_data_local : entity dp_lib.dp_repack_data - generic map ( - g_in_dat_w => c_data_w, - g_in_nof_words => c_longword_w / c_data_w, - g_out_dat_w => c_longword_w, - g_out_nof_words => 1, - g_pipeline_ready => true -- Needed for src_in.ready to snk_out.ready. - ) - port map ( - rst => dp_rst, - clk => dp_clk, - - snk_in => xsel_data_sosi, - src_out => local_sosi - ); - - --------------------------------------------------------------- - -- ring_mux - --------------------------------------------------------------- - u_ring_mux : entity ring_lib.ring_mux - generic map ( - g_bsn_w => c_dp_stream_bsn_w, - g_data_w => c_longword_w, - g_channel_w => c_word_w, - g_use_error => false, - g_fifo_size => array_init(c_mux_fifo_size, 2) - ) - port map ( - dp_clk => dp_clk, - dp_rst => dp_rst, - - remote_sosi => from_ri_sosi, - local_sosi => local_sosi, - mux_sosi => ring_mux_sosi, - mux_siso => ring_mux_siso - ); - - 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 + -- Local and remote crosslets --------------------------------------------------------------- - u_dp_repack_data_rx : entity dp_lib.dp_repack_data + u_sdp_crosslets_remote : entity work.sdp_crosslets_remote generic map ( - g_in_dat_w => c_longword_w, - g_in_nof_words => 1, - g_out_dat_w => c_data_w, - g_out_nof_words => c_longword_w / c_data_w, - g_pipeline_ready => true -- Needed for src_in.ready to snk_out.ready. + g_P_sq => g_P_sq ) port map ( - rst => dp_rst, - clk => dp_clk, - - snk_in => dp_fifo_fill_sosi, - snk_out => dp_fifo_fill_siso, - src_out => rx_sosi - ); - - --------------------------------------------------------------- - -- dp_demux - --------------------------------------------------------------- - u_dp_demux : entity dp_lib.dp_demux - generic map ( - g_mode => 0, - g_nof_output => g_P_sq, - g_remove_channel_lo => false, - g_sel_ctrl_invert => true -- TRUE when indexed (g_nof_input-1 DOWNTO 0) - ) - port map ( - rst => dp_rst, - clk => dp_clk, - - 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 - --------------------------------------------------------------- - u_mmp_dp_bsn_align_v2 : entity dp_lib.mmp_dp_bsn_align_v2 - generic map( - -- for dp_bsn_align_v2 - g_nof_streams => g_P_sq, - g_bsn_latency_max => 2, - g_nof_aligners_max => 1, -- 1 for Access scheme 3. - g_block_size => c_block_size, - g_data_w => c_data_w, - g_use_mm_output => true, - g_rd_latency => 1, -- Required for st_xst - -- for mms_dp_bsn_monitor_v2 - -- Using c_sdp_N_clk_sync_timeout_xsub as g_nof_clk_per_sync is used for BSN monitor timeout. - g_nof_clk_per_sync => c_sdp_N_clk_sync_timeout_xsub, - g_nof_input_bsn_monitors => g_P_sq, - g_use_bsn_output_monitor => true - ) - port map ( - -- Memory-mapped clock domain - mm_rst => mm_rst, - mm_clk => mm_clk, - - reg_bsn_align_copi => reg_bsn_align_copi, - reg_bsn_align_cipo => reg_bsn_align_cipo, - - reg_input_monitor_copi => reg_bsn_monitor_v2_bsn_align_input_copi, - reg_input_monitor_cipo => reg_bsn_monitor_v2_bsn_align_input_cipo, - - reg_output_monitor_copi => reg_bsn_monitor_v2_bsn_align_output_copi, - reg_output_monitor_cipo => reg_bsn_monitor_v2_bsn_align_output_cipo, - - -- Streaming clock domain - dp_rst => dp_rst, - dp_clk => dp_clk, - - -- Streaming input - in_sosi_arr => dispatch_sosi_arr, - - -- Output via local MM interface in dp_clk domain, when g_use_mm_output = TRUE. - mm_sosi => crosslets_sosi, - mm_copi => crosslets_copi, - mm_cipo_arr => crosslets_cipo_arr + dp_clk => dp_clk, + dp_rst => dp_rst, + + xsel_sosi => xsel_sosi, + from_ri_sosi => from_ri_sosi, + to_ri_sosi => to_ri_sosi, + + crosslets_sosi => crosslets_sosi, + crosslets_copi => crosslets_copi, + crosslets_cipo_arr => crosslets_cipo_arr, + + mm_rst => mm_rst, + mm_clk => mm_clk, + + reg_bsn_align_copi => reg_bsn_align_copi, + reg_bsn_align_cipo => reg_bsn_align_cipo, + reg_bsn_monitor_v2_bsn_align_input_copi => reg_bsn_monitor_v2_bsn_align_input_copi, + reg_bsn_monitor_v2_bsn_align_input_cipo => reg_bsn_monitor_v2_bsn_align_input_cipo, + reg_bsn_monitor_v2_bsn_align_output_copi => reg_bsn_monitor_v2_bsn_align_output_copi, + reg_bsn_monitor_v2_bsn_align_output_cipo => reg_bsn_monitor_v2_bsn_align_output_cipo ); --------------------------------------------------------------- @@ -397,8 +238,8 @@ begin --------------------------------------------------------------- -- Connect 2 mm_controllers to the common_mem_mux output controller_copi_arr(0) <= ram_st_xsq_copi; -- MM access via QSYS MM bus - ram_st_xsq_cipo <= controller_cipo_arr(0); controller_copi_arr(1) <= ram_st_offload_copi; -- MM access by UDP offload + ram_st_xsq_cipo <= controller_cipo_arr(0); ram_st_offload_cipo <= controller_cipo_arr(1); u_mem_controller_mux : entity mm_lib.mm_master_mux -- GitLab