Skip to content
Snippets Groups Projects
Commit 17f8ab3e authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Assemble hdr offload info for multi destination.

parent 75f505c4
No related branches found
No related tags found
1 merge request!359Clarify g_nof_destinations_max design revision parameter and package constants...
Pipeline #59509 passed
......@@ -97,7 +97,14 @@ architecture str of sdp_beamformer_output is
constant c_fifo_fill : natural := c_sdp_cep_payload_nof_longwords; -- 976
constant c_fifo_size : natural := true_log_pow2(c_sdp_cep_payload_nof_longwords) * c_sdp_N_beamsets; -- 2048
-- field_sel = '0' for DP (dynamic), '1' for MM (fixed or programmable via MM of dp_offload_tx_v3)
-- Multi destination info (mdi)
constant c_nof_destinations_w : natural := ceil_log2(g_nof_destinations_max + 1);
constant c_mdi_slv_w : natural := c_nof_destinations_w * 2 +
c_sdp_bdo_reorder_nof_blocks_w +
c_sdp_nof_beamlets_per_block_w;
-- . field_sel = '0' for DP (dynamic), '1' for MM (fixed or programmable via MM of dp_offload_tx_v3)
constant c_cep_hdr_field_sel : std_logic_vector(c_sdp_cep_nof_hdr_fields - 1 downto 0) :=
sel_a_b(g_nof_destinations_max = 1, func_sdp_cep_hdr_field_sel_dst('1'),
func_sdp_cep_hdr_field_sel_dst('0'));
......@@ -119,10 +126,10 @@ architecture str of sdp_beamformer_output is
signal dp_packet_reorder_word : t_sdp_dual_pol_beamlet_in_word;
signal dp_repack_longword_src_out : t_dp_sosi;
signal dp_repack_longword : t_sdp_dual_pol_beamlet_in_longword;
signal dp_fifo_fill_eop_src_out : t_dp_sosi;
signal dp_fifo_fill_eop_src_in : t_dp_siso;
signal dp_pipeline_src_out : t_dp_sosi;
signal dp_pipeline_src_in : t_dp_siso;
signal dp_fifo_data_src_out : t_dp_sosi;
signal dp_fifo_data_src_in : t_dp_siso;
signal dp_pipeline_data_src_out : t_dp_sosi;
signal dp_pipeline_data_src_in : t_dp_siso;
signal dp_offload_tx_src_out : t_dp_sosi;
signal dp_offload_tx_src_in : t_dp_siso;
signal ip_checksum_src_out : t_dp_sosi;
......@@ -134,11 +141,28 @@ architecture str of sdp_beamformer_output is
signal payload_err : std_logic_vector(0 downto 0);
signal station_info : std_logic_vector(15 downto 0) := (others => '0');
-- Multiple destinations
signal destinations_info : t_sdp_bdo_destinations_info;
signal eth_dst_mac : std_logic_vector(c_network_eth_mac_addr_w - 1 downto 0);
signal ip_dst_addr : std_logic_vector(c_network_ip_addr_w - 1 downto 0);
signal udp_dst_port : std_logic_vector(c_network_udp_port_w - 1 downto 0);
-- Multiple destinations info (mdi)
signal multi_destinations_info : t_sdp_bdo_destinations_info;
signal mdi_hdr_eth_dst_mac : std_logic_vector(c_network_eth_mac_addr_w - 1 downto 0);
signal mdi_hdr_ip_dst_addr : std_logic_vector(c_network_ip_addr_w - 1 downto 0);
signal mdi_hdr_udp_dst_port : std_logic_vector(c_network_udp_port_w - 1 downto 0);
-- . index for destination MAC/IP/UDP
signal mdi_destination_index : natural;
signal mdi_destination_index_slv : std_logic_vector(c_nof_destinations_w - 1 downto 0);
-- . header fields
signal mdi_nof_blocks_per_packet : natural;
signal mdi_nof_blocks_per_packet_slv : std_logic_vector(c_sdp_bdo_reorder_nof_blocks_w - 1 downto 0);
signal mdi_nof_beamlets_per_block_per_destination : natural;
signal mdi_nof_beamlets_per_block_per_destination_slv : std_logic_vector(c_sdp_nof_beamlets_per_block_w - 1 downto 0);
signal mdi_beamlet_index_per_destination : natural;
signal mdi_beamlet_index_per_destination_slv : std_logic_vector(c_nof_destinations_w - 1 downto 0);
signal mdi_fifo_in_slv : std_logic_vector(c_mdi_slv_w - 1 downto 0);
signal mdi_fifo_out_slv : std_logic_vector(c_mdi_slv_w - 1 downto 0);
signal mdi_hdr_destination_index : natural;
signal mdi_hdr_nof_blocks_per_packet : natural;
signal mdi_hdr_nof_beamlets_per_block_per_destination : natural;
signal mdi_hdr_beamlet_index_per_destination : natural;
-- Default set all data path driven header fields to 0
signal dp_offload_tx_hdr_fields : std_logic_vector(1023 downto 0) := (others => '0');
......@@ -278,11 +302,78 @@ begin
reg_destinations_copi => reg_destinations_copi,
reg_destinations_cipo => reg_destinations_cipo,
destinations_info => destinations_info,
destinations_info => multi_destinations_info,
snk_in => dp_repack_beamlet_src_out,
src_out => dp_packet_reorder_src_out
src_out => dp_packet_reorder_src_out,
-- Streaming data output info per destination index
destination_index => mdi_destination_index,
nof_blocks_per_packet => mdi_nof_blocks_per_packet,
nof_beamlets_per_block_per_destination => mdi_nof_beamlets_per_block_per_destination,
beamlet_index_per_destination => mdi_beamlet_index_per_destination
);
-----------------------------------------------------------------------------
-- FIFO: to align multi destination info
-----------------------------------------------------------------------------
mdi_destination_index_slv <= to_uvec(mdi_destination_index, c_nof_destinations_w);
mdi_nof_blocks_per_packet_slv <= to_uvec(mdi_nof_blocks_per_packet, c_sdp_bdo_reorder_nof_blocks_w);
mdi_nof_beamlets_per_block_per_destination_slv <= to_uvec(mdi_nof_beamlets_per_block_per_destination, c_sdp_nof_beamlets_per_block_w);
mdi_beamlet_index_per_destination_slv <= to_uvec(mdi_beamlet_index_per_destination, c_nof_destinations_w);
-- Concat into slv
mdi_fifo_in_slv <= func_slv_concat(mdi_destination_index_slv,
mdi_nof_blocks_per_packet_slv,
mdi_nof_beamlets_per_block_per_destination_slv,
mdi_beamlet_index_per_destination_slv);
-- Similar purpose as u_common_fifo_err, but from input sop to output sop.
u_common_fifo_mdi : entity common_lib.common_fifo_sc
generic map (
g_dat_w => c_mdi_slv_w,
g_nof_words => c_sdp_N_beamsets + 2
)
port map (
rst => dp_rst,
clk => dp_clk,
wr_dat => mdi_fifo_in_slv,
wr_req => dp_packet_reorder_src_out.sop,
rd_dat => mdi_fifo_out_slv,
rd_req => dp_fifo_data_src_out.sop
);
-- Extract from slv
mdi_hdr_destination_index <= to_uint(func_slv_extract(c_nof_destinations_w,
c_sdp_bdo_reorder_nof_blocks_w,
c_sdp_nof_beamlets_per_block_w,
c_nof_destinations_w,
mdi_fifo_out_slv, 0));
mdi_hdr_nof_blocks_per_packet <= to_uint(func_slv_extract(c_nof_destinations_w,
c_sdp_bdo_reorder_nof_blocks_w,
c_sdp_nof_beamlets_per_block_w,
c_nof_destinations_w,
mdi_fifo_out_slv, 1));
mdi_hdr_nof_beamlets_per_block_per_destination <= to_uint(func_slv_extract(c_nof_destinations_w,
c_sdp_bdo_reorder_nof_blocks_w,
c_sdp_nof_beamlets_per_block_w,
c_nof_destinations_w,
mdi_fifo_out_slv, 2));
mdi_hdr_beamlet_index_per_destination <= to_uint(func_slv_extract(c_nof_destinations_w,
c_sdp_bdo_reorder_nof_blocks_w,
c_sdp_nof_beamlets_per_block_w,
c_nof_destinations_w,
mdi_fifo_out_slv, 3));
-- Select destination MAC/IP/UDP, pipeline to easing timing closure
p_pipeline : process(dp_clk)
begin
if rising_edge(dp_clk) then
mdi_hdr_eth_dst_mac <= multi_destinations_info.eth_destination_mac_arr(mdi_hdr_destination_index);
mdi_hdr_ip_dst_addr <= multi_destinations_info.ip_destination_address_arr(mdi_hdr_destination_index);
mdi_hdr_udp_dst_port <= multi_destinations_info.udp_destination_port_arr(mdi_hdr_destination_index);
end if;
end process;
end generate;
-- Debug signals for view in Wave window
......@@ -314,11 +405,11 @@ begin
dp_repack_longword <= unpack_data(dp_repack_longword_src_out.data(c_longword_w - 1 downto 0));
-----------------------------------------------------------------------------
-- FIFO
-- FIFO: to be able to insert header in u_dp_offload_tx_v3
-----------------------------------------------------------------------------
-- Pass on dp_repack_longword_src_out.err field not here, but via separate
-- u_common_fifo_sc_err.
u_dp_fifo_fill_eop_sc : entity dp_lib.dp_fifo_fill_eop_sc
-- u_common_fifo_err.
u_dp_fifo_data : entity dp_lib.dp_fifo_fill_eop_sc
generic map (
g_data_w => c_longword_w,
g_empty_w => c_byte_w,
......@@ -334,16 +425,17 @@ begin
clk => dp_clk,
rst => dp_rst,
snk_in => dp_repack_longword_src_out,
src_out => dp_fifo_fill_eop_src_out,
src_in => dp_fifo_fill_eop_src_in
src_out => dp_fifo_data_src_out,
src_in => dp_fifo_data_src_in
);
-- FIFO: to store and align payload error bit from eop to sop
-- Simple fifo to store the payload error bit at eop of FIFO input to be used
-- at sop of FIFO output, so that payload_err can then be used in the packet
-- header. Typically the u_dp_fifo_fill_eop will store between 0 and
-- header. Typically the u_dp_fifo_data will store between 0 and
-- c_sdp_N_beamsets = 2 packets. Choose g_nof_words > c_sdp_N_beamsets to
-- have some margin compared to c_fifo_size of the data FIFO.
u_common_fifo_sc_err : entity common_lib.common_fifo_sc
u_common_fifo_err : entity common_lib.common_fifo_sc
generic map (
g_dat_w => 1,
g_nof_words => c_sdp_N_beamsets + 2
......@@ -354,11 +446,11 @@ begin
wr_dat => dp_repack_longword_src_out.err(0 downto 0),
wr_req => dp_repack_longword_src_out.eop,
rd_dat => payload_err,
rd_req => dp_fifo_fill_eop_src_out.sop
rd_req => dp_fifo_data_src_out.sop
);
-- Pipeline FIFO output to align payload_err at dp_pipeline_src_out.sop
u_pipeline : entity dp_lib.dp_pipeline
-- Pipeline dp_fifo_data_src_out to align payload_err at dp_pipeline_data_src_out.sop
u_pipeline_data : entity dp_lib.dp_pipeline
generic map (
g_pipeline => 1
)
......@@ -366,11 +458,11 @@ begin
rst => dp_rst,
clk => dp_clk,
-- ST sink
snk_out => dp_fifo_fill_eop_src_in,
snk_in => dp_fifo_fill_eop_src_out,
snk_out => dp_fifo_data_src_in,
snk_in => dp_fifo_data_src_out,
-- ST source
src_in => dp_pipeline_src_in,
src_out => dp_pipeline_src_out
src_in => dp_pipeline_data_src_in,
src_out => dp_pipeline_data_src_out
);
-----------------------------------------------------------------------------
......@@ -431,7 +523,7 @@ begin
--
-- DP dp_bsn
p_assemble_offload_info : process(destinations_info)
p_assemble_offload_info : process(mdi_hdr_nof_blocks_per_packet, mdi_hdr_nof_beamlets_per_block_per_destination)
begin
if g_nof_destinations_max = 1 then
-- Use constant defaults for beamlet data output to one destination.
......@@ -439,10 +531,8 @@ begin
nof_beamlets_per_block <= c_sdp_S_sub_bf; -- = 488 dual pol beamlets;
else
-- Use dynamic sizes for beamlet data output to multiple destination.
nof_blocks_per_packet <= destinations_info.nof_blocks_per_packet;
nof_beamlets_per_block <= c_sdp_S_sub_bf; -- = 488 dual pol beamlets;
-- TODO check channel field to set destination addresses in dp_offload_tx_hdr_fields
nof_blocks_per_packet <= mdi_hdr_nof_blocks_per_packet;
nof_beamlets_per_block <= mdi_hdr_nof_beamlets_per_block_per_destination;
end if;
end process;
......@@ -460,9 +550,9 @@ begin
-- Use MM programmable destination MAC/IP/UDP from dp_offload_tx_v3 for one destination
-- Use DP programmable destination MAC/IP/UDP from sdp_bdo_destinations_reg for multiple destinations
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "eth_dst_mac" ) downto field_lo(c_sdp_cep_hdr_field_arr, "eth_dst_mac" )) <= eth_dst_mac;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "ip_dst_addr" ) downto field_lo(c_sdp_cep_hdr_field_arr, "ip_dst_addr" )) <= ip_dst_addr;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "udp_dst_port") downto field_lo(c_sdp_cep_hdr_field_arr, "udp_dst_port")) <= udp_dst_port;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "eth_dst_mac" ) downto field_lo(c_sdp_cep_hdr_field_arr, "eth_dst_mac" )) <= mdi_hdr_eth_dst_mac;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "ip_dst_addr" ) downto field_lo(c_sdp_cep_hdr_field_arr, "ip_dst_addr" )) <= mdi_hdr_ip_dst_addr;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "udp_dst_port") downto field_lo(c_sdp_cep_hdr_field_arr, "udp_dst_port")) <= mdi_hdr_udp_dst_port;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_observation_id" ) downto field_lo(c_sdp_cep_hdr_field_arr, "sdp_observation_id" )) <= sdp_info.observation_id;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_station_info" ) downto field_lo(c_sdp_cep_hdr_field_arr, "sdp_station_info" )) <= station_info;
......@@ -480,7 +570,7 @@ begin
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_nof_beamlets_per_block") downto field_lo(c_sdp_cep_hdr_field_arr, "sdp_nof_beamlets_per_block")) <= TO_UVEC(nof_beamlets_per_block, c_halfword_w);
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "sdp_block_period" ) downto field_lo(c_sdp_cep_hdr_field_arr, "sdp_block_period" )) <= sdp_info.block_period;
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "dp_bsn" ) downto field_lo(c_sdp_cep_hdr_field_arr, "dp_bsn" )) <= dp_pipeline_src_out.bsn(63 downto 0);
dp_offload_tx_hdr_fields(field_hi(c_sdp_cep_hdr_field_arr, "dp_bsn" ) downto field_lo(c_sdp_cep_hdr_field_arr, "dp_bsn" )) <= dp_pipeline_data_src_out.bsn(63 downto 0);
-- For viewing the header fields in wave window
dp_offload_tx_header <= func_sdp_map_cep_header(dp_offload_tx_hdr_fields);
......@@ -507,8 +597,8 @@ begin
reg_hdr_dat_mosi => reg_hdr_dat_mosi,
reg_hdr_dat_miso => reg_hdr_dat_miso,
snk_in_arr(0) => dp_pipeline_src_out,
snk_out_arr(0) => dp_pipeline_src_in,
snk_in_arr(0) => dp_pipeline_data_src_out,
snk_out_arr(0) => dp_pipeline_data_src_in,
src_out_arr(0) => dp_offload_tx_src_out,
src_in_arr(0) => dp_offload_tx_src_in,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment