From 55d7fd229d55b1755aa259f13be4b871b72961b0 Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Fri, 14 Jan 2022 16:51:00 +0100 Subject: [PATCH] Support header - data block boundary at symbol level (for g_symbol_w <= g_data_w) via g_symbol_w. --- .../base/dp/src/vhdl/dp_offload_tx_v3.vhd | 30 +-- .../base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd | 185 ++++++++++++++---- 2 files changed, 162 insertions(+), 53 deletions(-) diff --git a/libraries/base/dp/src/vhdl/dp_offload_tx_v3.vhd b/libraries/base/dp/src/vhdl/dp_offload_tx_v3.vhd index e841015d54..f72352cd69 100644 --- a/libraries/base/dp/src/vhdl/dp_offload_tx_v3.vhd +++ b/libraries/base/dp/src/vhdl/dp_offload_tx_v3.vhd @@ -19,21 +19,25 @@ -- ------------------------------------------------------------------------------- +-- Author: D. van der Schuur, E. Kooistra -- Purpose: --- . Concatenate a user-defined header to a DP frame e.g. to create an Ethernet frame +-- . Concatenate a user-defined header to a data block e.g. to create an Eth +-- frame -- Description: --- . The header contents can be controlled dynamically by data path or MM control (selected by g_hdr_field_sel) --- . The header and data can be concatened at symbol level. The g_symbol_w defines the --- resolution of the empty field. The g_data_w must be an integer multiple of the --- g_symbol_w. If the empty field is not used or if the empty field is always 0 then --- set g_symbol_w = g_data_w. --- . For example to concat header and data for an Ethernet frame use: +-- . The dp_offload_tx_v3 --> dp_offload_rx form a pair. +-- . The header contents can be controlled dynamically by data path or MM +-- control (selected by g_hdr_field_sel) +-- . The header and data can be concatened at symbol level. The g_symbol_w +-- defines the resolution of the empty field. The g_data_w must be an +-- integer multiple of the g_symbol_w. If the empty field is not used or +-- if the empty field is always 0 then set g_symbol_w = g_data_w. +-- . For example to concat header and data block for an Ethernet frame use: -- - g_data_w = 32 (1GbE) or 64 (10GbE) --- - g_symbol_w = c_byte_w = 8 if either the header or the data can have an --- non-zero empty field, so when they are not a multiple of 4 bytes --- (= 32b) or 8 bytes (= 64b). --- g_symbol_w = g_data_w if the empty field is always 0, so the number of bits in --- the header and data are an integer number of g_data_w. +-- - g_symbol_w = c_byte_w = 8 if either the header or the data block can +-- have an non-zero empty field, so when they are not a multiple of +-- 4 bytes (= 32b) or 8 bytes (= 64b). +-- g_symbol_w = g_data_w if the empty field is always 0, so the number of +-- bits in the header and data are an integer number of g_data_w. LIBRARY IEEE, common_lib, technology_lib, mm_lib; @@ -50,7 +54,7 @@ ENTITY dp_offload_tx_v3 IS g_nof_streams : NATURAL; g_data_w : NATURAL; g_symbol_w : NATURAL; - g_hdr_field_arr : t_common_field_arr; -- User defined header fields + g_hdr_field_arr : t_common_field_arr; -- User defined header fields g_hdr_field_sel : STD_LOGIC_VECTOR; -- For each header field, select the source: 0=data path, 1=MM controlled g_pipeline_ready : BOOLEAN := FALSE ); diff --git a/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd b/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd index 8ee34748c9..70d6538309 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd @@ -30,6 +30,23 @@ -- |___________________| | |___________________| -- | -- link_offload_sosi +-- +-- The verification of the header - data block boundary is controlled via +-- g_symbol_w: +-- . g_symbol_w = g_data_w : boundary at g_data_w +-- . g_symbol_w < g_data_w : boundary at g_symbol_w, by reducing the number +-- of the header dp_bsn field by 1 symbol. If the c_bsn_w <= 32 then the +-- header MM interface only needs one MM word to read the header, so +-- therefore there are two sizes of c_expected_tx_hdr_word_arr_* and +-- c_expected_rx_hdr_word_arr_*. +-- +-- Remarks: +-- . The g_flow_control_verify has to be e_active, otherwise the tb fails, +-- probably due to limitation in dp_offload_rx.vhd. +-- . It appears that the tx_hdr_word read values are the MM write values, so +-- read of value from logic fields (with MM override '0', e.g. dp_bsn, +-- eth_src_mac) is not supported. +-- -- Usage: -- > as 10 -- > run -all @@ -54,8 +71,10 @@ ENTITY tb_dp_offload_tx_v3 IS -- general g_flow_control_stimuli : t_dp_flow_control_enum := e_pulse; -- always e_active, e_random or e_pulse flow control g_flow_control_verify : t_dp_flow_control_enum := e_active; -- always e_active, e_random or e_pulse flow control + g_print_en : BOOLEAN := TRUE; -- specific g_data_w : NATURAL := 64; + g_symbol_w : NATURAL := 32; g_pkt_len : NATURAL := 240; g_pkt_gap : NATURAL := 16 ); @@ -67,6 +86,18 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS CONSTANT c_mm_clk_period : TIME := 1 ns; CONSTANT c_dp_clk_period : TIME := 5 ns; + -- Simulate header / payload boundary at g_data_w boundary or at g_symbol_w + -- boundary with one empty symbol, by adapting the size of the header dp_bsn + -- field: + -- . If g_symbol_w = g_data_w then boundary is at g_data_w, so empty is 0. + -- . If g_symbol_w < g_data_w then boundary is at last symbol, so empty is 1. + CONSTANT c_nof_symbols_per_data : NATURAL := g_data_w / g_symbol_w; + CONSTANT c_nof_symbols_per_bsn : NATURAL := c_dp_stream_bsn_w / g_symbol_w; -- = 64 / g_symbol_w + CONSTANT c_bsn_w : NATURAL := sel_a_b(c_nof_symbols_per_data = 1, + g_symbol_w * c_nof_symbols_per_bsn, + g_symbol_w * (c_nof_symbols_per_bsn - 1)); + CONSTANT c_use_shortened_header : BOOLEAN := c_bsn_w <= c_word_w; + -- dp_stream_stimuli CONSTANT c_stimuli_pulse_active : NATURAL := 3; CONSTANT c_stimuli_pulse_period : NATURAL := 4; @@ -96,40 +127,43 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS -- Tx offload ----------------------------------------------------------------------------- -- From apertif_udp_offload_pkg.vhd: - CONSTANT c_udp_offload_nof_hdr_fields : NATURAL := 3+12+4+3; -- 22, 448b; 7 64b words - CONSTANT c_udp_offload_nof_hdr_words : NATURAL := 26; -- 23 single word + 3 double word = 26 32b words + CONSTANT c_udp_offload_nof_hdr_fields : NATURAL := 3+12+4+3; -- 22, 448b; 7 64b words + CONSTANT c_udp_offload_nof_hdr_words_default : NATURAL := 26; -- 23 single word + 3 double word = 26 32b words + CONSTANT c_udp_offload_nof_hdr_words_shortened : NATURAL := c_udp_offload_nof_hdr_words_default - 1; + CONSTANT c_udp_offload_nof_hdr_words : NATURAL := sel_a_b(c_use_shortened_header, c_udp_offload_nof_hdr_words_shortened, c_udp_offload_nof_hdr_words_default); + -- Notes: -- . pre-calculated ip_header_checksum is valid only for UNB0, FN0 targeting IP 10.10.10.10 -- . udp_total_length = 176 beamlets * 64b / 8b = 1408B + 14 DP bytes + 8 UDP bytes = 1430B CONSTANT c_udp_offload_hdr_field_arr : t_common_field_arr(c_udp_offload_nof_hdr_fields-1 DOWNTO 0) := ( -- index - ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(x"001B214368AC") ), -- 21 - ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(x"0123456789AB") ), -- 20 - ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), -- 19 - ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), -- 18 - ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), -- 17 - ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), -- 16 - ( field_name_pad("ip_total_length" ), "RW", 16, field_default(1450) ), -- 15 - ( field_name_pad("ip_identification" ), "RW", 16, field_default(0) ), -- 14 - ( field_name_pad("ip_flags" ), "RW", 3, field_default(2) ), -- 13 - ( field_name_pad("ip_fragment_offset" ), "RW", 13, field_default(0) ), -- 12 - ( field_name_pad("ip_time_to_live" ), "RW", 8, field_default(127) ), -- 11 - ( field_name_pad("ip_protocol" ), "RW", 8, field_default(17) ), -- 10 - ( field_name_pad("ip_header_checksum" ), "RW", 16, field_default(29928) ), -- 9 - ( field_name_pad("ip_src_addr" ), "RW", 32, field_default(x"C0A80009") ), -- 8 - ( field_name_pad("ip_dst_addr" ), "RW", 32, field_default(x"C0A80001") ), -- 7 - ( field_name_pad("udp_src_port" ), "RW", 16, field_default(0) ), -- 6 - ( field_name_pad("udp_dst_port" ), "RW", 16, field_default(0) ), -- 5 - ( field_name_pad("udp_total_length" ), "RW", 16, field_default(1430) ), -- 4 - ( field_name_pad("udp_checksum" ), "RW", 16, field_default(0) ), -- 3 - ( field_name_pad("dp_reserved" ), "RW", 47, field_default(x"010203040506") ), -- 2 - ( field_name_pad("dp_sync" ), "RW", 1, field_default(0) ), -- 1 - ( field_name_pad("dp_bsn" ), "RW", 64, field_default(0) ) ); -- 0 + ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(x"001B214368AC") ), -- 21 + ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(x"0123456789AB") ), -- 20 + ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), -- 19 + ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), -- 18 + ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), -- 17 + ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), -- 16 + ( field_name_pad("ip_total_length" ), "RW", 16, field_default(1450) ), -- 15 + ( field_name_pad("ip_identification" ), "RW", 16, field_default(0) ), -- 14 + ( field_name_pad("ip_flags" ), "RW", 3, field_default(2) ), -- 13 + ( field_name_pad("ip_fragment_offset" ), "RW", 13, field_default(0) ), -- 12 + ( field_name_pad("ip_time_to_live" ), "RW", 8, field_default(127) ), -- 11 + ( field_name_pad("ip_protocol" ), "RW", 8, field_default(17) ), -- 10 + ( field_name_pad("ip_header_checksum" ), "RW", 16, field_default(29928) ), -- 9 + ( field_name_pad("ip_src_addr" ), "RW", 32, field_default(x"C0A80009") ), -- 8 + ( field_name_pad("ip_dst_addr" ), "RW", 32, field_default(x"C0A80001") ), -- 7 + ( field_name_pad("udp_src_port" ), "RW", 16, field_default(0) ), -- 6 + ( field_name_pad("udp_dst_port" ), "RW", 16, field_default(0) ), -- 5 + ( field_name_pad("udp_total_length" ), "RW", 16, field_default(1430) ), -- 4 + ( field_name_pad("udp_checksum" ), "RW", 16, field_default(0) ), -- 3 + ( field_name_pad("dp_reserved" ), "RW", 47, field_default(x"010203040506") ), -- 2 + ( field_name_pad("dp_sync" ), "RW", 1, field_default(0) ), -- 1 + ( field_name_pad("dp_bsn" ), "RW", c_bsn_w, field_default(0) ) ); -- 0 -- TX: Corresponding storage of c_udp_offload_hdr_field_arr in MM register words -- . Note: It appears that the tx_hdr_word read values are the MM write values, so read of value from logic fields (with MM override '0', e.g. dp_bsn, eth_src_mac) is not supported. - CONSTANT c_expected_tx_hdr_word_arr : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words-1) := ( -- word address + CONSTANT c_expected_tx_hdr_word_arr_default : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_default-1) := ( -- word address X"00000000", -- 0 = dp_bsn[31:0] -- readback is MM value, not the logic value - X"00000000", -- 1 = dp_bsn[63:32] + X"00000000", -- 1 = dp_bsn[c_bsn_w-1:32] X"00000000", -- 2 = dp_sync X"03040506", -- 3 = dp_reserved[31:0] X"00000102", -- 4 = dp_reserved[47:32] @@ -155,10 +189,37 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS X"214368AC", -- 24 = eth_dst_mac[31:0] X"0000001B"); -- 25 = eth_dst_mac[47:32] + CONSTANT c_expected_tx_hdr_word_arr_shortened : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_shortened-1) := ( -- word address + X"00000000", -- 0 = dp_bsn[31:0] -- readback is MM value, not the logic value + X"00000000", -- 1 = dp_sync + X"03040506", -- 2 = dp_reserved[31:0] + X"00000102", -- 3 = dp_reserved[47:32] + X"00000000", -- 4 = udp_checksum + X"00000596", -- 5 = udp_total_length + X"00000000", -- 6 = udp_dst_port + X"00000000", -- 7 = udp_src_port -- readback is MM value, not the logic value + X"C0A80001", -- 8 = ip_dst_addr + X"C0A80009", -- 9 = ip_src_addr + X"000074E8", -- 10 = ip_header_checksum + X"00000011", -- 11 = ip_protocol + X"0000007F", -- 12 = ip_time_to_live + X"00000000", -- 13 = ip_fragment_offset + X"00000002", -- 14 = ip_flags + X"00000000", -- 15 = ip_identification + X"000005AA", -- 16 = ip_total_length + X"00000000", -- 17 = ip_services + X"00000005", -- 18 = ip_header_length + X"00000004", -- 19 = ip_version + X"00000800", -- 20 = eth_type[15:0] + X"456789AB", -- 21 = eth_src_mac[31:0] -- readback is MM value, not the logic value + X"00000123", -- 22 = eth_src_mac[47:32] + X"214368AC", -- 23 = eth_dst_mac[31:0] + X"0000001B"); -- 24 = eth_dst_mac[47:32] + -- RX: Corresponding storage of c_udp_offload_hdr_field_arr in MM register words - CONSTANT c_expected_rx_hdr_word_arr : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words-1) := ( -- word address + CONSTANT c_expected_rx_hdr_word_arr_default : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_default-1) := ( -- word address X"00000002", -- 0 = dp_bsn[31:0] -- dynamic value obtained from simulation - X"00000000", -- 1 = dp_bsn[63:32] + X"00000000", -- 1 = dp_bsn[c_bsn_w-1:32] X"00000001", -- 2 = dp_sync -- dynamic value obtained from simulation X"03040506", -- 3 = dp_reserved[31:0] X"00000102", -- 4 = dp_reserved[47:32] @@ -184,6 +245,33 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS X"214368AC", -- 24 = eth_dst_mac[31:0] X"0000001B"); -- 25 = eth_dst_mac[47:32] + CONSTANT c_expected_rx_hdr_word_arr_shortened : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_shortened-1) := ( -- word address + X"00000002", -- 0 = dp_bsn[31:0] -- dynamic value obtained from simulation + X"00000001", -- 1 = dp_sync -- dynamic value obtained from simulation + X"03040506", -- 2 = dp_reserved[31:0] + X"00000102", -- 3 = dp_reserved[47:32] + X"00000000", -- 4 = udp_checksum + X"00000596", -- 5 = udp_total_length + X"00000000", -- 6 = udp_dst_port + X"00000000", -- 7 = udp_src_port + X"C0A80001", -- 8 = ip_dst_addr + X"C0A80009", -- 9 = ip_src_addr + X"000074E8", -- 10 = ip_header_checksum + X"00000011", -- 11 = ip_protocol + X"0000007F", -- 12 = ip_time_to_live + X"00000000", -- 13 = ip_fragment_offset + X"00000002", -- 14 = ip_flags + X"00000000", -- 15 = ip_identification + X"000005AA", -- 16 = ip_total_length + X"00000000", -- 17 = ip_services + X"00000005", -- 18 = ip_header_length + X"00000004", -- 19 = ip_version + X"00000800", -- 20 = eth_type[15:0] + X"86080000", -- 21 = eth_src_mac[31:0] -- readback is the logic value x"00228608" & id_backplane = 0 & id_chip = 0 (c_NODE_ID = 0) + X"00000022", -- 22 = eth_src_mac[47:32] + X"214368AC", -- 23 = eth_dst_mac[31:0] + X"0000001B"); -- 24 = eth_dst_mac[47:32] + -- From apertif_unb1_fn_beamformer_udp_offload.vhd: 221 111111111000 0000 000 -- Override ('1') only the Ethernet fields so we can use MM defaults there. 109 876543210987 6543 210 CONSTANT c_hdr_field_ovr_init : STD_LOGIC_VECTOR(c_udp_offload_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111111"&"1111"&"100"; @@ -405,13 +493,13 @@ BEGIN tx_hdr_fields_in_arr(0)(field_hi(c_udp_offload_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_udp_offload_hdr_field_arr, "ip_src_addr" )) <= x"0A63" & id_backplane & INCR_UVEC(id_chip, 1); tx_hdr_fields_in_arr(0)(field_hi(c_udp_offload_hdr_field_arr, "dp_sync" ) DOWNTO field_lo(c_udp_offload_hdr_field_arr, "dp_sync" )) <= slv(dp_offload_tx_snk_in_arr(0).sync); - tx_hdr_fields_in_arr(0)(field_hi(c_udp_offload_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_udp_offload_hdr_field_arr, "dp_bsn" )) <= dp_offload_tx_snk_in_arr(0).bsn(63 DOWNTO 0); + tx_hdr_fields_in_arr(0)(field_hi(c_udp_offload_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_udp_offload_hdr_field_arr, "dp_bsn" )) <= dp_offload_tx_snk_in_arr(0).bsn(c_bsn_w-1 DOWNTO 0); u_tx : ENTITY work.dp_offload_tx_v3 GENERIC MAP ( g_nof_streams => 1, g_data_w => g_data_w, - g_symbol_w => g_data_w, + g_symbol_w => g_symbol_w, g_hdr_field_arr => c_udp_offload_hdr_field_arr, g_hdr_field_sel => c_hdr_field_ovr_init ) @@ -440,19 +528,23 @@ BEGIN VARIABLE v_word : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); BEGIN proc_common_wait_until_hi_lo(dp_clk, tx_offload_sosi_arr(0).sync); - print_str(""); + print_str("", g_print_en); FOR I IN 0 TO c_udp_offload_nof_hdr_words-1 LOOP proc_mem_mm_bus_rd(I, mm_clk, reg_dp_offload_tx_hdr_dat_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); v_word := reg_dp_offload_tx_hdr_dat_miso.rddata(31 DOWNTO 0); -- Log word in transcript window - print_str("tx_hdr_word(" & int_to_str(I) & ") = " & slv_to_hex(v_word)); + print_str("tx_hdr_word(" & int_to_str(I) & ") = " & slv_to_hex(v_word), g_print_en); -- View word in wave window tx_hdr_word <= v_word; -- Verify expected word - ASSERT c_expected_tx_hdr_word_arr(I) = v_word REPORT "Unexpected tx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_tx_hdr_word_arr(I)) SEVERITY ERROR; + IF c_use_shortened_header THEN + ASSERT c_expected_tx_hdr_word_arr_shortened(I) = v_word REPORT "Unexpected tx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_tx_hdr_word_arr_shortened(I)) SEVERITY ERROR; + ELSE + ASSERT c_expected_tx_hdr_word_arr_default(I) = v_word REPORT "Unexpected tx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_tx_hdr_word_arr_default(I)) SEVERITY ERROR; + END IF; END LOOP; - print_str(""); + print_str("", g_print_en); WAIT; END PROCESS; @@ -482,6 +574,7 @@ BEGIN GENERIC MAP ( g_nof_streams => 1, g_data_w => g_data_w, + g_symbol_w => g_symbol_w, g_hdr_field_arr => c_udp_offload_hdr_field_arr, g_remove_crc => FALSE, g_crc_nof_words => 0 @@ -524,19 +617,23 @@ BEGIN -- Check first packet after sync with dp_sync = 1 -- wait some latency until header fields of this sync packet are available via MM proc_common_wait_some_cycles(dp_clk, 10); - print_str(""); + print_str("", g_print_en); FOR I IN 0 TO c_udp_offload_nof_hdr_words-1 LOOP proc_mem_mm_bus_rd(I, mm_clk, reg_dp_offload_rx_hdr_dat_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); v_word := reg_dp_offload_rx_hdr_dat_miso.rddata(31 DOWNTO 0); -- Log word in transcript window - print_str("rx_hdr_word(" & int_to_str(I) & ") : " & slv_to_hex(v_word)); + print_str("rx_hdr_word(" & int_to_str(I) & ") : " & slv_to_hex(v_word), g_print_en); -- View word in wave window rx_hdr_word <= v_word; -- Verify expected word - ASSERT v_word = c_expected_rx_hdr_word_arr(I) REPORT "Unexpected rx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_rx_hdr_word_arr(I)) SEVERITY ERROR; + IF c_use_shortened_header THEN + ASSERT v_word = c_expected_rx_hdr_word_arr_shortened(I) REPORT "Unexpected rx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_rx_hdr_word_arr_shortened(I)) SEVERITY ERROR; + ELSE + ASSERT v_word = c_expected_rx_hdr_word_arr_default(I) REPORT "Unexpected rx_hdr_word at address " & int_to_str(I) & ", expected " & slv_to_hex(c_expected_rx_hdr_word_arr_default(I)) SEVERITY ERROR; + END IF; END LOOP; - print_str(""); + print_str("", g_print_en); -- Check dp_bsn and dp_sync of second packet after sync with dp_sync = 0 proc_common_wait_until_hi_lo(dp_clk, verify_snk_in.sop); @@ -547,9 +644,17 @@ BEGIN proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); v_word := reg_dp_offload_rx_hdr_dat_miso.rddata(31 DOWNTO 0); rx_hdr_word <= v_word; -- View word in wave window - ASSERT v_word = INCR_UVEC(c_expected_rx_hdr_word_arr(0), 1) REPORT "Unexpected dp_bsn from MM" SEVERITY ERROR; + IF c_use_shortened_header THEN + ASSERT v_word = INCR_UVEC(c_expected_rx_hdr_word_arr_shortened(0), 1) REPORT "Unexpected dp_bsn from MM" SEVERITY ERROR; + ELSE + ASSERT v_word = INCR_UVEC(c_expected_rx_hdr_word_arr_default(0), 1) REPORT "Unexpected dp_bsn from MM" SEVERITY ERROR; + END IF; -- dp_sync - proc_mem_mm_bus_rd(2, mm_clk, reg_dp_offload_rx_hdr_dat_mosi); + IF c_use_shortened_header THEN + proc_mem_mm_bus_rd(1, mm_clk, reg_dp_offload_rx_hdr_dat_mosi); + ELSE + proc_mem_mm_bus_rd(2, mm_clk, reg_dp_offload_rx_hdr_dat_mosi); + END IF; proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); v_word := reg_dp_offload_rx_hdr_dat_miso.rddata(31 DOWNTO 0); rx_hdr_word <= v_word; -- View word in wave window -- GitLab