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