diff --git a/applications/rdma_demo/libraries/rdma_icrc_external/src/vhdl/crc_generator.vhd b/applications/rdma_demo/libraries/rdma_icrc_external/src/vhdl/crc_generator.vhd index 24d295a67fb03e6da7b5e96d6990fdcb45e958dc..8f678fce55c749a8ac5432aa5c6ba66ba6f89ddd 100755 --- a/applications/rdma_demo/libraries/rdma_icrc_external/src/vhdl/crc_generator.vhd +++ b/applications/rdma_demo/libraries/rdma_icrc_external/src/vhdl/crc_generator.vhd @@ -68,6 +68,8 @@ -- 2016-02-16 1.0 will Created -- 2019-10-15 1.1 Will Kamp Added support for i_stream.keep, generics to -- control bit reversal and CRC output XOR. +-- 2024-02-27 1.2 R vd Walle Removed byte swap when G_BIT_REVERSE_OUT = +-- (ASTRON) true, only perform bit swap, no byte swap. ------------------------------------------------------------------------------- library ieee; @@ -243,7 +245,7 @@ begin -- architecture rtl v_xor_crc := v_rb_crc xor g_XOR_CRC_OUT; if g_BIT_REVERSE_OUT then - o_crc <= byte_swap(bit_swap(v_xor_crc)); + o_crc <= bit_swap(v_xor_crc); else o_crc <= v_xor_crc; end if; diff --git a/applications/rdma_demo/libraries/rdma_packetiser/cocotb/tb_rdma_packetiser.py b/applications/rdma_demo/libraries/rdma_packetiser/cocotb/tb_rdma_packetiser.py index b58cb4822bc1522874b155906b6690aabe6f7f38..95cf9c4124ff7898574fcc145224222e519c3ffc 100644 --- a/applications/rdma_demo/libraries/rdma_packetiser/cocotb/tb_rdma_packetiser.py +++ b/applications/rdma_demo/libraries/rdma_packetiser/cocotb/tb_rdma_packetiser.py @@ -42,6 +42,7 @@ from cocotb.utils import hexdump from cocotb.triggers import FallingEdge, Timer from cocotb.clock import Clock from cocotb.binary import BinaryValue +from cocotb import logging from dp_bus import DpStream from mm_bus import MMController @@ -98,9 +99,10 @@ def verify_mm_regs(actual_dict, exp_dict): assert actual_dict[k].integer == v["value"], ( f'ERROR: Wrong value when reading back register, expected {k} = {v["value"]} but got {actual_dict[k]}') -async def send_multi_dp_packet(dp_stream: DpStream, data, n): +async def send_multi_dp_packet(dp_stream: DpStream, data, n, gap_size_period = 0): for i in range(n): await cocotb.start_soon(dp_stream.sosi_drv._driver_send(data)) + await Timer(gap_size_period) def carry_around_add(a, b): c = a + b @@ -172,6 +174,8 @@ def verify_header(hdr, exp_hdr): @cocotb.test() async def tb_rdma_packetiser(dut): """Try accessing the design. run with < run -a >""" + #dut._log.setLevel(logging.DEBUG) + # Constants c_bsn_init = 17 # some bsn as starting bsn n_bytes = dut.c_nof_byte.value @@ -180,6 +184,7 @@ async def tb_rdma_packetiser(dut): c_block_len = n_words * n_bytes c_nof_packets_in_msg = 5 c_dma_len = c_block_len * c_nof_packets_in_msg + c_gap_size = 10 # Packet header definition and config hdr_dict = { @@ -272,7 +277,7 @@ async def tb_rdma_packetiser(dut): mm_rd = await read_mm_dict(reg_hdr_dat, hdr_dict) # read back MM registers verify_mm_regs(mm_rd, hdr_dict) # verify that the read (RW)registers are the same as what is written. await FallingEdge(dut.dp_clk) # wait for falling edge/"negedge" - cocotb.start_soon(send_multi_dp_packet(in_stream, snk_in_data, 10)) # Send DP packets + cocotb.start_soon(send_multi_dp_packet(in_stream, snk_in_data, 10, c_gap_size * dpClock.period)) # Send DP packets # Verify output packets for i in range(10): @@ -318,7 +323,7 @@ async def tb_rdma_packetiser(dut): # ICRC could be calculated using the scapy library (if installed) with the code below. # from scapy.layers.l2 import Ether # from scapy.contrib.roce import BTH # for compute_icrc function - # icrc = int.from_bytes(Ether(packet)['BTH'].compute_icrc(None), 'little') + # exp_icrc = int.from_bytes(Ether(packet)['BTH'].compute_icrc(None), 'little') icrc = int.from_bytes(packet[-4:], "big") ones = (0xFF).to_bytes(1, 'little') pseudo_packet = ([ones] * 8 + [packet[14:15]] + diff --git a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser.vhd b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser.vhd index 462ff07b7e61f46855866a901d076d990c9c527d..e142a25e85f2577455418ee0a466ad0269090f94 100644 --- a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser.vhd +++ b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser.vhd @@ -20,16 +20,19 @@ -- Author: R. van der Walle -- Purpose: Packetizes an incoming data stream as RDMA "WRITE" packets. -- Description: see https://support.astron.nl/confluence/x/urT-Bg --- +-- Note: Due to the extra headers being prepended and the latency +-- that is introduced, a gap size of 10 clock cycles between +-- packets is necessary. library IEEE, common_lib, dp_lib, eth_lib, rdma_icrc_external_lib; -use IEEE.std_logic_1164.all; -use common_lib.common_pkg.all; -use common_lib.common_mem_pkg.all; -use common_lib.common_network_layers_pkg.all; -use dp_lib.dp_stream_pkg.all; -use dp_lib.dp_components_pkg.all; -use eth_lib.eth_pkg.all; -use eth_lib.eth_tester_pkg.all; + use IEEE.std_logic_1164.all; + use common_lib.common_pkg.all; + use common_lib.common_mem_pkg.all; + use common_lib.common_network_layers_pkg.all; + use dp_lib.dp_stream_pkg.all; + use dp_lib.dp_components_pkg.all; + use eth_lib.eth_pkg.all; + use eth_lib.eth_tester_pkg.all; + use work.rdma_packetiser_pkg.all; entity rdma_packetiser is generic ( @@ -47,11 +50,6 @@ entity rdma_packetiser is reg_hdr_dat_copi : in t_mem_copi := c_mem_copi_rst; reg_hdr_dat_cipo : out t_mem_cipo; - reg_bsn_monitor_v2_rdma_packetiser_input_copi : in t_mem_copi := c_mem_copi_rst; - reg_bsn_monitor_v2_rdma_packetiser_input_cipo : out t_mem_cipo; - reg_bsn_monitor_v2_rdma_packetiser_output_copi : in t_mem_copi := c_mem_copi_rst; - reg_bsn_monitor_v2_rdma_packetiser_output_cipo : out t_mem_cipo; - snk_in : in t_dp_sosi := c_dp_sosi_rst; snk_out : out t_dp_siso := c_dp_siso_rdy; @@ -63,34 +61,29 @@ entity rdma_packetiser is end rdma_packetiser; architecture str of rdma_packetiser is - constant c_nof_byte : natural := 64; - constant c_data_w : natural := c_nof_byte * c_byte_w; - constant c_max_packet_size : natural := ceil_div(9000, c_nof_byte); - - signal dp_xonoff_sosi : t_dp_sosi := c_dp_sosi_rst; - signal dp_xonoff_siso : t_dp_siso := c_dp_siso_rdy; + constant c_nof_byte : natural := 64; + constant c_data_w : natural := c_nof_byte * c_byte_w; + constant c_max_packet_size : natural := ceil_div(9000, c_nof_byte); + -- dp_offload_tx_v3 needs 8 clock cycles (minimum) to prepend headers + -- even if the header is < 8 words + constant c_latency_dp_offload_tx : natural := 8; + constant c_dp_fifo_latency : natural := 3; + constant c_fifo_size : natural := c_dp_fifo_latency + c_latency_dp_offload_tx; + + signal eth_hdr : std_logic_vector(1023 downto 0) := (others => '0'); signal dp_fifo_data_sosi : t_dp_sosi := c_dp_sosi_rst; signal dp_fifo_data_siso : t_dp_siso := c_dp_siso_rdy; + signal dp_fifo_eth_hdr_sosi : t_dp_sosi := c_dp_sosi_rst; + signal dp_fifo_eth_hdr_siso : t_dp_siso := c_dp_siso_rdy; signal assemble_header_sosi : t_dp_sosi := c_dp_sosi_rst; signal assemble_header_siso : t_dp_siso := c_dp_siso_rdy; signal icrc_sosi : t_dp_sosi := c_dp_sosi_rst; signal icrc_siso : t_dp_siso := c_dp_siso_rdy; begin - -- dp_xonoff to prevent fifo overflow - u_dp_xonoff : entity dp_lib.dp_xonoff - port map ( - rst => dp_rst, - clk => dp_clk, - - in_siso => snk_out, - in_sosi => snk_in, - out_siso => dp_xonoff_siso, - out_sosi => dp_xonoff_sosi - ); - - -- dp_fifo_fill_eop - u_dp_fifo_data : entity dp_lib.dp_fifo_fill_eop_sc + -- dp_fifo for prepending RDMA headers. dp_offload_tx_v3 needs 8 clock cycles + -- (minimum) to prepend headers even if the header is < 8 words. + u_dp_fifo_data : entity dp_lib.dp_fifo_sc generic map ( g_data_w => c_data_w, g_empty_w => c_byte_w, @@ -98,8 +91,7 @@ begin g_use_empty => true, g_use_bsn => true, g_use_sync => true, - g_fifo_size => c_max_packet_size * 2, - g_fifo_fill => c_max_packet_size, + g_fifo_size => c_fifo_size, g_fifo_rl => 1, g_fifo_af_margin => 0, g_fifo_af_xon => 0 @@ -107,34 +99,12 @@ begin port map ( clk => dp_clk, rst => dp_rst, - snk_in => dp_xonoff_sosi, - snk_out => dp_xonoff_siso, + snk_in => snk_in, + snk_out => snk_out, src_out => dp_fifo_data_sosi, src_in => dp_fifo_data_siso ); - -- mms_dp_bsn_monitor_v2 - u_bsn_mon_input : entity dp_lib.mms_dp_bsn_monitor_v2 - generic map ( - g_nof_streams => 1, - g_cross_clock_domain => g_cross_clock_domain, - g_sync_timeout => g_sync_timeout - ) - port map ( - -- Memory-mapped clock domain - mm_rst => mm_rst, - mm_clk => mm_clk, - reg_mosi => reg_bsn_monitor_v2_rdma_packetiser_input_copi, - reg_miso => reg_bsn_monitor_v2_rdma_packetiser_input_cipo, - - -- Streaming clock domain - dp_rst => dp_rst, - dp_clk => dp_clk, - ref_sync => snk_in.sync, - - in_sosi_arr(0) => dp_fifo_data_sosi - ); - u_rdma_assemble_header : entity work.rdma_packetiser_assemble_header generic map ( g_data_w => c_data_w @@ -143,8 +113,8 @@ begin -- Clocks and reset mm_rst => mm_rst, mm_clk => mm_clk, - st_rst => dp_rst, - st_clk => dp_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, -- Streaming interfaces snk_in => dp_fifo_data_sosi, @@ -157,7 +127,10 @@ begin reg_hdr_dat_cipo => reg_hdr_dat_cipo, -- block length in nof octets - block_len => block_len + block_len => block_len, + + -- ETH header to be prepended after icrc computation + eth_hdr => eth_hdr ); u_icrc_append : entity rdma_icrc_external_lib.append_crc_dp_wrapper @@ -172,29 +145,47 @@ begin out_dp_siso => icrc_siso ); - -- mms_dp_bsn_monitor_v2 - u_bsn_mon_output : entity dp_lib.mms_dp_bsn_monitor_v2 + -- dp_fifo after icrc as icrc_append cannot handle backpressure. + -- also buffer for prepending the eth header, . + u_dp_fifo_eth_hdr : entity dp_lib.dp_fifo_sc generic map ( - g_nof_streams => 1, - g_cross_clock_domain => g_cross_clock_domain, - g_sync_timeout => g_sync_timeout + g_data_w => c_data_w, + g_empty_w => c_byte_w, + g_bsn_w => 64, + g_use_empty => true, + g_use_bsn => true, + g_use_sync => true, + g_fifo_size => c_fifo_size, + g_fifo_rl => 1, + g_fifo_af_margin => 0, + g_fifo_af_xon => 0 ) port map ( - -- Memory-mapped clock domain - mm_rst => mm_rst, - mm_clk => mm_clk, - reg_mosi => reg_bsn_monitor_v2_rdma_packetiser_output_copi, - reg_miso => reg_bsn_monitor_v2_rdma_packetiser_output_cipo, - - -- Streaming clock domain - dp_rst => dp_rst, - dp_clk => dp_clk, - ref_sync => snk_in.sync, - - in_sosi_arr(0) => icrc_sosi + clk => dp_clk, + rst => dp_rst, + snk_in => icrc_sosi, + snk_out => icrc_siso, + src_out => dp_fifo_eth_hdr_sosi, + src_in => dp_fifo_eth_hdr_siso ); - src_out <= icrc_sosi; - icrc_siso <= src_in; - + -- dp_offload_tx_v3 + u_dp_offload_tx : entity dp_lib.dp_offload_tx_v3 + generic map ( + g_nof_streams => 1, + g_data_w => c_data_w, + g_symbol_w => c_octet_w, + g_hdr_field_arr => c_rdma_packetiser_eth_hdr_field_arr, + g_hdr_field_sel => c_rdma_packetiser_eth_hdr_field_sel, + g_pipeline_ready => true + ) + port map ( + dp_rst => dp_rst, + dp_clk => dp_clk, + snk_in_arr(0) => dp_fifo_eth_hdr_sosi, + snk_out_arr(0) => dp_fifo_eth_hdr_siso, + src_out_arr(0) => src_out, + src_in_arr(0) => src_in, + hdr_fields_in_arr(0) => eth_hdr + ); end str; diff --git a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_assemble_header.vhd b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_assemble_header.vhd index 9ab165aaf994a8e9caed130beacc04ccc208eec4..5699ea65e28cce9e00aaf33eeaaec8e4aa97ad58 100644 --- a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_assemble_header.vhd +++ b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_assemble_header.vhd @@ -72,8 +72,8 @@ entity rdma_packetiser_assemble_header is ); port ( -- Clocks and reset - st_clk : in std_logic; - st_rst : in std_logic; + dp_clk : in std_logic; + dp_rst : in std_logic; mm_clk : in std_logic; mm_rst : in std_logic; @@ -87,7 +87,10 @@ entity rdma_packetiser_assemble_header is src_out : out t_dp_sosi := c_dp_sosi_rst; src_in : in t_dp_siso := c_dp_siso_rdy; - block_len : in std_logic_vector(c_halfword_w - 1 downto 0) -- in octets + block_len : in std_logic_vector(c_halfword_w - 1 downto 0); -- in octets + + eth_hdr : out std_logic_vector(1023 downto 0) := (others => '0') + ); end rdma_packetiser_assemble_header; @@ -126,25 +129,25 @@ architecture str of rdma_packetiser_assemble_header is constant c_reg_rst : t_reg := (s_first, (others => '1'), (others => '0'), (others => '0'), (others => '0'), 0, 0, 0, 0, 0, 0, 0); signal d, q : t_reg; - signal use_immediate : std_logic; - signal use_msg_cnt_as_immediate : std_logic; - signal immediate_data : std_logic_vector(c_rdma_packetiser_imm_len * c_octet_w - 1 downto 0) := (others => '0'); - signal nof_packets_in_msg : std_logic_vector(c_word_w - 1 downto 0); - signal nof_msg : std_logic_vector(c_word_w - 1 downto 0); - signal dma_len : std_logic_vector(c_word_w - 1 downto 0); -- = block_len * nof_packets_in_msg - signal start_address : std_logic_vector(c_longword_w - 1 downto 0); - - signal hdr_fields_slv_out_mm : std_logic_vector(1023 downto 0) := (others => '0'); - signal hdr_fields_slv_in : std_logic_vector(1023 downto 0) := (others => '0'); - signal hdr_fields_slv_in_first : std_logic_vector(1023 downto 0) := (others => '0'); - signal hdr_fields_slv_in_mid : std_logic_vector(1023 downto 0) := (others => '0'); - signal hdr_fields_slv_in_last : std_logic_vector(1023 downto 0) := (others => '0'); - signal hdr_fields_slv_in_wo : std_logic_vector(1023 downto 0) := (others => '0'); - - signal dp_demux_src_out_arr : t_dp_sosi_arr(c_nof_offload - 1 downto 0) := (others => c_dp_sosi_rst); - signal dp_demux_src_in_arr : t_dp_siso_arr(c_nof_offload - 1 downto 0) := (others => c_dp_siso_rdy); - signal dp_mux_snk_in_arr : t_dp_sosi_arr(c_nof_offload - 1 downto 0) := (others => c_dp_sosi_rst); - signal dp_mux_snk_out_arr : t_dp_siso_arr(c_nof_offload - 1 downto 0) := (others => c_dp_siso_rdy); + signal use_immediate : std_logic; + signal use_msg_cnt_as_immediate : std_logic; + signal immediate_data : std_logic_vector(c_rdma_packetiser_imm_len * c_octet_w - 1 downto 0) := (others => '0'); + signal nof_packets_in_msg : std_logic_vector(c_word_w - 1 downto 0); + signal nof_msg : std_logic_vector(c_word_w - 1 downto 0); + signal dma_len : std_logic_vector(c_word_w - 1 downto 0); -- = block_len * nof_packets_in_msg + signal start_address : std_logic_vector(c_longword_w - 1 downto 0); + + signal hdr_fields_slv_out_mm : std_logic_vector(1023 downto 0) := (others => '0'); + signal hdr_fields_slv_in : std_logic_vector(1023 downto 0) := (others => '0'); + signal hdr_fields_slv_in_first : std_logic_vector(1023 downto 0) := (others => '0'); + signal hdr_fields_slv_in_mid : std_logic_vector(1023 downto 0) := (others => '0'); + signal hdr_fields_slv_in_last : std_logic_vector(1023 downto 0) := (others => '0'); + signal hdr_fields_slv_in_wo : std_logic_vector(1023 downto 0) := (others => '0'); + + signal dp_demux_src_out_arr : t_dp_sosi_arr(c_nof_offload - 1 downto 0) := (others => c_dp_sosi_rst); + signal dp_demux_src_in_arr : t_dp_siso_arr(c_nof_offload - 1 downto 0) := (others => c_dp_siso_rdy); + signal dp_mux_snk_in_arr : t_dp_sosi_arr(c_nof_offload - 1 downto 0) := (others => c_dp_sosi_rst); + signal dp_mux_snk_out_arr : t_dp_siso_arr(c_nof_offload - 1 downto 0) := (others => c_dp_siso_rdy); signal eth_ip_offload_first_snk_in : t_dp_sosi := c_dp_sosi_rst; signal eth_ip_offload_first_snk_out : t_dp_siso := c_dp_siso_rdy; signal eth_ip_offload_first_src_out : t_dp_sosi := c_dp_sosi_rst; @@ -161,7 +164,7 @@ architecture str of rdma_packetiser_assemble_header is signal eth_ip_offload_wo_snk_out : t_dp_siso := c_dp_siso_rdy; signal eth_ip_offload_wo_src_out : t_dp_sosi := c_dp_sosi_rst; signal eth_ip_offload_wo_src_in : t_dp_siso := c_dp_siso_rdy; - signal dp_pipeline_src_out : t_dp_sosi := c_dp_sosi_rst; + signal dp_pipeline_src_out : t_dp_sosi := c_dp_sosi_rst; begin immediate_data <= hdr_fields_slv_out_mm(field_hi(c_rdma_packetiser_mm_field_arr, "immediate_data" ) downto field_lo(c_rdma_packetiser_mm_field_arr, "immediate_data" )); @@ -173,8 +176,8 @@ begin start_address <= hdr_fields_slv_out_mm(field_hi(c_rdma_packetiser_mm_field_arr, "config_start_address" ) downto field_lo(c_rdma_packetiser_mm_field_arr, "config_start_address" )); -- State machine to derive RDMA header fields. - q <= d when rising_edge(st_clk); - p_comb : process(st_rst, q, snk_in, nof_packets_in_msg, start_address, nof_msg, immediate_data, dma_len, block_len, use_immediate) + q <= d when rising_edge(dp_clk); + p_comb : process(dp_rst, q, snk_in, nof_packets_in_msg, start_address, nof_msg, immediate_data, dma_len, block_len, use_immediate) variable v : t_reg; begin v := q; @@ -249,7 +252,7 @@ begin v.nof_packets_in_msg := to_uint(nof_packets_in_msg); end if; - if st_rst = '1' then + if dp_rst = '1' then v := c_reg_rst; end if; @@ -278,8 +281,8 @@ begin g_sel_ctrl_pkt => true ) port map ( - rst => st_rst, - clk => st_clk, + rst => dp_rst, + clk => dp_clk, sel_ctrl => q.sel_ctrl, @@ -304,6 +307,9 @@ begin p_wire_headers : process(hdr_fields_slv_out_mm, use_msg_cnt_as_immediate, q) begin -- set headers. + eth_hdr <= field_select_subset(c_rdma_packetiser_eth_hdr_field_arr, + c_rdma_packetiser_mm_field_arr, + hdr_fields_slv_out_mm); hdr_fields_slv_in_first <= field_select_subset(c_rdma_packetiser_first_hdr_field_arr, c_rdma_packetiser_mm_field_arr, hdr_fields_slv_out_mm); @@ -337,8 +343,8 @@ begin g_pipeline_ready => true ) port map ( - dp_rst => st_rst, - dp_clk => st_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, snk_in_arr(0) => eth_ip_offload_first_snk_in, snk_out_arr(0) => eth_ip_offload_first_snk_out, src_out_arr(0) => eth_ip_offload_first_src_out, @@ -359,8 +365,8 @@ begin g_pipeline_ready => true ) port map ( - dp_rst => st_rst, - dp_clk => st_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, snk_in_arr(0) => eth_ip_offload_mid_snk_in, snk_out_arr(0) => eth_ip_offload_mid_snk_out, src_out_arr(0) => eth_ip_offload_mid_src_out, @@ -381,8 +387,8 @@ begin g_pipeline_ready => true ) port map ( - dp_rst => st_rst, - dp_clk => st_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, snk_in_arr(0) => eth_ip_offload_last_snk_in, snk_out_arr(0) => eth_ip_offload_last_snk_out, src_out_arr(0) => eth_ip_offload_last_src_out, @@ -403,8 +409,8 @@ begin g_pipeline_ready => true ) port map ( - dp_rst => st_rst, - dp_clk => st_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, snk_in_arr(0) => eth_ip_offload_wo_snk_in, snk_out_arr(0) => eth_ip_offload_wo_snk_out, src_out_arr(0) => eth_ip_offload_wo_src_out, @@ -418,8 +424,8 @@ begin -- DP pipeline to correct for state machine latency u_dp_pipeline : entity dp_lib.dp_pipeline port map ( - rst => st_rst, - clk => st_clk, + rst => dp_rst, + clk => dp_clk, snk_in => snk_in, src_out => dp_pipeline_src_out ); @@ -437,8 +443,8 @@ begin port map ( mm_rst => mm_rst, mm_clk => mm_clk, - dp_rst => st_rst, - dp_clk => st_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, reg_hdr_dat_mosi => reg_hdr_dat_copi, reg_hdr_dat_miso => reg_hdr_dat_cipo, snk_in_arr(0) => dp_pipeline_src_out, @@ -470,8 +476,8 @@ begin g_fifo_fill => array_init(0, c_nof_offload) ) port map ( - rst => st_rst, - clk => st_clk, + rst => dp_rst, + clk => dp_clk, sel_ctrl => q.sel_ctrl_delayed, snk_in_arr => dp_mux_snk_in_arr, snk_out_arr => dp_mux_snk_out_arr, diff --git a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_pkg.vhd b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_pkg.vhd index 6909c4c228cfe15996c18f19c6b0b00fe404710b..0b1a9ec103b92ae5a10fb34379c16857b50c3228 100644 --- a/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_pkg.vhd +++ b/applications/rdma_demo/libraries/rdma_packetiser/src/vhdl/rdma_packetiser_pkg.vhd @@ -94,9 +94,9 @@ package rdma_packetiser_pkg is constant c_rdma_packetiser_mm_field_arr : t_common_field_arr( c_rdma_packetiser_mm_nof_fields - 1 downto 0) := ( - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), -- set by M&C - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), -- set by M&C - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), -- fixed + ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), + ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), + ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), -- fixed ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), -- fixed @@ -146,19 +146,25 @@ package rdma_packetiser_pkg is constant c_rdma_packetiser_reg_mm_dat_addr_w : natural := ceil_log2(field_nof_words(c_rdma_packetiser_mm_field_arr, c_word_w)); constant c_rdma_packetiser_reg_mm_dat_addr_span : natural := 2**c_rdma_packetiser_reg_mm_dat_addr_w; + -- ETH header + -- Handeled seperate from the other headers as the ethernet header must be excluded from the icrc checksum computation. + constant c_rdma_packetiser_eth_hdr_nof_fields : natural := 3 ; + constant c_rdma_packetiser_eth_hdr_field_sel : std_logic_vector(c_rdma_packetiser_eth_hdr_nof_fields - 1 downto 0) := (others => '0'); + constant c_rdma_packetiser_eth_hdr_field_arr : t_common_field_arr( + c_rdma_packetiser_eth_hdr_nof_fields - 1 downto 0) := ( + ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), + ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), + ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ) + ); -- RoCEv2 header for first packets and write only packets without immediate data - -- ETH + IP + UDP + Base Transport Header (BTH) + RDMA Extended Transport Header (RETH) - constant c_rdma_packetiser_first_nof_hdr_fields : natural := 3 + 12 + 4 + 13 + 3; + -- IP + UDP + Base Transport Header (BTH) + RDMA Extended Transport Header (RETH) + constant c_rdma_packetiser_first_nof_hdr_fields : natural := 12 + 4 + 13 + 3; constant c_rdma_packetiser_first_hdr_field_sel : std_logic_vector(c_rdma_packetiser_first_nof_hdr_fields - 1 downto 0) := (others => '0'); constant c_rdma_packetiser_first_hdr_field_arr : t_common_field_arr( c_rdma_packetiser_first_nof_hdr_fields - 1 downto 0) := ( - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), - ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), @@ -198,16 +204,12 @@ package rdma_packetiser_pkg is ); -- RoCEv2 header for middle packets and last packets without immediate data. - -- ETH + IP + UDP + Base Transport Header (BTH) - constant c_rdma_packetiser_mid_nof_hdr_fields : natural := 3 + 12 + 4 + 13; + -- IP + UDP + Base Transport Header (BTH) + constant c_rdma_packetiser_mid_nof_hdr_fields : natural := 12 + 4 + 13; constant c_rdma_packetiser_mid_hdr_field_sel : std_logic_vector(c_rdma_packetiser_mid_nof_hdr_fields - 1 downto 0) := (others => '0'); constant c_rdma_packetiser_mid_hdr_field_arr : t_common_field_arr( c_rdma_packetiser_mid_nof_hdr_fields - 1 downto 0) := ( - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), - ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), @@ -242,16 +244,12 @@ package rdma_packetiser_pkg is ); -- RoCEv2 header for last packets with immediate data - -- ETH + IP + UDP + Base Transport Header (BTH) + immediate data - constant c_rdma_packetiser_last_nof_hdr_fields : natural := 3 + 12 + 4 + 13 + 1; + -- IP + UDP + Base Transport Header (BTH) + immediate data + constant c_rdma_packetiser_last_nof_hdr_fields : natural := 12 + 4 + 13 + 1; constant c_rdma_packetiser_last_hdr_field_sel : std_logic_vector(c_rdma_packetiser_last_nof_hdr_fields - 1 downto 0) := (others => '0'); constant c_rdma_packetiser_last_hdr_field_arr : t_common_field_arr( c_rdma_packetiser_last_nof_hdr_fields - 1 downto 0) := ( - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), - ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), @@ -288,16 +286,12 @@ package rdma_packetiser_pkg is ); -- RoCEv2 header for write only packets with immediate data - -- ETH + IP + UDP + Base Transport Header (BTH) + RDMA Extended Transport Header (RETH) + immediate data - constant c_rdma_packetiser_wo_nof_hdr_fields : natural := 3 + 12 + 4 + 13 + 3 + 1; + -- IP + UDP + Base Transport Header (BTH) + RDMA Extended Transport Header (RETH) + immediate data + constant c_rdma_packetiser_wo_nof_hdr_fields : natural := 12 + 4 + 13 + 3 + 1; constant c_rdma_packetiser_wo_hdr_field_sel : std_logic_vector(c_rdma_packetiser_wo_nof_hdr_fields - 1 downto 0) := (others => '0'); constant c_rdma_packetiser_wo_hdr_field_arr : t_common_field_arr( c_rdma_packetiser_wo_nof_hdr_fields - 1 downto 0) := ( - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), - ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), @@ -364,10 +358,12 @@ package body rdma_packetiser_pkg is variable v : t_rdma_packetiser_roce_header; constant c_hdr_field_arr : t_common_field_arr := field_arr; begin - -- eth header - v.eth.dst_mac := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_dst_mac") downto field_lo(c_hdr_field_arr, "eth_dst_mac")); - v.eth.src_mac := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_src_mac") downto field_lo(c_hdr_field_arr, "eth_src_mac")); - v.eth.eth_type := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_type") downto field_lo(c_hdr_field_arr, "eth_type")); + -- eth header (optional) + if field_exists(c_hdr_field_arr, "eth_dst_mac") then -- eth header exists + v.eth.dst_mac := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_dst_mac") downto field_lo(c_hdr_field_arr, "eth_dst_mac")); + v.eth.src_mac := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_src_mac") downto field_lo(c_hdr_field_arr, "eth_src_mac")); + v.eth.eth_type := hdr_fields_raw(field_hi(c_hdr_field_arr, "eth_type") downto field_lo(c_hdr_field_arr, "eth_type")); + end if; -- ip header v.ip.version := hdr_fields_raw(field_hi(c_hdr_field_arr, "ip_version") downto field_lo(c_hdr_field_arr, "ip_version")); @@ -425,11 +421,13 @@ package body rdma_packetiser_pkg is constant c_field_len : natural := field_slv_len(field_arr); variable v : std_logic_vector(c_field_len-1 downto 0) := (others => '0'); constant c_hdr_field_arr : t_common_field_arr := field_arr; - begin - -- eth header - v(field_hi(c_hdr_field_arr, "eth_dst_mac") downto field_lo(c_hdr_field_arr, "eth_dst_mac")) := hdr_fields.eth.dst_mac; - v(field_hi(c_hdr_field_arr, "eth_src_mac") downto field_lo(c_hdr_field_arr, "eth_src_mac")) := hdr_fields.eth.src_mac; - v(field_hi(c_hdr_field_arr, "eth_type") downto field_lo(c_hdr_field_arr, "eth_type")) := hdr_fields.eth.eth_type; + begin + -- eth header (optional) + if field_exists(c_hdr_field_arr, "eth_dst_mac") then -- eth header exists + v(field_hi(c_hdr_field_arr, "eth_dst_mac") downto field_lo(c_hdr_field_arr, "eth_dst_mac")) := hdr_fields.eth.dst_mac; + v(field_hi(c_hdr_field_arr, "eth_src_mac") downto field_lo(c_hdr_field_arr, "eth_src_mac")) := hdr_fields.eth.src_mac; + v(field_hi(c_hdr_field_arr, "eth_type") downto field_lo(c_hdr_field_arr, "eth_type")) := hdr_fields.eth.eth_type; + end if; -- ip header v(field_hi(c_hdr_field_arr, "ip_version") downto field_lo(c_hdr_field_arr, "ip_version")) := hdr_fields.ip.version; diff --git a/applications/rdma_demo/libraries/rdma_packetiser/tb/vhdl/tb_rdma_packetiser_assemble_header.vhd b/applications/rdma_demo/libraries/rdma_packetiser/tb/vhdl/tb_rdma_packetiser_assemble_header.vhd index d4d6c6b101d2bc99249e51cb1e504a552a06eabf..89f38bc41bdfe0ee7b576bd72aa38a48da6393b1 100644 --- a/applications/rdma_demo/libraries/rdma_packetiser/tb/vhdl/tb_rdma_packetiser_assemble_header.vhd +++ b/applications/rdma_demo/libraries/rdma_packetiser/tb/vhdl/tb_rdma_packetiser_assemble_header.vhd @@ -229,7 +229,6 @@ begin -- assign expected values to signal to view in wave window. -- defaults - v_exp_rdma_header.eth.eth_type := x"0800"; v_exp_rdma_header.ip.version := to_uvec(4, 4); v_exp_rdma_header.ip.header_length := to_uvec(5, 4); v_exp_rdma_header.ip.flags := to_uvec(2, 3); @@ -279,8 +278,8 @@ begin g_data_w => g_data_w ) port map ( - st_clk => dp_clk, - st_rst => dp_rst, + dp_clk => dp_clk, + dp_rst => dp_rst, mm_clk => mm_clk, mm_rst => mm_rst,