diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_beamformer_output.vhd index 3e49d71d9e2bfd15898420676ecbb8c78875ef5f..481c7ef2e0309232369dbac107f559566a5733ec 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_beamformer_output.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_beamformer_output.vhd @@ -209,58 +209,65 @@ begin proc_common_wait_until_low(dp_clk, mm_rst); proc_common_wait_some_cycles(mm_clk, 10); - ---------------------------------------------------------------------------- - -- BDO multiple destinations info in sdp_bdo_destinations_reg - ---------------------------------------------------------------------------- - -- . Set nof_destinations = g_nof_destinations - v_offset := c_sdp_bdo_mm_nof_destinations_max * 4; - proc_mem_mm_bus_wr(v_offset + 0, g_nof_destinations, mm_clk, reg_destinations_cipo, reg_destinations_copi); - - -- . Read back nof_destinations - proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_dp_clk_period, c_common_cross_clock_domain_latency * 2); - proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_destinations_cipo, reg_destinations_copi); - proc_mem_mm_bus_rd_latency(1, mm_clk); - rd_nof_destinations <= to_uint(reg_destinations_cipo.rddata(c_word_w - 1 downto 0)); - proc_common_wait_some_cycles(mm_clk, 1); - assert rd_nof_destinations = g_nof_destinations report "Wrong MM readback nof_destinations" severity error; - - -- . Read nof_destinations_act, to check that g_nof_destinations is - -- forced to c_nof_destinations - proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_dp_clk_period, c_common_cross_clock_domain_latency * 2); - proc_mem_mm_bus_rd(v_offset + 1, mm_clk, reg_destinations_cipo, reg_destinations_copi); - proc_mem_mm_bus_rd_latency(1, mm_clk); - rd_nof_destinations_act <= to_uint(reg_destinations_cipo.rddata(c_word_w - 1 downto 0)); - proc_common_wait_some_cycles(mm_clk, 1); - assert rd_nof_destinations_act = c_nof_destinations report "Wrong MM read nof_destinations_act" severity error; - - -- . Use same destination MAC/IP/UDP for all destinations, to ease rx_beamlet_header verification - -- and to have same c_exp_ip_header_checksum value for all c_nof_destinations. - for DI in 0 to c_nof_destinations - 1 loop - proc_mem_mm_bus_wr(DI * 2 + 1, to_uint(c_sdp_cep_eth_dst_mac(47 downto 32)), mm_clk, reg_destinations_cipo, reg_destinations_copi); - proc_mem_mm_bus_wr(DI * 2, to_sint(c_sdp_cep_eth_dst_mac(31 downto 0)), mm_clk, reg_destinations_cipo, reg_destinations_copi); - end loop; - v_offset := c_sdp_bdo_mm_nof_destinations_max * 2; - for DI in 0 to c_nof_destinations - 1 loop - proc_mem_mm_bus_wr(v_offset + DI, to_sint(c_sdp_cep_ip_dst_addr), mm_clk, reg_destinations_cipo, reg_destinations_copi); - end loop; - v_offset := c_sdp_bdo_mm_nof_destinations_max * 3; - for DI in 0 to c_nof_destinations - 1 loop - proc_mem_mm_bus_wr(v_offset + DI, to_uint(c_sdp_cep_udp_dst_port), mm_clk, reg_destinations_cipo, reg_destinations_copi); - end loop; + if c_nof_destinations_max = 1 then + -------------------------------------------------------------------------- + -- BDO one destination fields in dp_offload_tx_v3 + -------------------------------------------------------------------------- + proc_mem_mm_bus_wr(41, to_uint(c_sdp_cep_eth_dst_mac(47 downto 32)), mm_clk, hdr_dat_cipo, hdr_dat_copi); + proc_mem_mm_bus_wr(40, to_sint(c_sdp_cep_eth_dst_mac(31 downto 0)), mm_clk, hdr_dat_cipo, hdr_dat_copi); + proc_mem_mm_bus_wr(25, to_sint(c_sdp_cep_ip_dst_addr), mm_clk, hdr_dat_cipo, hdr_dat_copi); + proc_mem_mm_bus_wr(23, to_uint(c_sdp_cep_udp_dst_port), mm_clk, hdr_dat_cipo, hdr_dat_copi); + else + ---------------------------------------------------------------------------- + -- BDO multiple destinations info in sdp_bdo_destinations_reg + ---------------------------------------------------------------------------- + -- . Set nof_destinations = g_nof_destinations + v_offset := c_sdp_bdo_mm_nof_destinations_max * 4; + proc_mem_mm_bus_wr(v_offset + 0, g_nof_destinations, mm_clk, reg_destinations_cipo, reg_destinations_copi); + + -- . Read back nof_destinations + proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_dp_clk_period, c_common_cross_clock_domain_latency * 2); + proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_destinations_cipo, reg_destinations_copi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + rd_nof_destinations <= to_uint(reg_destinations_cipo.rddata(c_word_w - 1 downto 0)); + proc_common_wait_some_cycles(mm_clk, 1); + assert rd_nof_destinations = g_nof_destinations report "Wrong MM readback nof_destinations" severity error; + + -- . Read nof_destinations_act, to check that g_nof_destinations is + -- forced to c_nof_destinations + proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_dp_clk_period, c_common_cross_clock_domain_latency * 2); + proc_mem_mm_bus_rd(v_offset + 1, mm_clk, reg_destinations_cipo, reg_destinations_copi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + rd_nof_destinations_act <= to_uint(reg_destinations_cipo.rddata(c_word_w - 1 downto 0)); + proc_common_wait_some_cycles(mm_clk, 1); + assert rd_nof_destinations_act = c_nof_destinations report "Wrong MM read nof_destinations_act" severity error; + + -- . Use same destination MAC/IP/UDP for all destinations, to ease rx_beamlet_header verification + -- and to have same c_exp_ip_header_checksum value for all c_nof_destinations. + for DI in 0 to c_nof_destinations - 1 loop + proc_mem_mm_bus_wr(DI * 2 + 1, to_uint(c_sdp_cep_eth_dst_mac(47 downto 32)), mm_clk, reg_destinations_cipo, reg_destinations_copi); + proc_mem_mm_bus_wr(DI * 2, to_sint(c_sdp_cep_eth_dst_mac(31 downto 0)), mm_clk, reg_destinations_cipo, reg_destinations_copi); + end loop; + v_offset := c_sdp_bdo_mm_nof_destinations_max * 2; + for DI in 0 to c_nof_destinations - 1 loop + proc_mem_mm_bus_wr(v_offset + DI, to_sint(c_sdp_cep_ip_dst_addr), mm_clk, reg_destinations_cipo, reg_destinations_copi); + end loop; + v_offset := c_sdp_bdo_mm_nof_destinations_max * 3; + for DI in 0 to c_nof_destinations - 1 loop + proc_mem_mm_bus_wr(v_offset + DI, to_uint(c_sdp_cep_udp_dst_port), mm_clk, reg_destinations_cipo, reg_destinations_copi); + end loop; + end if; ---------------------------------------------------------------------------- - -- BDO header src and single destination fields in dp_offload_tx_v3 + -- BDO header src fields in dp_offload_tx_v3 ---------------------------------------------------------------------------- - -- . Use sim default dst and src MAC, IP, UDP port from sdp_pkg.vhd and based on c_gn_id + -- . Use sim default dst and src MAC/IP/UDP port from sdp_pkg.vhd and based + -- on c_gn_id -- . use signed to fit 32 b in integer proc_mem_mm_bus_wr(39, to_uint(c_cep_eth_src_mac(47 downto 32)), mm_clk, hdr_dat_cipo, hdr_dat_copi); proc_mem_mm_bus_wr(38, to_sint(c_cep_eth_src_mac(31 downto 0)), mm_clk, hdr_dat_cipo, hdr_dat_copi); proc_mem_mm_bus_wr(26, to_sint(c_cep_ip_src_addr), mm_clk, hdr_dat_cipo, hdr_dat_copi); proc_mem_mm_bus_wr(24, to_uint(c_cep_udp_src_port), mm_clk, hdr_dat_cipo, hdr_dat_copi); - proc_mem_mm_bus_wr(41, to_uint(c_sdp_cep_eth_dst_mac(47 downto 32)), mm_clk, hdr_dat_cipo, hdr_dat_copi); - proc_mem_mm_bus_wr(40, to_sint(c_sdp_cep_eth_dst_mac(31 downto 0)), mm_clk, hdr_dat_cipo, hdr_dat_copi); - proc_mem_mm_bus_wr(25, to_sint(c_sdp_cep_ip_dst_addr), mm_clk, hdr_dat_cipo, hdr_dat_copi); - proc_mem_mm_bus_wr(23, to_uint(c_sdp_cep_udp_dst_port), mm_clk, hdr_dat_cipo, hdr_dat_copi); ---------------------------------------------------------------------------- -- Enable beamlet output (dp_xonoff) diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_beamformer_output.vhd index 7adf4c692ece6900d38921cb929a9406d43ae611..4c14f757cd46b175f0c9030b8f3657c041199f0b 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_beamformer_output.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_beamformer_output.vhd @@ -48,15 +48,15 @@ begin -- Multiple BDO destinations -- . prime number combination - u_multi_3_7 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 3, 7); + u_multi_7_3 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 7, 3); -- . use 1 destnation, when more are available - u_multi_1_16 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 1, 16); + u_multi_16_1 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 16, 1); -- . use all destinations that are available u_multi_16_16 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 16, 16); -- . use prime number of destination from maximum available - u_multi_7_32 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 7, 32); + u_multi_32_7 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 32, 7); -- . use unfeasible number of destination, to check that it becomes 1 less u_multi_32_32 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 32, 32); -- . use maximum number of destinations - u_multi_31_32 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 31, 32); + u_multi_32_31 : entity work.tb_sdp_beamformer_output generic map( 50, 0, true, 32, 31); end tb;