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