From b45e5fb2b4bb5fff5b713e52e079e49856d5029a Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Fri, 14 Jan 2022 16:49:08 +0100 Subject: [PATCH] Support header - data block boundary at symbol level (for g_symbol_w <= g_data_w) via g_symbol_w. --- libraries/base/dp/src/vhdl/dp_offload_rx.vhd | 34 +++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/libraries/base/dp/src/vhdl/dp_offload_rx.vhd b/libraries/base/dp/src/vhdl/dp_offload_rx.vhd index 59e71bb079..3cb3907f1f 100644 --- a/libraries/base/dp/src/vhdl/dp_offload_rx.vhd +++ b/libraries/base/dp/src/vhdl/dp_offload_rx.vhd @@ -19,6 +19,27 @@ -- ------------------------------------------------------------------------------- +-- Author: D. van der Schuur, E. Kooistra +-- Purpose: +-- . Split a user-defined header from a data block e.g. to from an Eth frame +-- Description: +-- . The dp_offload_tx_v3 --> dp_offload_rx form a pair. +-- . The header and data block can be split at symbol level, to support a header +-- that does not have an integer number of g_data_w. The header length is +-- defined by c_nof_header_symbols. +-- . The header contents can be monitored and is defined by g_hdr_field_arr. +-- . The data block is output via src_out_arr. If the data block contains an +-- integer number of g_data_w words, then src_out_arr.empty = 0. +-- . Default the g_symbol_w = 0 which implies g_symbol_w = g_data_w. +-- - If the header length is not an integer number of g_data_w, then +-- g_symbol_w has to be set such that c_nof_symbols_per_data and +-- c_nof_header_symbols are both integers. The g_symbol_w is then used +-- to control the split. +-- - If the data block length is not an integer number of g_data_w, then +-- g_symbol_w defines the symbol width of the data and is used to +-- control the snk_out_arr empty field. + + LIBRARY IEEE, common_lib, dp_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; @@ -61,6 +82,7 @@ END dp_offload_rx; ARCHITECTURE str OF dp_offload_rx IS CONSTANT c_symbol_w : NATURAL := sel_a_b(g_symbol_w = 0, g_data_w, g_symbol_w); + CONSTANT c_nof_symbols_per_data : NATURAL := g_data_w / g_symbol_w; CONSTANT c_nof_header_symbols : NATURAL := field_slv_len(g_hdr_field_arr) / c_symbol_w; CONSTANT c_field_sel : STD_LOGIC_VECTOR(g_hdr_field_arr'RANGE) := (OTHERS=>'0');-- Not used in sink mode but requires set range @@ -119,10 +141,12 @@ BEGIN gen_dp_field_blk : FOR i IN 0 TO g_nof_streams-1 GENERATE u_dp_field_blk : ENTITY work.dp_field_blk GENERIC MAP ( - g_field_arr => field_arr_set_mode(g_hdr_field_arr , "RO"), - g_field_sel => c_field_sel, - g_snk_data_w => c_dp_field_blk_snk_data_w, --g_data_w, - g_src_data_w => c_dp_field_blk_src_data_w --field_slv_in_len(field_arr_set_mode(g_hdr_field_arr , "RO")) + g_field_arr => field_arr_set_mode(g_hdr_field_arr , "RO"), + g_field_sel => c_field_sel, + g_snk_data_w => c_dp_field_blk_snk_data_w, --g_data_w, + g_src_data_w => c_dp_field_blk_src_data_w, --field_slv_in_len(field_arr_set_mode(g_hdr_field_arr , "RO")) + g_in_symbol_w => c_symbol_w, + g_out_symbol_w => c_symbol_w ) PORT MAP ( dp_rst => dp_rst, @@ -154,7 +178,7 @@ BEGIN u_dp_tail_remove : ENTITY work.dp_tail_remove GENERIC MAP ( g_data_w => g_data_w, - g_symbol_w => g_data_w, + g_symbol_w => c_symbol_w, g_nof_symbols => sel_a_b(g_remove_crc, g_crc_nof_words, 0) ) PORT MAP ( -- GitLab