From dcbffc8fcda6f59a31fba8bfaf0bcdd53dd87679 Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Fri, 23 Jul 2021 15:22:32 +0200
Subject: [PATCH] processed review comments

---
 libraries/base/dp/src/vhdl/dp_stream_pkg.vhd |  7 +++++
 libraries/base/ring/src/vhdl/ring_pkg.vhd    | 33 ++++++++++----------
 libraries/base/ring/src/vhdl/ring_tx.vhd     | 12 +++++--
 3 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
index 677d106cf4..dece1acc5d 100644
--- a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
+++ b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd
@@ -265,6 +265,7 @@ PACKAGE dp_stream_pkg Is
   FUNCTION INCR_DP_SDATA(   vec : STD_LOGIC_VECTOR; dec : INTEGER; w : NATURAL) RETURN STD_LOGIC_VECTOR;  --   signed vec(w-1:0) + dec
   FUNCTION INCR_DP_DSP_DATA(vec : STD_LOGIC_VECTOR; dec : INTEGER; w : NATURAL) RETURN STD_LOGIC_VECTOR;  --   signed vec(w-1:0) + dec
   FUNCTION INCR_DP_BSN(     vec : STD_LOGIC_VECTOR; dec : INTEGER; w : NATURAL) RETURN STD_LOGIC_VECTOR;  -- unsigned vec(w-1:0) + dec
+  FUNCTION INCR_DP_CHANNEL( vec : STD_LOGIC_VECTOR; dec : INTEGER; w : NATURAL) RETURN STD_LOGIC_VECTOR;  -- unsigned vec(w-1:0) + dec
   
   FUNCTION REPLICATE_DP_DATA(  seq  : STD_LOGIC_VECTOR                 ) RETURN STD_LOGIC_VECTOR;  -- replicate seq as often as fits in c_dp_stream_data_w
   FUNCTION UNREPLICATE_DP_DATA(data : STD_LOGIC_VECTOR; seq_w : NATURAL) RETURN STD_LOGIC_VECTOR;  -- unreplicate data to width seq_w, return low seq_w bits and set mismatch MSbits bits to '1'
@@ -578,6 +579,12 @@ PACKAGE BODY dp_stream_pkg IS
   BEGIN
     RETURN RESIZE_DP_BSN(STD_LOGIC_VECTOR(UNSIGNED(vec(w-1 DOWNTO 0)) + dec));
   END INCR_DP_BSN;
+  
+  FUNCTION INCR_DP_CHANNEL(vec : STD_LOGIC_VECTOR; dec : INTEGER; w : NATURAL) RETURN STD_LOGIC_VECTOR IS
+  BEGIN
+    RETURN RESIZE_DP_CHANNEL(STD_LOGIC_VECTOR(UNSIGNED(vec(w-1 DOWNTO 0)) + dec));
+  END INCR_DP_CHANNEL;
+
 
   FUNCTION REPLICATE_DP_DATA(seq : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
     CONSTANT c_seq_w            : NATURAL := seq'LENGTH;
diff --git a/libraries/base/ring/src/vhdl/ring_pkg.vhd b/libraries/base/ring/src/vhdl/ring_pkg.vhd
index 4fd7eb74d8..0dbb79b317 100644
--- a/libraries/base/ring/src/vhdl/ring_pkg.vhd
+++ b/libraries/base/ring/src/vhdl/ring_pkg.vhd
@@ -91,7 +91,7 @@ PACKAGE ring_pkg is
   CONSTANT c_ring_eth_hdr_field_arr : t_common_field_arr(c_ring_eth_nof_hdr_fields-1 DOWNTO 0) := (
       ( field_name_pad("eth_dst_mac"  ), "RW", 48, field_default(c_ring_eth_dst_mac) ), 
       ( field_name_pad("eth_src_mac"  ), "RW", 48, field_default(c_ring_eth_src_mac) ),
-      ( field_name_pad("eth_type"     ), "RW", 16, field_default(c_ring_pkt_type_tb) )
+      ( field_name_pad("eth_type"     ), "RW", 16, field_default(0) )
   );
 
   CONSTANT c_ring_dp_nof_hdr_fields : NATURAL := 6;
@@ -99,44 +99,43 @@ PACKAGE ring_pkg is
   CONSTANT c_ring_dp_hdr_field_arr : t_common_field_arr(c_ring_dp_nof_hdr_fields-1 DOWNTO 0) := (
       ( field_name_pad("eth_dst_mac"  ), "RW", 48, field_default(c_ring_eth_dst_mac) ),  
       ( field_name_pad("eth_src_mac"  ), "RW", 48, field_default(c_ring_eth_src_mac) ),
-      ( field_name_pad("eth_type"     ), "RW", 16, field_default(c_ring_pkt_type_bf) ),
+      ( field_name_pad("eth_type"     ), "RW", 16, field_default(0) ),
       ( field_name_pad("dp_channel"   ), "RW", 16, field_default(0) ),
       ( field_name_pad("dp_sync"      ), "RW",  1, field_default(0) ),
       ( field_name_pad("dp_bsn"       ), "RW", 63, field_default(0) )
   );
 
-  FUNCTION nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL;
-  FUNCTION nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR; -- return vector length is same as hops vector length
+  FUNCTION func_nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL;
+  FUNCTION func_nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR; -- return vector length is same as hops vector length
 
  END PACKAGE ring_pkg;
 
 PACKAGE BODY ring_pkg IS
 
-  FUNCTION nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL IS
+  FUNCTION func_nof_hops_to_source_rn(hops, this_rn, N_rn, lane_dir : NATURAL) RETURN NATURAL IS
     VARIABLE v_source_rn     : INTEGER;
     VARIABLE v_source_rn_nat : NATURAL;
   BEGIN
+
     IF lane_dir > 0 THEN
       v_source_rn := this_rn - hops;
-      IF v_source_rn < 0 THEN -- Cannot use MOD as N_rn is not a constant.
-        v_source_rn := v_source_rn+N_rn;
-      END IF;
     ELSE
       v_source_rn := this_rn + hops;
-      IF v_source_rn > N_rn THEN
-        v_source_rn := v_source_rn-N_rn;
-      END IF;
     END IF;
-    
-    IF (v_source_rn < 0) OR (v_source_rn > N_rn) THEN
-      v_source_rn_nat := N_rn; -- return N_rn (which is out of range) for invalid values. This can happen if nof hops > N_rn.
-    ELSE
-      v_source_rn_nat := v_source_rn;
+
+    IF v_source_rn < 0 THEN -- Cannot use MOD as N_rn is not a constant.
+      v_source_rn := v_source_rn + N_rn;
     END IF;
+
+    IF v_source_rn > N_rn THEN
+      v_source_rn := v_source_rn - N_rn;
+    END IF;
+
+    v_source_rn_nat := v_source_rn;
     RETURN v_source_rn_nat;
   END;
 
-  FUNCTION nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR IS
+  FUNCTION func_nof_hops_to_source_rn(hops, this_rn, N_rn : STD_LOGIC_VECTOR; lane_dir : NATURAL) RETURN STD_LOGIC_VECTOR IS
   BEGIN
     RETURN TO_UVEC(nof_hops_to_source_rn(TO_UINT(hops), TO_UINT(N_rn), TO_UINT(N_rn), lane_dir),hops'LENGTH);
   END;
diff --git a/libraries/base/ring/src/vhdl/ring_tx.vhd b/libraries/base/ring/src/vhdl/ring_tx.vhd
index 3faa729172..113e3f92de 100644
--- a/libraries/base/ring/src/vhdl/ring_tx.vhd
+++ b/libraries/base/ring/src/vhdl/ring_tx.vhd
@@ -76,7 +76,7 @@ ARCHITECTURE str OF ring_tx IS
   CONSTANT c_nof_hdr_fields : NATURAL := sel_a_b(c_use_dp_layer, c_ring_dp_nof_hdr_fields, c_ring_eth_nof_hdr_fields);
   CONSTANT c_hdr_field_sel  : STD_LOGIC_VECTOR(c_nof_hdr_fields-1 DOWNTO 0)   := sel_a_b(c_use_dp_layer, c_ring_dp_hdr_field_sel, c_ring_eth_hdr_field_sel);
   CONSTANT c_hdr_field_arr  : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := sel_a_b(c_use_dp_layer, c_ring_dp_hdr_field_arr, c_ring_eth_hdr_field_arr);
-  CONSTANT c_fifo_size      : NATURAL := 5;
+  CONSTANT c_fifo_size      : NATURAL := 5; -- Large enough to fit ETH/DP header.
 
   SIGNAL validated_sosi   : t_dp_sosi;
   SIGNAL tx_sosi          : t_dp_sosi;
@@ -115,7 +115,11 @@ BEGIN
   p_hop: PROCESS(validated_sosi)
   BEGIN
     tx_sosi <= validated_sosi;
-    tx_sosi.channel <= TO_UVEC(TO_UINT(validated_sosi.channel) + 1, c_dp_stream_channel_w);
+    IF TO_UINT(validate_sosi.channel) >= TO_UINT(N_rn)-1 THEN
+      tx_sosi.channel <= (OTHERS => '0');
+    ELSE
+      tx_sosi.channel <= INCR_DP_CHANNEL(validated_sosi.channel, 1, c_dp_stream_channel_w);
+    END IF;
   END PROCESS;
 
   -- Encode packet header
@@ -126,7 +130,9 @@ BEGIN
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_channel" ) DOWNTO field_lo(c_hdr_field_arr, "dp_channel"  )) <= tx_sosi.channel(c_halfword_w-1 DOWNTO 0);
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_sync"    ) DOWNTO field_lo(c_hdr_field_arr, "dp_sync"     )) <= slv(tx_sosi.sync);
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_bsn"     ) DOWNTO field_lo(c_hdr_field_arr, "dp_bsn"      )) <= tx_sosi.bsn(62 DOWNTO 0);
-  END GENERATE; 
+  END GENERATE;
+
+  -- Lead DP info around the FIFO via hdr_fields_in_reg, to avoid having to pass on the DP info via the FIFO, to save on block RAM.
   hdr_fields_in_reg <= hdr_fields_in WHEN rising_edge(dp_clk) AND tx_sosi.sop = '1' ELSE hdr_fields_in_reg;
 
   -- Fifo for inserting header
-- 
GitLab