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

Add sdp_bdo_destinations_reg.vhd + contants.

parent 558fccd7
No related branches found
No related tags found
1 merge request!357Move func_sdp_bdo_cep_hdr_field_sel_dest() from sdp_bdo_pkg to...
This commit is part of merge request !357. Comments created here will be created in the context of that merge request.
hdl_lib_name = lofar2_sdp
hdl_library_clause_name = lofar2_sdp_lib
hdl_lib_uses_synth = common dp wpfb rTwoSDF filter si st reorder technology tech_pll mm dp diag aduh tech_jesd204b nw_10GbE eth ring
hdl_lib_uses_sim =
hdl_lib_technology =
hdl_lib_uses_sim =
hdl_lib_technology =
synth_files =
src/vhdl/sdp_pkg.vhd
synth_files =
src/vhdl/sdp_pkg.vhd
src/vhdl/sdp_scope.vhd
src/vhdl/sdp_subband_weights.vhd
src/vhdl/sdp_subband_equalizer.vhd
src/vhdl/sdp_bf_weights.vhd
src/vhdl/sdp_beamformer_local.vhd
src/vhdl/sdp_beamformer_remote.vhd
src/vhdl/sdp_info_reg.vhd
src/vhdl/sdp_info.vhd
src/vhdl/sdp_beamformer_output.vhd
src/vhdl/sdp_statistics_offload.vhd
src/vhdl/sdp_crosslets_subband_select.vhd
src/vhdl/sdp_bf_weights.vhd
src/vhdl/sdp_beamformer_local.vhd
src/vhdl/sdp_beamformer_remote.vhd
src/vhdl/sdp_info_reg.vhd
src/vhdl/sdp_info.vhd
src/vhdl/sdp_bdo_destinations_reg.vhd
src/vhdl/sdp_beamformer_output.vhd
src/vhdl/sdp_statistics_offload.vhd
src/vhdl/sdp_crosslets_subband_select.vhd
src/vhdl/node_sdp_adc_input_and_timing.vhd
src/vhdl/node_sdp_filterbank.vhd
src/vhdl/node_sdp_oversampled_filterbank.vhd
......@@ -29,13 +30,13 @@ test_bench_files =
tb/vhdl/tb_sdp_info.vhd
tb/vhdl/tb_sdp_statistics_offload.vhd
tb/vhdl/tb_tb_sdp_statistics_offload.vhd
tb/vhdl/tb_sdp_crosslets_subband_select.vhd
tb/vhdl/tb_sdp_crosslets_subband_select.vhd
regression_test_vhdl =
regression_test_vhdl =
tb/vhdl/tb_sdp_info.vhd
tb/vhdl/tb_sdp_statistics_offload.vhd
tb/vhdl/tb_sdp_statistics_offload.vhd
tb/vhdl/tb_tb_sdp_statistics_offload.vhd
tb/vhdl/tb_sdp_crosslets_subband_select.vhd
tb/vhdl/tb_sdp_crosslets_subband_select.vhd
[modelsim_project_file]
......
......@@ -27,7 +27,7 @@ peripherals:
- - { field_name: block_period, mm_width: 16, access_mode: RO, address_offset: 0x0 }
- peripheral_name: sdp_crosslets_subband_select # pi_sdp_crosslets_info.py
- peripheral_name: sdp_crosslets_subband_select # pi_sdp_crosslets_info.py
peripheral_description: "SDP crosslets info."
mm_ports:
# MM port for sdp_info.vhd
......@@ -35,15 +35,15 @@ peripherals:
mm_port_type: REG
mm_port_span: 16 * MM_BUS_SIZE
mm_port_description: |
"The SDP crosslets info contains the step size and 15 offsets, that are used to select a new
"The SDP crosslets info contains the step size and 15 offsets, that are used to select a new
crosslet subband for every integration interval"
fields:
- - { field_name: step, access_mode: RW, address_offset: 0x3C }
- - field_name: offset
number_of_fields: 15
number_of_fields: 15
address_offset: 0x0
- peripheral_name: sdp_nof_crosslets # pi_sdp_nof_crosslets.py
- peripheral_name: sdp_nof_crosslets # pi_sdp_nof_crosslets.py
peripheral_description: "SDP nof crosslets."
mm_ports:
- mm_port_name: REG_NOF_CROSSLETS
......@@ -104,7 +104,7 @@ peripherals:
- peripheral_name: sdp_bf_weights # pi_sdp_bf_weights.py
peripheral_description: "SDP Beamformer weights (= beamlet weights)."
peripheral_description: "SDP Beamformer (BF) weights (= beamlet weights)."
parameters:
# Parameters of pi_sdp_bf_weights.py, fixed in sdp_bf_weights.vhd / sdp_pkg.vhd
- { name: N_pol_bf, value: 2 }
......@@ -155,7 +155,7 @@ peripherals:
- peripheral_name: sdp_bf_scale # pi_sdp_bf_scale.py
peripheral_description: "SDP BF beamlet data output scaling and requantization."
peripheral_description: "SDP beamlet data output (BDO) scaling and requantization."
parameters:
# Parameters fixed in node_sdp_beamformer.vhd / mms_dp_scale.vhd / sdp_pkg.vhd
- { name: g_gain_w, value: 16 }
......@@ -190,8 +190,35 @@ peripherals:
address_offset: 0x4
- peripheral_name: sdp_bdo_destinations
peripheral_description: "SDP beamlet data output (BDO) destinations."
parameters:
# Parameters fixed in sdp_beamformer_output.vhd / sdp_pkg.vhd
- { name: N_destinations_max, value: 16 }
- { name: N_reorder_blocks_max, value: 16 }
mm_ports:
# MM port for sdp_beamformer_output.vhd / mm_fields.vhd
- mm_port_name: REG_BDO_DESTINATIONS
mm_port_type: REG
mm_port_span: 16 * MM_BUS_SIZE
mm_port_description: |
"The SDP beamlets in a beamset can be send to 1 or multiple destinations, each identified
by destination MAC addess, IP address and UDP port.
The number of destinations is 1 <= nof_destinations <= N_destinations_max.
The number of blocks per packet is nof_blocks_per_packet <= N_reorder_blocks_max / nof_destinations.
The actual nof_blocks_per_packet and nof_destinations is reported via the corresponding _act fields."
fields:
- - { field_name: eth_destination_mac, number_of_fields: N_destinations_max, mm_width: 32, user_width: 48, radix: uint64, access_mode: RW, address_offset: 0x0 }
- - { field_name: ip_destination_address, number_of_fields: N_destinations_max, mm_width: 32, access_mode: RW, address_offset: 0x80 }
- - { field_name: udp_destination_port, number_of_fields: N_destinations_max, mm_width: 16, access_mode: RW, address_offset: 0xC0 }
- - { field_name: nof_destinations, mm_width: 8, access_mode: RW, address_offset: 0x100 }
- - { field_name: nof_destinations_act, mm_width: 8, access_mode: RW, address_offset: 0x104 }
- - { field_name: nof_blocks_per_packet, mm_width: 8, access_mode: RW, address_offset: 0x108 }
- - { field_name: nof_blocks_per_packet_act, mm_width: 8, access_mode: RW, address_offset: 0x10C }
- peripheral_name: sdp_beamformer_output_hdr_dat # pi_dp_offload_tx_hdr_dat_lofar2_beamformer_output.py
peripheral_description: "SDP BF beamlet data output header."
peripheral_description: "SDP beamlet data output (BDO) header."
mm_ports:
# MM port for sdp_beamformer_output.vhd / dp_offload_tx_v3.vhd
- mm_port_name: REG_DP_OFFLOAD_TX_HDR_DAT
......
-------------------------------------------------------------------------------
--
-- Copyright 2023
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-------------------------------------------------------------------------------
--
-- Author: E. Kooistra
-- Purpose:
-- . SDP beamlet data output (BDO) destinations register
-- Description:
-- _________
-- |mm_fields|
-- | |
-- reg_copi -->| slv_out|------- _wr ----
-- reg_cipo <--| | |
-- | | v
-- | slv_in|<--+--- _rd <--+<---- _ro
-- |_________| |
-- -----------------> output value
--
-- where:
-- . _ro = parsed_nof_destinations, parsed_nof_blocks_per_packet
-- . output value = sdp_bdo_destinations
--
-- References:
-- 1 https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
-- 2 https://support.astron.nl/confluence/display/L2M/L4+SDPFW+Decision%3A+Multiple+beamlet+output+destinations
--
library IEEE, common_lib, mm_lib;
use IEEE.std_logic_1164.all;
use common_lib.common_pkg.all;
use common_lib.common_mem_pkg.all;
use common_lib.common_field_pkg.all;
use work.sdp_pkg.all;
entity sdp_bdo_destinations_reg is
port (
-- Clocks and reset
mm_rst : in std_logic;
mm_clk : in std_logic;
dp_clk : in std_logic;
dp_rst : in std_logic;
reg_copi : in t_mem_copi;
reg_cipo : out t_mem_cipo;
-- sdp info
sdp_bdo_destinations : out t_sdp_bdo_destinations_info
);
end sdp_bdo_destinations_reg;
architecture str of sdp_bdo_destinations_reg is
constant c_field_arr : t_common_field_arr(c_sdp_bdo_destinations_info_nof_hdr_fields - 1 downto 0) :=
( (field_name_pad("nof_blocks_per_packet_act"), "RO", 8, field_default(c_sdp_cep_nof_blocks_per_packet)),
(field_name_pad("nof_blocks_per_packet"), "RW", 8, field_default(c_sdp_cep_nof_blocks_per_packet)),
(field_name_pad("nof_destinations_act"), "RO", 8, field_default(1)),
(field_name_pad("nof_destinations"), "RW", 8, field_default(1)),
(field_name_pad("udp_destination_port_15"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_14"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_13"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_12"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_11"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_10"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_9"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_8"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_7"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_6"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_5"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_4"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_3"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_2"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_1"), "RW", 16, field_default(0)),
(field_name_pad("udp_destination_port_0"), "RW", 16, field_default(0)),
(field_name_pad("ip_destination_address_15"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_14"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_13"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_12"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_11"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_10"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_9"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_8"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_7"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_6"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_5"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_4"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_3"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_2"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_1"), "RW", 32, field_default(0)),
(field_name_pad("ip_destination_address_0"), "RW", 32, field_default(0)),
(field_name_pad("eth_destination_mac_15"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_14"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_13"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_12"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_11"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_10"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_9"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_8"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_7"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_6"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_5"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_4"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_3"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_2"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_1"), "RW", 48, field_default(0)),
(field_name_pad("eth_destination_mac_0"), "RW", 48, field_default(0)) );
signal mm_fields_in : std_logic_vector(field_slv_in_len(c_field_arr) - 1 downto 0);
signal mm_fields_out : std_logic_vector(field_slv_out_len(c_field_arr) - 1 downto 0);
signal sdp_bdo_destinations_rd : t_sdp_bdo_destinations_info;
signal sdp_bdo_destinations_wr : t_sdp_bdo_destinations_info;
signal parsed_nof_destinations : natural;
signal parsed_nof_blocks_per_packet : natural;
begin
sdp_bdo_destinations <= sdp_bdo_destinations_rd;
p_sdp_bdo_destinations_rd : process(sdp_bdo_destinations_wr,
parsed_nof_destinations,
parsed_nof_blocks_per_packet)
begin
-- default write assign all fields
sdp_bdo_destinations_rd <= sdp_bdo_destinations_wr;
-- overrule the read only fields
sdp_bdo_destinations_rd.nof_destinations_act <= parsed_nof_destinations;
sdp_bdo_destinations_rd.nof_blocks_per_packet_act <= parsed_nof_blocks_per_packet;
end process;
u_mm_fields: entity mm_lib.mm_fields
generic map(
g_use_slv_in_val => false, -- use FALSE to save logic when always slv_in_val='1'
g_field_arr => c_field_arr
)
port map (
mm_clk => mm_clk,
mm_rst => mm_rst,
mm_mosi => reg_copi,
mm_miso => reg_cipo,
slv_clk => dp_clk,
slv_rst => dp_rst,
slv_in => mm_fields_in,
slv_in_val => '1',
slv_out => mm_fields_out
);
-- add "RO" fields to mm_fields
mm_fields_in(field_hi(c_field_arr, "nof_destinations_act") downto field_lo(c_field_arr, "nof_destinations_act")) <= to_uvec(sdp_bdo_destinations_rd.nof_destinations_act, 8);
mm_fields_in(field_hi(c_field_arr, "nof_blocks_per_packet_act") downto field_lo(c_field_arr, "nof_blocks_per_packet_act")) <= to_uvec(sdp_bdo_destinations_rd.nof_blocks_per_packet_act, 8);
-- get "RW" fields from mm_fields
sdp_bdo_destinations_wr.eth_destination_mac_arr(0) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_0") downto field_lo(c_field_arr, "eth_destination_mac_0"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(1) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_1") downto field_lo(c_field_arr, "eth_destination_mac_1"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(2) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_2") downto field_lo(c_field_arr, "eth_destination_mac_2"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(3) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_3") downto field_lo(c_field_arr, "eth_destination_mac_3"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(4) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_4") downto field_lo(c_field_arr, "eth_destination_mac_4"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(5) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_5") downto field_lo(c_field_arr, "eth_destination_mac_5"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(6) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_6") downto field_lo(c_field_arr, "eth_destination_mac_6"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(7) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_7") downto field_lo(c_field_arr, "eth_destination_mac_7"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(8) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_8") downto field_lo(c_field_arr, "eth_destination_mac_8"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(9) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_9") downto field_lo(c_field_arr, "eth_destination_mac_9"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(10) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_10") downto field_lo(c_field_arr, "eth_destination_mac_10"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(11) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_11") downto field_lo(c_field_arr, "eth_destination_mac_11"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(12) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_12") downto field_lo(c_field_arr, "eth_destination_mac_12"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(13) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_13") downto field_lo(c_field_arr, "eth_destination_mac_13"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(14) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_14") downto field_lo(c_field_arr, "eth_destination_mac_14"));
sdp_bdo_destinations_wr.eth_destination_mac_arr(15) <= mm_fields_out(field_hi(c_field_arr, "eth_destination_mac_15") downto field_lo(c_field_arr, "eth_destination_mac_15"));
sdp_bdo_destinations_wr.ip_destination_address_arr(0) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_0") downto field_lo(c_field_arr, "ip_destination_address_0"));
sdp_bdo_destinations_wr.ip_destination_address_arr(1) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_1") downto field_lo(c_field_arr, "ip_destination_address_1"));
sdp_bdo_destinations_wr.ip_destination_address_arr(2) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_2") downto field_lo(c_field_arr, "ip_destination_address_2"));
sdp_bdo_destinations_wr.ip_destination_address_arr(3) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_3") downto field_lo(c_field_arr, "ip_destination_address_3"));
sdp_bdo_destinations_wr.ip_destination_address_arr(4) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_4") downto field_lo(c_field_arr, "ip_destination_address_4"));
sdp_bdo_destinations_wr.ip_destination_address_arr(5) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_5") downto field_lo(c_field_arr, "ip_destination_address_5"));
sdp_bdo_destinations_wr.ip_destination_address_arr(6) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_6") downto field_lo(c_field_arr, "ip_destination_address_6"));
sdp_bdo_destinations_wr.ip_destination_address_arr(7) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_7") downto field_lo(c_field_arr, "ip_destination_address_7"));
sdp_bdo_destinations_wr.ip_destination_address_arr(8) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_8") downto field_lo(c_field_arr, "ip_destination_address_8"));
sdp_bdo_destinations_wr.ip_destination_address_arr(9) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_9") downto field_lo(c_field_arr, "ip_destination_address_9"));
sdp_bdo_destinations_wr.ip_destination_address_arr(10) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_10") downto field_lo(c_field_arr, "ip_destination_address_10"));
sdp_bdo_destinations_wr.ip_destination_address_arr(11) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_11") downto field_lo(c_field_arr, "ip_destination_address_11"));
sdp_bdo_destinations_wr.ip_destination_address_arr(12) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_12") downto field_lo(c_field_arr, "ip_destination_address_12"));
sdp_bdo_destinations_wr.ip_destination_address_arr(13) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_13") downto field_lo(c_field_arr, "ip_destination_address_13"));
sdp_bdo_destinations_wr.ip_destination_address_arr(14) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_14") downto field_lo(c_field_arr, "ip_destination_address_14"));
sdp_bdo_destinations_wr.ip_destination_address_arr(15) <= mm_fields_out(field_hi(c_field_arr, "ip_destination_address_15") downto field_lo(c_field_arr, "ip_destination_address_15"));
sdp_bdo_destinations_wr.udp_destination_port_arr(0) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_0") downto field_lo(c_field_arr, "udp_destination_port_0"));
sdp_bdo_destinations_wr.udp_destination_port_arr(1) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_1") downto field_lo(c_field_arr, "udp_destination_port_1"));
sdp_bdo_destinations_wr.udp_destination_port_arr(2) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_2") downto field_lo(c_field_arr, "udp_destination_port_2"));
sdp_bdo_destinations_wr.udp_destination_port_arr(3) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_3") downto field_lo(c_field_arr, "udp_destination_port_3"));
sdp_bdo_destinations_wr.udp_destination_port_arr(4) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_4") downto field_lo(c_field_arr, "udp_destination_port_4"));
sdp_bdo_destinations_wr.udp_destination_port_arr(5) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_5") downto field_lo(c_field_arr, "udp_destination_port_5"));
sdp_bdo_destinations_wr.udp_destination_port_arr(6) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_6") downto field_lo(c_field_arr, "udp_destination_port_6"));
sdp_bdo_destinations_wr.udp_destination_port_arr(7) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_7") downto field_lo(c_field_arr, "udp_destination_port_7"));
sdp_bdo_destinations_wr.udp_destination_port_arr(8) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_8") downto field_lo(c_field_arr, "udp_destination_port_8"));
sdp_bdo_destinations_wr.udp_destination_port_arr(9) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_9") downto field_lo(c_field_arr, "udp_destination_port_9"));
sdp_bdo_destinations_wr.udp_destination_port_arr(10) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_10") downto field_lo(c_field_arr, "udp_destination_port_10"));
sdp_bdo_destinations_wr.udp_destination_port_arr(11) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_11") downto field_lo(c_field_arr, "udp_destination_port_11"));
sdp_bdo_destinations_wr.udp_destination_port_arr(12) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_12") downto field_lo(c_field_arr, "udp_destination_port_12"));
sdp_bdo_destinations_wr.udp_destination_port_arr(13) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_13") downto field_lo(c_field_arr, "udp_destination_port_13"));
sdp_bdo_destinations_wr.udp_destination_port_arr(14) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_14") downto field_lo(c_field_arr, "udp_destination_port_14"));
sdp_bdo_destinations_wr.udp_destination_port_arr(15) <= mm_fields_out(field_hi(c_field_arr, "udp_destination_port_15") downto field_lo(c_field_arr, "udp_destination_port_15"));
sdp_bdo_destinations_wr.nof_destinations <= to_uint(mm_fields_out(field_hi(c_field_arr, "nof_destinations") downto field_lo(c_field_arr, "nof_destinations")));
sdp_bdo_destinations_wr.nof_blocks_per_packet <= to_uint(mm_fields_out(field_hi(c_field_arr, "nof_blocks_per_packet") downto field_lo(c_field_arr, "nof_blocks_per_packet")));
parsed_nof_destinations <= func_sdp_parse_nof_destinations(
sdp_bdo_destinations_wr.nof_destinations);
parsed_nof_blocks_per_packet <= func_sdp_parse_nof_blocks_per_packet(
sdp_bdo_destinations_wr.nof_blocks_per_packet,
sdp_bdo_destinations_wr.nof_destinations);
end str;
......@@ -112,7 +112,9 @@ package sdp_pkg is
constant c_sdp_W_local_oscillator : natural := 16; -- = w in s(w, p), s = signed
constant c_sdp_W_local_oscillator_fraction : natural := 15; -- = p in s(w, p)
constant c_sdp_W_local_oscillator_magnitude : natural := c_sdp_W_local_oscillator - c_sdp_W_local_oscillator_fraction - 1; -- = 0
constant c_sdp_N_ring_nof_mac10g : natural := 3; -- for sdp_station_xsub_ring design.
constant c_sdp_N_ring_nof_mac10g : natural := 3; -- for sdp_station_xsub_ring design.
constant c_sdp_N_bdo_nof_destinations_max : natural := 16;
constant c_sdp_N_bdo_reorder_nof_blocks_max : natural := 16;
-- Derived constants
constant c_sdp_FS_adc : natural := 2**(c_sdp_W_adc - 1); -- full scale FS corresponds to amplitude 1.0, will just cause clipping of +FS to +FS-1
......@@ -401,7 +403,7 @@ package sdp_pkg is
end record;
-----------------------------------------------------------------------------
-- Beamlet output via 10GbE to CEP (= central processor, see ICD STAT-CEP)
-- Beamlet data output (BDO) via 10GbE to CEP (= central processor, see ICD STAT-CEP)
-----------------------------------------------------------------------------
constant c_sdp_cep_version_id : natural := 5;
constant c_sdp_marker_beamlets : natural := 98; -- = x"62" = 'b'
......@@ -424,6 +426,43 @@ package sdp_pkg is
constant c_sdp_cep_payload_nof_longwords : natural := c_sdp_cep_nof_beamlets_per_packet / c_sdp_nof_beamlets_per_longword; -- = 976
constant c_sdp_cep_packet_nof_longwords : natural := ceil_div(c_sdp_cep_header_len, c_longword_sz) + c_sdp_cep_payload_nof_longwords; -- without tail CRC, the CRC is applied by 10GbE MAC
-- Beamlet data output (BDO) multiple destinations
constant c_sdp_bdo_destinations_info_nof_hdr_fields : natural := c_sdp_N_bdo_nof_destinations_max * 3 + 4; -- = 52 fields
type t_sdp_bdo_destinations_info is record
eth_destination_mac_arr : t_slv_48_arr(c_sdp_N_bdo_nof_destinations_max - 1 downto 0);
ip_destination_address_arr : t_slv_32_arr(c_sdp_N_bdo_nof_destinations_max - 1 downto 0);
udp_destination_port_arr : t_slv_16_arr(c_sdp_N_bdo_nof_destinations_max - 1 downto 0);
nof_destinations : natural;
nof_destinations_act : natural;
nof_blocks_per_packet : natural;
nof_blocks_per_packet_act : natural;
end record;
constant t_sdp_bdo_destinations_info_rst : t_sdp_bdo_destinations_info :=
( (others => (others => '0')),
(others => (others => '0')),
(others => (others => '0')), 0, 0, 0, 0 );
-- Determine maximum nof_blocks_per_packet as function of nof_destinations:
-- . Use same number of nof_blocks_per_packet for each destination.
-- . In total there are maximum c_sdp_N_bdo_reorder_nof_blocks_max = 16 blocks to
-- distribute over N destinations, so floor(16 / N) per destination yields:
-- N = 1:16 --> 16, 8, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1
-- . With 1 destination c_sdp_cep_nof_blocks_per_packet = 4 can fit in a jumbo frame.
-- . With N destinations N * c_sdp_cep_nof_blocks_per_packet can fit in a jumbo frame,
-- because the number of beamlets per destination reduces by N.
-- N = 1:16 --> 4 * [1, 2, 3, 4, 5 ,6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
-- . Taking smallest yields the actual maximum number of blocks per packet
-- per destination, as function of nof_destinations N:
-- N = 1:16 --> 4, 8, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1
constant c_sdp_nof_blocks_per_packet_max_per_destination_arr : t_natural_arr(1 to c_sdp_N_bdo_nof_destinations_max) :=
(4, 8, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1);
function func_sdp_parse_nof_destinations(nof_destinations : natural) return natural;
function func_sdp_parse_nof_blocks_per_packet(nof_blocks_per_packet, nof_destinations : natural) return natural;
-- CEP packet header
constant c_sdp_cep_nof_hdr_fields : natural := 3 + 12 + 4 + 4 + 9 + 6 + 1; -- = 39 fields
-- c_sdp_cep_header_len / c_longword_sz = 74 / 8 = 9.25 64b words = 592b
-- hdr_field_sel bit selects where the hdr_field value is set:
......@@ -689,7 +728,6 @@ package sdp_pkg is
function func_sdp_map_crosslets_info(info_slv : std_logic_vector) return t_sdp_crosslets_info; -- map all c_sdp_N_crosslets_max offsets
function func_sdp_map_crosslets_info(info_rec : t_sdp_crosslets_info) return std_logic_vector; -- map all c_sdp_N_crosslets_max offsets
function func_sdp_step_crosslets_info(info_rec : t_sdp_crosslets_info) return t_sdp_crosslets_info; -- step all c_sdp_N_crosslets_max offsets
end package sdp_pkg;
package body sdp_pkg is
......@@ -1007,4 +1045,27 @@ package body sdp_pkg is
return v_info;
end func_sdp_step_crosslets_info;
function func_sdp_parse_nof_destinations(nof_destinations : natural) return natural is
begin
if nof_destinations = 0 then
return 1;
elsif nof_destinations > c_sdp_N_bdo_nof_destinations_max then
return c_sdp_N_bdo_nof_destinations_max;
else
return nof_destinations;
end if;
end func_sdp_parse_nof_destinations;
function func_sdp_parse_nof_blocks_per_packet(nof_blocks_per_packet, nof_destinations : natural) return natural is
constant c_nof_blocks_per_packet_max : natural := c_sdp_nof_blocks_per_packet_max_per_destination_arr(nof_destinations);
begin
if nof_blocks_per_packet = 0 then
return 1;
elsif nof_blocks_per_packet > c_nof_blocks_per_packet_max then
return c_nof_blocks_per_packet_max;
else
return nof_blocks_per_packet;
end if;
end func_sdp_parse_nof_blocks_per_packet;
end sdp_pkg;
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