Skip to content
Snippets Groups Projects

Clarify g_nof_destinations_max design revision parameter and package constants...

Merged Eric Kooistra requested to merge L2SDP-964 into master
1 file
+ 127
37
Compare changes
  • Side-by-side
  • Inline
@@ -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,
Loading