diff --git a/libraries/io/eth/src/vhdl/eth.vhd b/libraries/io/eth/src/vhdl/eth.vhd index 41199495c1cfd74b367837908891f8ff212ad539..c1f1c6f62b8623744cb693ee12a8ceb9f0170687 100644 --- a/libraries/io/eth/src/vhdl/eth.vhd +++ b/libraries/io/eth/src/vhdl/eth.vhd @@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib, tech_tse_lib, technology_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_total_header_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; USE tech_tse_lib.tech_tse_pkg.ALL; USE work.eth_pkg.ALL; USE technology_lib.technology_select_pkg.ALL; @@ -133,14 +133,14 @@ ARCHITECTURE str OF eth IS SIGNAL eth_rx_siso : t_dp_siso; SIGNAL eth_rx_sosi : t_dp_sosi; - SIGNAL rx_frame_rd : STD_LOGIC; - SIGNAL rx_frame_ack : STD_LOGIC; - SIGNAL rx_frame_done : STD_LOGIC; - SIGNAL rx_frame_sosi : t_dp_sosi; - SIGNAL rx_frame_hdr_words : t_eth_total_header_arr; - SIGNAL rx_frame_hdr_fields : t_eth_total_header; - SIGNAL rx_frame_hdr_status : t_eth_hdr_status; - SIGNAL rx_frame_crc_word : STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0); + SIGNAL rx_frame_rd : STD_LOGIC; + SIGNAL rx_frame_ack : STD_LOGIC; + SIGNAL rx_frame_done : STD_LOGIC; + SIGNAL rx_frame_sosi : t_dp_sosi; + SIGNAL rx_frame_hdr_words_arr : t_network_total_header_32b_arr; + SIGNAL rx_frame_hdr_fields : t_network_total_header; + SIGNAL rx_frame_hdr_status : t_eth_hdr_status; + SIGNAL rx_frame_crc_word : STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0); -- ETH Tx SIGNAL eth_tx_siso : t_dp_siso; @@ -434,7 +434,7 @@ BEGIN snk_in => rx_frame_sosi, -- Header info - hdr_words => rx_frame_hdr_words, + hdr_words_arr => rx_frame_hdr_words_arr, hdr_fields => rx_frame_hdr_fields, hdr_status => rx_frame_hdr_status ); @@ -492,7 +492,7 @@ BEGIN rcv_ack => rx_frame_ack, rcv_done => rx_frame_done, rcv_in => rx_frame_sosi, - rcv_hdr_words => rx_frame_hdr_words, + rcv_hdr_words_arr => rx_frame_hdr_words_arr, rcv_hdr_status => rx_frame_hdr_status, -- Streaming source Tx frame diff --git a/libraries/io/eth/src/vhdl/eth_control.vhd b/libraries/io/eth/src/vhdl/eth_control.vhd index 1f42b2725b711a4c364bfe55fa188455e1598f28..c9f05abf52f6ac95e75079241ce81108207231b5 100644 --- a/libraries/io/eth/src/vhdl/eth_control.vhd +++ b/libraries/io/eth/src/vhdl/eth_control.vhd @@ -25,8 +25,8 @@ USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; USE work.eth_pkg.ALL; ENTITY eth_control IS @@ -48,7 +48,7 @@ ENTITY eth_control IS rcv_ack : IN STD_LOGIC; rcv_done : IN STD_LOGIC; rcv_in : IN t_dp_sosi; -- packet memory is always ready for packet data - rcv_hdr_words : IN t_eth_total_header_arr; + rcv_hdr_words_arr : IN t_network_total_header_32b_arr; rcv_hdr_status : IN t_eth_hdr_status; -- Streaming source Tx frame @@ -77,54 +77,54 @@ ARCHITECTURE rtl OF eth_control IS s_tx_done ); - SIGNAL nxt_rcv_rd : STD_LOGIC; - SIGNAL rcv_in_eop_dly : STD_LOGIC; + SIGNAL nxt_rcv_rd : STD_LOGIC; + SIGNAL rcv_in_eop_dly : STD_LOGIC; - SIGNAL hdr_response : t_eth_total_header_arr; - SIGNAL nxt_hdr_response : t_eth_total_header_arr; - SIGNAL hdr_word_cnt : NATURAL RANGE 0 TO c_eth_total_header_nof_words := c_eth_total_header_nof_words; - SIGNAL nxt_hdr_word_cnt : NATURAL; - SIGNAL hdr_en : STD_LOGIC; - SIGNAL nxt_hdr_en : STD_LOGIC; - SIGNAL hdr_done : STD_LOGIC; - SIGNAL nxt_hdr_done : STD_LOGIC; + SIGNAL hdr_response_arr : t_network_total_header_32b_arr; + SIGNAL nxt_hdr_response_arr : t_network_total_header_32b_arr; + SIGNAL hdr_word_cnt : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words := c_network_total_header_32b_nof_words; + SIGNAL nxt_hdr_word_cnt : NATURAL; + SIGNAL hdr_en : STD_LOGIC; + SIGNAL nxt_hdr_en : STD_LOGIC; + SIGNAL hdr_done : STD_LOGIC; + SIGNAL nxt_hdr_done : STD_LOGIC; - SIGNAL tx_insert : STD_LOGIC; - SIGNAL nxt_tx_insert : STD_LOGIC; + SIGNAL tx_insert : STD_LOGIC; + SIGNAL nxt_tx_insert : STD_LOGIC; - SIGNAL i_reg_status : t_eth_mm_reg_status; - SIGNAL nxt_reg_status : t_eth_mm_reg_status; + SIGNAL i_reg_status : t_eth_mm_reg_status; + SIGNAL nxt_reg_status : t_eth_mm_reg_status; - SIGNAL xmt_start : STD_LOGIC; - SIGNAL nxt_xmt_start : STD_LOGIC; - SIGNAL xmt_en : STD_LOGIC; - SIGNAL nxt_xmt_en : STD_LOGIC; - SIGNAL xmt_done : STD_LOGIC; - SIGNAL nxt_xmt_done : STD_LOGIC; - SIGNAL xmt_word_cnt : NATURAL RANGE 0 TO c_eth_frame_nof_words; - SIGNAL nxt_xmt_word_cnt : NATURAL; - SIGNAL tx_nof_words : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0); - SIGNAL nxt_tx_nof_words : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0); - SIGNAL tx_empty : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0); - SIGNAL nxt_tx_empty : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0); + SIGNAL xmt_start : STD_LOGIC; + SIGNAL nxt_xmt_start : STD_LOGIC; + SIGNAL xmt_en : STD_LOGIC; + SIGNAL nxt_xmt_en : STD_LOGIC; + SIGNAL xmt_done : STD_LOGIC; + SIGNAL nxt_xmt_done : STD_LOGIC; + SIGNAL xmt_word_cnt : NATURAL RANGE 0 TO c_eth_frame_nof_words; + SIGNAL nxt_xmt_word_cnt : NATURAL; + SIGNAL tx_nof_words : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0); + SIGNAL nxt_tx_nof_words : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0); + SIGNAL tx_empty : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0); + SIGNAL nxt_tx_empty : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0); - SIGNAL i_mem_in : t_mem_mosi; - SIGNAL nxt_mem_in : t_mem_mosi; - SIGNAL rd_val : STD_LOGIC_VECTOR(0 TO c_mem_ram_rd_latency); -- use [0] to combinatorially store rd (= rd_en) - SIGNAL nxt_rd_val : STD_LOGIC_VECTOR(1 TO c_mem_ram_rd_latency); - SIGNAL rd_sop : STD_LOGIC_VECTOR( rd_val'RANGE); - SIGNAL nxt_rd_sop : STD_LOGIC_VECTOR(nxt_rd_val'RANGE); - SIGNAL rd_eop : STD_LOGIC_VECTOR( rd_val'RANGE); - SIGNAL nxt_rd_eop : STD_LOGIC_VECTOR(nxt_rd_val'RANGE); + SIGNAL i_mem_in : t_mem_mosi; + SIGNAL nxt_mem_in : t_mem_mosi; + SIGNAL rd_val : STD_LOGIC_VECTOR(0 TO c_mem_ram_rd_latency); -- use [0] to combinatorially store rd (= rd_en) + SIGNAL nxt_rd_val : STD_LOGIC_VECTOR(1 TO c_mem_ram_rd_latency); + SIGNAL rd_sop : STD_LOGIC_VECTOR( rd_val'RANGE); + SIGNAL nxt_rd_sop : STD_LOGIC_VECTOR(nxt_rd_val'RANGE); + SIGNAL rd_eop : STD_LOGIC_VECTOR( rd_val'RANGE); + SIGNAL nxt_rd_eop : STD_LOGIC_VECTOR(nxt_rd_val'RANGE); - SIGNAL xmt_siso : t_dp_siso; - SIGNAL xmt_sosi : t_dp_sosi; + SIGNAL xmt_siso : t_dp_siso; + SIGNAL xmt_sosi : t_dp_sosi; - SIGNAL i_xmt_out : t_dp_sosi; + SIGNAL i_xmt_out : t_dp_sosi; -- ST->MM state machine - SIGNAL state : t_state_enum; - SIGNAL nxt_state : t_state_enum; + SIGNAL state : t_state_enum; + SIGNAL nxt_state : t_state_enum; BEGIN @@ -137,7 +137,7 @@ BEGIN IF rst='1' THEN rcv_rd <= '0'; rcv_in_eop_dly <= '0'; - hdr_word_cnt <= c_eth_total_header_nof_words; + hdr_word_cnt <= c_network_total_header_32b_nof_words; hdr_en <= '0'; hdr_done <= '0'; tx_insert <= '0'; @@ -156,7 +156,7 @@ BEGIN ELSIF rising_edge(clk) THEN rcv_rd <= nxt_rcv_rd; rcv_in_eop_dly <= rcv_in.eop; - hdr_response <= nxt_hdr_response; + hdr_response_arr <= nxt_hdr_response_arr; hdr_word_cnt <= nxt_hdr_word_cnt; hdr_en <= nxt_hdr_en; hdr_done <= nxt_hdr_done; @@ -180,18 +180,18 @@ BEGIN -- Response header ------------------------------------------------------------------------------ - p_hdr_response : PROCESS(rcv_hdr_words, rcv_hdr_status, reg_config) + p_hdr_response_arr : PROCESS(rcv_hdr_words_arr, rcv_hdr_status, reg_config) BEGIN - nxt_hdr_response <= func_eth_response_header( rcv_hdr_words, reg_config.mac_address); + nxt_hdr_response_arr <= func_network_total_header_response_eth( rcv_hdr_words_arr, reg_config.mac_address); IF rcv_hdr_status.is_arp='1' THEN - nxt_hdr_response <= func_eth_arp_response_header( rcv_hdr_words, reg_config.mac_address, reg_config.ip_address); + nxt_hdr_response_arr <= func_network_total_header_response_arp( rcv_hdr_words_arr, reg_config.mac_address, reg_config.ip_address); ELSIF rcv_hdr_status.is_icmp='1' THEN - nxt_hdr_response <= func_eth_icmp_response_header(rcv_hdr_words, reg_config.mac_address); + nxt_hdr_response_arr <= func_network_total_header_response_icmp(rcv_hdr_words_arr, reg_config.mac_address); ELSIF rcv_hdr_status.is_udp='1' THEN - nxt_hdr_response <= func_eth_udp_response_header( rcv_hdr_words, reg_config.mac_address); + nxt_hdr_response_arr <= func_network_total_header_response_udp( rcv_hdr_words_arr, reg_config.mac_address); ELSIF rcv_hdr_status.is_ip='1' THEN -- If it is another protocol over IP than ICMP or UDP, then prepare only IP response - nxt_hdr_response <= func_eth_ip_response_header( rcv_hdr_words, reg_config.mac_address); + nxt_hdr_response_arr <= func_network_total_header_response_ip( rcv_hdr_words_arr, reg_config.mac_address); END IF; END PROCESS; @@ -199,7 +199,7 @@ BEGIN -- Frame memory access ------------------------------------------------------------------------------ - p_mem_access : PROCESS(i_mem_in, rcv_in, hdr_en, hdr_word_cnt, hdr_response, xmt_en, xmt_siso, xmt_word_cnt) + p_mem_access : PROCESS(i_mem_in, rcv_in, hdr_en, hdr_word_cnt, hdr_response_arr, xmt_en, xmt_siso, xmt_word_cnt) BEGIN nxt_mem_in.address <= i_mem_in.address; nxt_mem_in.wrdata <= i_mem_in.wrdata; @@ -219,7 +219,7 @@ BEGIN -- Prepare the Tx header IF hdr_en='1' THEN -- tx buffer starts at address 380 nxt_mem_in.address <= TO_MEM_ADDRESS(c_eth_ram_tx_offset + hdr_word_cnt); - nxt_mem_in.wrdata <= RESIZE_MEM_DATA(hdr_response(hdr_word_cnt)); + nxt_mem_in.wrdata <= RESIZE_MEM_DATA(hdr_response_arr(hdr_word_cnt)); nxt_mem_in.wr <= '1'; nxt_hdr_word_cnt <= hdr_word_cnt+1; END IF; @@ -335,7 +335,7 @@ BEGIN nxt_state <= s_hdr_response; END IF; WHEN s_hdr_response => -- prepare tx header for rx response - IF hdr_word_cnt < c_eth_total_header_nof_words-1 THEN + IF hdr_word_cnt < c_network_total_header_32b_nof_words-1 THEN nxt_hdr_en <= '1'; ELSE nxt_hdr_done <= '1'; -- new frame received and response prepared diff --git a/libraries/io/eth/src/vhdl/eth_hdr.vhd b/libraries/io/eth/src/vhdl/eth_hdr.vhd index 1cfb2aea159bd484ed6bbb2b11634f788ea20625..12336bef2e5b74f9311bc80ba558b3ee1cbed1ef 100644 --- a/libraries/io/eth/src/vhdl/eth_hdr.vhd +++ b/libraries/io/eth/src/vhdl/eth_hdr.vhd @@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; USE work.eth_pkg.ALL; -- Description: @@ -43,28 +43,28 @@ ENTITY eth_hdr IS ); PORT ( -- Clocks and reset - rst : IN STD_LOGIC; -- reset synchronous with clk - clk : IN STD_LOGIC; -- packet stream clock + rst : IN STD_LOGIC; -- reset synchronous with clk + clk : IN STD_LOGIC; -- packet stream clock -- Streaming Sink - snk_in : IN t_dp_sosi; - snk_out : OUT t_dp_siso; + snk_in : IN t_dp_sosi; + snk_out : OUT t_dp_siso; -- Streaming Source - src_in : IN t_dp_siso := c_dp_siso_rdy; - src_out : OUT t_dp_sosi; + src_in : IN t_dp_siso := c_dp_siso_rdy; + src_out : OUT t_dp_sosi; -- Frame control - frm_discard : IN STD_LOGIC := '0'; + frm_discard : IN STD_LOGIC := '0'; -- Header info - hdr_words : OUT t_eth_total_header_arr; - hdr_words_val : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); - hdr_fields : OUT t_eth_total_header; - hdr_fields_val : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); - hdr_data : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); - hdr_data_val : OUT STD_LOGIC; - hdr_status : OUT t_eth_hdr_status + hdr_words_arr : OUT t_network_total_header_32b_arr; + hdr_words_arr_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); + hdr_fields : OUT t_network_total_header; + hdr_fields_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); + hdr_data : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + hdr_data_val : OUT STD_LOGIC; + hdr_status : OUT t_eth_hdr_status ); END eth_hdr; @@ -75,13 +75,13 @@ ARCHITECTURE str OF eth_hdr IS CONSTANT c_this_snk_latency : NATURAL := 1; CONSTANT c_this_src_latency : NATURAL := 1; - SIGNAL snk_in_word_cnt : NATURAL RANGE 0 TO c_eth_total_header_nof_words; + SIGNAL snk_in_word_cnt : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words; -- Extract total header - SIGNAL i_hdr_words : t_eth_total_header_arr; - SIGNAL i_hdr_words_val : STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); - SIGNAL i_hdr_fields : t_eth_total_header; - SIGNAL i_hdr_fields_val : STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); + SIGNAL i_hdr_words_arr : t_network_total_header_32b_arr; + SIGNAL i_hdr_words_arr_val : STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); + SIGNAL i_hdr_fields : t_network_total_header; + SIGNAL i_hdr_fields_val : STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); SIGNAL i_hdr_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); SIGNAL i_hdr_data_val : STD_LOGIC; SIGNAL i_hdr_status : t_eth_hdr_status; @@ -89,13 +89,13 @@ ARCHITECTURE str OF eth_hdr IS BEGIN -- Make all header info available - hdr_words <= i_hdr_words; - hdr_words_val <= i_hdr_words_val ; - hdr_fields <= i_hdr_fields; - hdr_fields_val <= i_hdr_fields_val; - hdr_data <= i_hdr_data; - hdr_data_val <= i_hdr_data_val; - hdr_status <= i_hdr_status; + hdr_words_arr <= i_hdr_words_arr; + hdr_words_arr_val <= i_hdr_words_arr_val ; + hdr_fields <= i_hdr_fields; + hdr_fields_val <= i_hdr_fields_val; + hdr_data <= i_hdr_data; + hdr_data_val <= i_hdr_data_val; + hdr_status <= i_hdr_status; ------------------------------------------------------------------------------ -- IP header checksum control @@ -110,7 +110,7 @@ BEGIN clk => clk, -- Stored header - hdr_words => i_hdr_words, + hdr_words_arr => i_hdr_words_arr, hdr_status => i_hdr_status, -- ST interface @@ -135,18 +135,18 @@ BEGIN -- Store 11 header words u_hdr_store : ENTITY work.eth_hdr_store PORT MAP ( - rst => rst, - clk => clk, + rst => rst, + clk => clk, -- Streaming Sink - snk_in => snk_in, - snk_in_word_cnt => snk_in_word_cnt, + snk_in => snk_in, + snk_in_word_cnt => snk_in_word_cnt, -- Total header - hdr_words => i_hdr_words, - hdr_words_val => i_hdr_words_val, - hdr_fields => i_hdr_fields, - hdr_fields_val => i_hdr_fields_val, - hdr_data => i_hdr_data, - hdr_data_val => i_hdr_data_val + hdr_words_arr => i_hdr_words_arr, + hdr_words_arr_val => i_hdr_words_arr_val, + hdr_fields => i_hdr_fields, + hdr_fields_val => i_hdr_fields_val, + hdr_data => i_hdr_data, + hdr_data_val => i_hdr_data_val ); -- Determine header status @@ -155,17 +155,17 @@ BEGIN g_ip_header_checksum_calculate => g_ip_header_checksum_calculate ) PORT MAP ( - rst => rst, - clk => clk, + rst => rst, + clk => clk, -- Total header - hdr_words => i_hdr_words, - hdr_words_val => i_hdr_words_val, - hdr_fields => i_hdr_fields, - hdr_fields_val => i_hdr_fields_val, - hdr_data => i_hdr_data, - hdr_data_val => i_hdr_data_val, + hdr_words_arr => i_hdr_words_arr, + hdr_words_arr_val => i_hdr_words_arr_val, + hdr_fields => i_hdr_fields, + hdr_fields_val => i_hdr_fields_val, + hdr_data => i_hdr_data, + hdr_data_val => i_hdr_data_val, -- Header status - hdr_status => i_hdr_status + hdr_status => i_hdr_status ); END str; diff --git a/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd b/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd index 721f5a77e4f852a6f82284713df7c3bee32427f9..34757f8cc455d05ed4a3c1e6f055e88628a74b26 100644 --- a/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd +++ b/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd @@ -24,13 +24,14 @@ LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; -USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; USE work.eth_pkg.ALL; -- Description: -- . for IP frames replace IP header checksum with the calculated value --- . discard frames shorter than 11 words +-- . discard frames shorter than c_network_total_header_32b_nof_words = 11 words -- . frame discard input to optionally discard a frame based on some header criteria ENTITY eth_hdr_ctrl IS @@ -40,13 +41,13 @@ ENTITY eth_hdr_ctrl IS clk : IN STD_LOGIC; -- Stored header - hdr_words : IN t_eth_total_header_arr; + hdr_words_arr : IN t_network_total_header_32b_arr; hdr_status : IN t_eth_hdr_status; frm_discard : IN STD_LOGIC := '0'; -- ST interface - snk_in_word_cnt : IN NATURAL RANGE 0 TO c_eth_total_header_nof_words; -- snk_in hdr word count + snk_in_word_cnt : IN NATURAL RANGE 0 TO c_network_total_header_32b_nof_words; -- snk_in hdr word count snk_in : IN t_dp_sosi; snk_out : OUT t_dp_siso; src_in : IN t_dp_siso; @@ -80,7 +81,7 @@ ARCHITECTURE rtl OF eth_hdr_ctrl IS SIGNAL next_src_out : t_dp_sosi; SIGNAL i_src_out : t_dp_sosi; SIGNAL nxt_src_out : t_dp_sosi; - SIGNAL src_word_cnt : NATURAL RANGE 0 TO c_eth_total_header_nof_words; + SIGNAL src_word_cnt : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words; SIGNAL nxt_src_word_cnt : NATURAL; BEGIN @@ -130,7 +131,7 @@ BEGIN nxt_snk_in_eop_hold <= '0' WHEN snk_in.sop='1' ELSE '1' WHEN snk_in.eop='1' ELSE snk_in_eop_hold; - p_state : PROCESS(state, src_word_cnt, i_src_out, snk_in, snk_in_word_cnt, frm_discard, src_in, hdr_words, hdr_status, snk_in_eop_hold, next_src_out) + p_state : PROCESS(state, src_word_cnt, i_src_out, snk_in, snk_in_word_cnt, frm_discard, src_in, hdr_words_arr, hdr_status, snk_in_eop_hold, next_src_out) BEGIN snk_out.ready <= '1'; -- default accept sink input nxt_state <= state; @@ -148,7 +149,7 @@ BEGIN END IF; WHEN s_store_header => -- stop the sink when the whole header has arrived or when a eop has arrived - IF snk_in.valid='1' AND snk_in_word_cnt=c_eth_total_header_nof_words-1 THEN + IF snk_in.valid='1' AND snk_in_word_cnt=c_network_total_header_32b_nof_words-1 THEN snk_out.ready <= '0'; nxt_state <= s_src_header_sop; ELSIF snk_in.eop='1' THEN @@ -163,7 +164,7 @@ BEGIN -- discard this frame because of optional external reasons nxt_state <= s_idle; ELSIF src_in.ready='1' THEN - nxt_src_out.data <= RESIZE_DP_DATA(hdr_words(src_word_cnt)); + nxt_src_out.data <= RESIZE_DP_DATA(hdr_words_arr(src_word_cnt)); nxt_src_out.valid <= '1'; nxt_src_out.sop <= '1'; nxt_src_out.eop <= '0'; @@ -174,7 +175,7 @@ BEGIN -- stop the input and output the rest of the (modified) header snk_out.ready <= '0'; IF src_in.ready='1' THEN - nxt_src_out.data <= RESIZE_DP_DATA(hdr_words(src_word_cnt)); + nxt_src_out.data <= RESIZE_DP_DATA(hdr_words_arr(src_word_cnt)); nxt_src_out.valid <= '1'; nxt_src_out.sop <= '0'; nxt_src_out.eop <= '0'; @@ -182,10 +183,10 @@ BEGIN -- Replace IP header checksum with the calculated checksum from hdr_status.ip_checksum: -- . for Rx: the verified checksum, so will be 0 when OK or != when the received frame has an IP header error. -- . for Tx: the calculated checksum for the Tx IP header. - IF hdr_status.is_ip='1' AND src_word_cnt=c_ip_header_checksum_wi THEN - nxt_src_out.data(c_ip_header_checksum_w-1 DOWNTO 0) <= hdr_status.ip_checksum; + IF hdr_status.is_ip='1' AND src_word_cnt=c_network_total_header_32b_ip_header_checksum_wi THEN + nxt_src_out.data(c_network_ip_header_checksum_w-1 DOWNTO 0) <= hdr_status.ip_checksum; END IF; - IF src_word_cnt=c_eth_total_header_nof_words-1 THEN + IF src_word_cnt=c_network_total_header_32b_nof_words-1 THEN IF snk_in_eop_hold='1' THEN -- header only packet nxt_src_out.eop <= '1'; diff --git a/libraries/io/eth/src/vhdl/eth_hdr_status.vhd b/libraries/io/eth/src/vhdl/eth_hdr_status.vhd index 841a1ddbc4bb341d6aca9b6534b2c9e0f0b489a5..55ae50640f6c1d16d9c75688a75baa171399a226 100644 --- a/libraries/io/eth/src/vhdl/eth_hdr_status.vhd +++ b/libraries/io/eth/src/vhdl/eth_hdr_status.vhd @@ -24,8 +24,9 @@ LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; -USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; USE work.eth_pkg.ALL; -- Purpose: @@ -43,19 +44,19 @@ ENTITY eth_hdr_status IS g_ip_header_checksum_calculate : BOOLEAN := TRUE ); PORT ( - rst : IN STD_LOGIC; - clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + clk : IN STD_LOGIC; -- Total header - hdr_words : IN t_eth_total_header_arr; - hdr_words_val : IN STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); - hdr_fields : IN t_eth_total_header; - hdr_fields_val : IN STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); - hdr_data : IN STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); - hdr_data_val : IN STD_LOGIC; + hdr_words_arr : IN t_network_total_header_32b_arr; + hdr_words_arr_val : IN STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); + hdr_fields : IN t_network_total_header; + hdr_fields_val : IN STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); + hdr_data : IN STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + hdr_data_val : IN STD_LOGIC; -- Header status - hdr_status : OUT t_eth_hdr_status + hdr_status : OUT t_eth_hdr_status ); END eth_hdr_status; @@ -86,18 +87,18 @@ BEGIN ------------------------------------------------------------------------------ -- Packet type - nxt_hdr_status.is_arp <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_eth_type_arp AND hdr_fields_val(c_eth_type_wi)='1' ELSE '0'; - nxt_hdr_status.is_ip <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_eth_type_ip AND hdr_fields_val(c_eth_type_wi)='1' ELSE '0'; - nxt_hdr_status.is_icmp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_ip_protocol_icmp AND hdr_fields_val(c_ip_protocol_wi)='1' AND i_hdr_status.is_ip='1' ELSE '0'; - nxt_hdr_status.is_udp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_ip_protocol_udp AND hdr_fields_val(c_ip_protocol_wi)='1' AND i_hdr_status.is_ip='1' ELSE '0'; - nxt_hdr_status.is_dhcp <= '1' WHEN UNSIGNED(hdr_fields.udp.dst_port)=c_udp_port_dhcp_in AND hdr_fields_val(c_udp_dst_port_wi)='1' AND i_hdr_status.is_udp='1' ELSE '0'; + nxt_hdr_status.is_arp <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_network_eth_type_arp AND hdr_fields_val(c_network_total_header_32b_eth_type_wi)='1' ELSE '0'; + nxt_hdr_status.is_ip <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_network_eth_type_ip AND hdr_fields_val(c_network_total_header_32b_eth_type_wi)='1' ELSE '0'; + nxt_hdr_status.is_icmp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_network_ip_protocol_icmp AND hdr_fields_val(c_network_total_header_32b_ip_protocol_wi)='1' AND i_hdr_status.is_ip='1' ELSE '0'; + nxt_hdr_status.is_udp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_network_ip_protocol_udp AND hdr_fields_val(c_network_total_header_32b_ip_protocol_wi)='1' AND i_hdr_status.is_ip='1' ELSE '0'; + nxt_hdr_status.is_dhcp <= '1' WHEN UNSIGNED(hdr_fields.udp.dst_port)=c_network_udp_port_dhcp_in AND hdr_fields_val(c_network_total_header_32b_udp_dst_port_wi)='1' AND i_hdr_status.is_udp='1' ELSE '0'; ------------------------------------------------------------------------------ -- IP Header checksum ip_header.data <= RESIZE_dp_data(hdr_data); - ip_header.valid <= '1' WHEN UNSIGNED(hdr_words_val(c_ip_lo_wi TO c_ip_hi_wi))/=0 ELSE '0'; - ip_header.sop <= hdr_words_val(c_ip_lo_wi); - ip_header.eop <= hdr_words_val(c_ip_hi_wi); + ip_header.valid <= '1' WHEN UNSIGNED(hdr_words_arr_val(c_network_total_header_32b_ip_lo_wi TO c_network_total_header_32b_ip_hi_wi))/=0 ELSE '0'; + ip_header.sop <= hdr_words_arr_val(c_network_total_header_32b_ip_lo_wi); + ip_header.eop <= hdr_words_arr_val(c_network_total_header_32b_ip_hi_wi); ip_header.empty <= (OTHERS=>'0'); -- Calculate the IP header checksum for the packet header diff --git a/libraries/io/eth/src/vhdl/eth_hdr_store.vhd b/libraries/io/eth/src/vhdl/eth_hdr_store.vhd index ea5c60da95f4ac22abc1cb4cb3100395306f565a..777146d4ac340bfb9f6fcb12ba9126f7d7f9a6e6 100644 --- a/libraries/io/eth/src/vhdl/eth_hdr_store.vhd +++ b/libraries/io/eth/src/vhdl/eth_hdr_store.vhd @@ -23,17 +23,17 @@ LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE common_lib.common_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; USE work.eth_pkg.ALL; -- Purpose: -- Provide the total Ethernet header information for the user to decide upon. -- Description: --- Extract the first c_eth_total_header_nof_words = 11 words from an Ethernet --- packet and make them available via as a word array and as records fields. --- The component has three output formats: --- 1) hdr_words, the 11 word header store +-- Extract the first c_network_total_header_32b_nof_words=11 words from an +-- Ethernet packet and make them available via as a word array and as records +-- fields. The component has three output formats: +-- 1) hdr_words_arr, the 11 word header store -- 2) hdr_data, the currently active header word -- 3) hdr_fields, combinatorial mapping of the 11 word header store to -- various Ethernet packet header fields. @@ -45,55 +45,55 @@ USE work.eth_pkg.ALL; -- Remarks: -- . This component acts as a stream monitor, therefore it does not output a -- snk_out.ready. --- . The word indices from eth_pkg together with hdr_words_val[] can be used --- to determine which word of the Ethernet header words is valid. +-- . The word indices from eth_pkg together with hdr_words_arr_val[] can be +-- used to determine which word of the Ethernet header words is valid. -- . The word indices from eth_pkg together with hdr_fields_val[] can be used -- to determine which fields of the Ethernet header records are valid. The --- difference with hdr_words_val is that hdr_words_val is a single cycle --- pulse, whereas hdr_fields_val keeps its state until the next sop. +-- difference with hdr_words_arr_val is that hdr_words_arr_val is a single +-- cycle pulse, whereas hdr_fields_val keeps its state until the next sop. -- ENTITY eth_hdr_store IS PORT ( - rst : IN STD_LOGIC; - clk : IN STD_LOGIC; + rst : IN STD_LOGIC; + clk : IN STD_LOGIC; -- Streaming Sink - snk_in : IN t_dp_sosi; - snk_in_word_cnt : OUT NATURAL RANGE 0 TO c_eth_total_header_nof_words; + snk_in : IN t_dp_sosi; + snk_in_word_cnt : OUT NATURAL RANGE 0 TO c_network_total_header_32b_nof_words; -- Total header - hdr_words : OUT t_eth_total_header_arr; - hdr_words_val : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); + hdr_words_arr : OUT t_network_total_header_32b_arr; + hdr_words_arr_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); -- Combinatorial map of the 11 header words on to the Ethernet header records - hdr_fields : OUT t_eth_total_header; - hdr_fields_val : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1); + hdr_fields : OUT t_network_total_header; + hdr_fields_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1); -- Support also outputting only the currently valid header data - hdr_data : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); - hdr_data_val : OUT STD_LOGIC + hdr_data : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + hdr_data_val : OUT STD_LOGIC ); END eth_hdr_store; ARCHITECTURE rtl OF eth_hdr_store IS - SIGNAL word_cnt : NATURAL RANGE 0 TO c_eth_total_header_nof_words; - SIGNAL nxt_word_cnt : NATURAL; + SIGNAL word_cnt : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words; + SIGNAL nxt_word_cnt : NATURAL; - SIGNAL i_hdr_words : t_eth_total_header_arr := (OTHERS=>(OTHERS=>'0')); -- init to avoid numeric_std warning, no need to rst - SIGNAL nxt_hdr_words : t_eth_total_header_arr; - SIGNAL nxt_hdr_words_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); - SIGNAL i_hdr_fields_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); - SIGNAL nxt_hdr_fields_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); - SIGNAL i_hdr_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := (OTHERS=>'0'); -- init to avoid numeric_std warning, no need to rst - SIGNAL nxt_hdr_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); - SIGNAL nxt_hdr_data_val : STD_LOGIC; + SIGNAL i_hdr_words_arr : t_network_total_header_32b_arr := (OTHERS=>(OTHERS=>'0')); -- init to avoid numeric_std warning, no need to rst + SIGNAL nxt_hdr_words_arr : t_network_total_header_32b_arr; + SIGNAL nxt_hdr_words_arr_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); + SIGNAL i_hdr_fields_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); + SIGNAL nxt_hdr_fields_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE); + SIGNAL i_hdr_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := (OTHERS=>'0'); -- init to avoid numeric_std warning, no need to rst + SIGNAL nxt_hdr_data : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + SIGNAL nxt_hdr_data_val : STD_LOGIC; BEGIN snk_in_word_cnt <= word_cnt; - hdr_words <= i_hdr_words; + hdr_words_arr <= i_hdr_words_arr; hdr_fields_val <= i_hdr_fields_val; hdr_data <= i_hdr_data; @@ -102,44 +102,44 @@ BEGIN IF rst='1' THEN -- input -- internal - word_cnt <= 0; + word_cnt <= 0; -- output - hdr_words_val <= (OTHERS=>'0'); - i_hdr_fields_val <= (OTHERS=>'0'); - hdr_data_val <= '0'; + hdr_words_arr_val <= (OTHERS=>'0'); + i_hdr_fields_val <= (OTHERS=>'0'); + hdr_data_val <= '0'; ELSIF rising_edge(clk) THEN -- input -- internal - word_cnt <= nxt_word_cnt; + word_cnt <= nxt_word_cnt; -- output - i_hdr_words <= nxt_hdr_words; -- stored array of 11 words - hdr_words_val <= nxt_hdr_words_val; - i_hdr_fields_val <= nxt_hdr_fields_val; - i_hdr_data <= nxt_hdr_data; -- current word - hdr_data_val <= nxt_hdr_data_val; + i_hdr_words_arr <= nxt_hdr_words_arr; -- stored array of 11 words + hdr_words_arr_val <= nxt_hdr_words_arr_val; + i_hdr_fields_val <= nxt_hdr_fields_val; + i_hdr_data <= nxt_hdr_data; -- current word + hdr_data_val <= nxt_hdr_data_val; END IF; END PROCESS; -- Extract the 11 words from the Ethernet header - p_words : PROCESS(word_cnt, i_hdr_words, i_hdr_fields_val, i_hdr_data, snk_in) + p_words : PROCESS(word_cnt, i_hdr_words_arr, i_hdr_fields_val, i_hdr_data, snk_in) BEGIN - nxt_word_cnt <= word_cnt; - nxt_hdr_words <= i_hdr_words; - nxt_hdr_words_val <= (OTHERS=>'0'); - nxt_hdr_fields_val <= i_hdr_fields_val; - nxt_hdr_data <= i_hdr_data; - nxt_hdr_data_val <= '0'; + nxt_word_cnt <= word_cnt; + nxt_hdr_words_arr <= i_hdr_words_arr; + nxt_hdr_words_arr_val <= (OTHERS=>'0'); + nxt_hdr_fields_val <= i_hdr_fields_val; + nxt_hdr_data <= i_hdr_data; + nxt_hdr_data_val <= '0'; IF snk_in.sop='1' THEN nxt_hdr_fields_val <= (OTHERS=>'0'); END IF; - IF snk_in.valid='1' AND word_cnt < c_eth_total_header_nof_words THEN + IF snk_in.valid='1' AND word_cnt < c_network_total_header_32b_nof_words THEN -- new Ethernet header is arriving - nxt_word_cnt <= word_cnt + 1; - nxt_hdr_words( word_cnt) <= snk_in.data(c_eth_data_w-1 DOWNTO 0); - nxt_hdr_words_val( word_cnt) <= '1'; - nxt_hdr_fields_val(word_cnt) <= '1'; - nxt_hdr_data <= snk_in.data(c_eth_data_w-1 DOWNTO 0); - nxt_hdr_data_val <= '1'; + nxt_word_cnt <= word_cnt + 1; + nxt_hdr_words_arr( word_cnt) <= snk_in.data(c_eth_data_w-1 DOWNTO 0); + nxt_hdr_words_arr_val( word_cnt) <= '1'; + nxt_hdr_fields_val(word_cnt) <= '1'; + nxt_hdr_data <= snk_in.data(c_eth_data_w-1 DOWNTO 0); + nxt_hdr_data_val <= '1'; END IF; IF snk_in.eop='1' THEN nxt_word_cnt <= 0; @@ -147,10 +147,10 @@ BEGIN END PROCESS; -- Combinatorial map of the total header on to the Ethernet header records - hdr_fields.eth <= func_eth_map_eth_header( i_hdr_words); - hdr_fields.arp <= func_eth_map_arp_packet( i_hdr_words); - hdr_fields.ip <= func_eth_map_ip_header( i_hdr_words); - hdr_fields.icmp <= func_eth_map_icmp_header(i_hdr_words); - hdr_fields.udp <= func_eth_map_udp_header( i_hdr_words); + hdr_fields.eth <= func_network_total_header_extract_eth( i_hdr_words_arr); + hdr_fields.arp <= func_network_total_header_extract_arp( i_hdr_words_arr); + hdr_fields.ip <= func_network_total_header_extract_ip( i_hdr_words_arr); + hdr_fields.icmp <= func_network_total_header_extract_icmp(i_hdr_words_arr); + hdr_fields.udp <= func_network_total_header_extract_udp( i_hdr_words_arr); END rtl; diff --git a/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd b/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd index facba955de5297860015c3d65f6b1c4b003b370e..6cc81235533a942371dbe752392b227419641a5d 100644 --- a/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd +++ b/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd @@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; -USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; USE work.eth_pkg.ALL; -- Purpose: @@ -84,7 +84,7 @@ ARCHITECTURE rtl OF eth_ihl_to_20 IS TYPE state_type IS (Idle, Eth_DestMAC0, Eth_DestMAC1, Eth_SrcMAC0, Eth_SrcMAC1, IPv4_lengths, IPv4_ID, IPv4_TTL, IPv4_SrcIP, IPv4_DestIP, IPv4_Options, IPv4_Payload); SIGNAL state : state_type; - SIGNAL ihl : unsigned(c_ip_header_length_w-1 downto 0); + SIGNAL ihl : unsigned(c_network_ip_header_length_w-1 downto 0); BEGIN @@ -115,70 +115,60 @@ BEGIN IF snk_in.valid = '1' THEN state <= Eth_DestMAC1; END IF; - WHEN Eth_DestMAC1 => IF snk_in.valid = '1' THEN state <= Eth_SrcMAC0; END IF; - WHEN Eth_SrcMAC0 => IF snk_in.valid = '1' THEN - IF snk_in.data(c_eth_type_slv'RANGE) = TO_UVEC(c_eth_type_ip,c_eth_type_w) THEN -- if IPv4 frame + IF snk_in.data(c_network_eth_type_slv'RANGE) = TO_UVEC(c_network_eth_type_ip, c_network_eth_type_w) THEN -- if IPv4 frame state <= Eth_SrcMAC1; ELSE state <= Idle; END IF; END IF; - WHEN Eth_SrcMAC1 => IF snk_in.valid = '1' THEN - IF snk_in.data(27 downto 24) = TO_UVEC(c_ip_header_length,c_ip_header_length_w) THEN -- if ihl = 20, nothing to do + IF snk_in.data(27 downto 24) = TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w) THEN -- if ihl = 5 words = 20 bytes, nothing to do state <= Idle; ELSE state <= IPv4_lengths; - i_src_out.data(27 downto 24) <= TO_UVEC(c_ip_header_length ,c_ip_header_length_w); -- make IHL = 20 - i_src_out.data(c_ip_total_length_w-1 downto 0) <= std_logic_vector(unsigned(snk_in.data(c_ip_total_length_w-1 downto 0)) - - ((unsigned(snk_in.data(27 downto 24)) - - to_unsigned(c_ip_header_length ,c_ip_header_length_w) - ) & "00" - ) - ); -- correct Total Length - ihl <= unsigned(snk_in.data(27 downto 24)); -- save IHL + i_src_out.data(27 downto 24) <= TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w); -- make IHL = 5 words = 20 bytes + i_src_out.data(c_network_ip_total_length_w-1 downto 0) <= std_logic_vector( + unsigned(snk_in.data(c_network_ip_total_length_w-1 downto 0)) - + ((unsigned(snk_in.data(27 downto 24)) - to_unsigned(c_network_ip_header_length, c_network_ip_header_length_w)) & "00") + ); -- correct Total Length = input Total Length - (input IHL - fixed IHL), + ihl <= unsigned(snk_in.data(27 downto 24)); -- save input IHL END IF; END IF; - WHEN IPv4_lengths => IF snk_in.valid = '1' THEN state <= IPv4_ID; ihl <= ihl - 1; END IF; - WHEN IPv4_ID => IF snk_in.valid = '1' THEN state <= IPv4_TTL; - i_src_out.data(c_ip_header_checksum_w-1 downto 0) <= TO_UVEC(0,c_ip_header_checksum_w); + i_src_out.data(c_network_ip_header_checksum_w-1 downto 0) <= TO_UVEC(0, c_network_ip_header_checksum_w); ihl <= ihl - 1; END IF; - WHEN IPv4_TTL => IF snk_in.valid = '1' THEN state <= IPv4_SrcIP; ihl <= ihl - 1; END IF; - WHEN IPv4_SrcIP => IF snk_in.valid = '1' THEN state <= IPv4_DestIP; ihl <= ihl - 1; - END IF; - + END IF; WHEN IPv4_DestIP => IF snk_in.valid = '1' THEN @@ -199,7 +189,6 @@ BEGIN END IF; END IF; - WHEN IPv4_Payload => IF snk_in.eop = '1' and snk_in.valid = '1' THEN state <= Idle; @@ -209,8 +198,6 @@ BEGIN state <= Idle; END CASE; END IF; - end PROCESS ; - + end PROCESS; - END rtl; diff --git a/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd b/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd index cbf329ade11a989aca897d26e7be66cbeed42d26..73172c2a83d5d75a90b231dff393a9331ba1bc14 100644 --- a/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd +++ b/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd @@ -24,7 +24,7 @@ LIBRARY IEEE, common_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE work.eth_pkg.ALL; ENTITY eth_mm_reg_frame IS @@ -34,7 +34,7 @@ ENTITY eth_mm_reg_frame IS clk : IN STD_LOGIC; -- packet stream clock -- Inputs need for the frame register - hdr_fields : IN t_eth_total_header; -- Header info + hdr_fields : IN t_network_total_header; -- Header info hdr_status : IN t_eth_hdr_status; -- Header info erc_word : IN STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0); -- Extracted CRC word (enumerate: 0=OK, >0 AND odd = Error) reg_config : IN t_eth_mm_reg_config; -- Config setting diff --git a/libraries/io/eth/src/vhdl/eth_pkg.vhd b/libraries/io/eth/src/vhdl/eth_pkg.vhd index c4f2ffa4cc1079bdb14bc0ed6eb244a979a855fb..de2a60c0718e73c78efc22f9004d4f4f1cfa618e 100644 --- a/libraries/io/eth/src/vhdl/eth_pkg.vhd +++ b/libraries/io/eth/src/vhdl/eth_pkg.vhd @@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib, tech_tse_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; -USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; USE tech_tse_lib.tech_tse_pkg.ALL; @@ -70,7 +70,7 @@ PACKAGE eth_pkg IS ip_checksum : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0); ip_checksum_val : STD_LOGIC; ip_checksum_is_ok : STD_LOGIC; - udp_port : STD_LOGIC_VECTOR(c_udp_port_slv'RANGE); + udp_port : STD_LOGIC_VECTOR(c_network_udp_port_slv'RANGE); is_dhcp : STD_LOGIC; END RECORD; @@ -104,16 +104,16 @@ PACKAGE eth_pkg IS CONSTANT c_eth_reg_continue_wi : NATURAL := c_eth_reg_status_wi + c_eth_reg_status_nof_words; -- . write/read back registers - TYPE t_eth_demux_ports_arr IS ARRAY(1 TO c_eth_nof_udp_ports) OF STD_LOGIC_VECTOR(c_udp_port_w-1 DOWNTO 0); + TYPE t_eth_demux_ports_arr IS ARRAY(1 TO c_eth_nof_udp_ports) OF STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); TYPE t_eth_mm_reg_demux IS RECORD udp_ports_en : STD_LOGIC_VECTOR(1 TO c_eth_nof_udp_ports); -- [16] - udp_ports : t_eth_demux_ports_arr; -- [15:0] + udp_ports : t_eth_demux_ports_arr; -- [15:0] END RECORD; TYPE t_eth_mm_reg_config IS RECORD - udp_port : STD_LOGIC_VECTOR(c_udp_port_w-1 DOWNTO 0); -- [15:0] - ip_address : STD_LOGIC_VECTOR(c_ip_addr_w-1 DOWNTO 0); -- [31:0] - mac_address : STD_LOGIC_VECTOR(c_eth_mac_addr_w-1 DOWNTO 0); -- [15:0], [31:0] + udp_port : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); -- [15:0] + ip_address : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0); -- [31:0] + mac_address : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0); -- [15:0], [31:0] END RECORD; TYPE t_eth_mm_reg_control IS RECORD @@ -228,8 +228,8 @@ PACKAGE BODY eth_pkg IS BEGIN -- Demux UDP MM registers FOR I IN 1 TO c_eth_nof_udp_ports LOOP - v_reg.udp_ports_en(I) := mm_reg(c_udp_port_w + (I-1)*c_word_w); -- [16] = UDP port enable - v_reg.udp_ports(I) := mm_reg(c_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w); -- [15:0] = UDP port number + v_reg.udp_ports_en(I) := mm_reg(c_network_udp_port_w + (I-1)*c_word_w); -- [16] = UDP port enable + v_reg.udp_ports(I) := mm_reg(c_network_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w); -- [15:0] = UDP port number END LOOP; RETURN v_reg; END func_eth_mm_reg_demux; @@ -237,10 +237,10 @@ PACKAGE BODY eth_pkg IS FUNCTION func_eth_mm_reg_demux(mm_reg : t_eth_mm_reg_demux) RETURN STD_LOGIC_VECTOR IS VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_demux_nof_words*c_word_w-1 DOWNTO 0); BEGIN - v_reg := (OTHERS=>'0'); -- rsvd + v_reg := (OTHERS=>'0'); -- rsvd FOR I IN 1 TO c_eth_nof_udp_ports LOOP - v_reg(c_udp_port_w + (I-1)*c_word_w) := mm_reg.udp_ports_en(I); -- [16] = UDP port enable - v_reg(c_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w) := mm_reg.udp_ports(I); -- [15:0] = UDP port number + v_reg(c_network_udp_port_w + (I-1)*c_word_w) := mm_reg.udp_ports_en(I); -- [16] = UDP port enable + v_reg(c_network_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w) := mm_reg.udp_ports(I); -- [15:0] = UDP port number END LOOP; RETURN v_reg; END func_eth_mm_reg_demux; @@ -249,9 +249,9 @@ PACKAGE BODY eth_pkg IS FUNCTION func_eth_mm_reg_config(mm_reg : STD_LOGIC_VECTOR) RETURN t_eth_mm_reg_config IS VARIABLE v_reg : t_eth_mm_reg_config; BEGIN - v_reg.udp_port := mm_reg(c_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w); -- [15:0] = control UDP port number - v_reg.ip_address := mm_reg( 3*c_word_w-1 DOWNTO 2*c_word_w); -- [31:0] = this node IP address - v_reg.mac_address(47 DOWNTO 32) := mm_reg( c_halfword_w+c_word_w-1 DOWNTO c_word_w); -- [47:32] = this node MAC address + v_reg.udp_port := mm_reg(c_network_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w); -- [15:0] = control UDP port number + v_reg.ip_address := mm_reg( 3*c_word_w-1 DOWNTO 2*c_word_w); -- [31:0] = this node IP address + v_reg.mac_address(47 DOWNTO 32) := mm_reg( c_halfword_w+ c_word_w-1 DOWNTO c_word_w); -- [47:32] = this node MAC address v_reg.mac_address(31 DOWNTO 0) := mm_reg( c_word_w-1 DOWNTO 0); -- [31:0] = this node MAC address RETURN v_reg; END func_eth_mm_reg_config; @@ -259,11 +259,11 @@ PACKAGE BODY eth_pkg IS FUNCTION func_eth_mm_reg_config(mm_reg : t_eth_mm_reg_config) RETURN STD_LOGIC_VECTOR IS VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_config_nof_words*c_word_w-1 DOWNTO 0); BEGIN - v_reg := (OTHERS=>'0'); -- rsvd - v_reg(c_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w) := mm_reg.udp_port; -- [15:0] = control UDP port number - v_reg( 3*c_word_w-1 DOWNTO 2*c_word_w) := mm_reg.ip_address; -- [31:0] = this node IP address - v_reg( c_halfword_w+c_word_w-1 DOWNTO c_word_w) := mm_reg.mac_address(47 DOWNTO 32); -- [47:32] = this node MAC address - v_reg( c_word_w-1 DOWNTO 0) := mm_reg.mac_address(31 DOWNTO 0); -- [31:0] = this node MAC address + v_reg := (OTHERS=>'0'); -- rsvd + v_reg(c_network_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w) := mm_reg.udp_port; -- [15:0] = control UDP port number + v_reg( 3*c_word_w-1 DOWNTO 2*c_word_w) := mm_reg.ip_address; -- [31:0] = this node IP address + v_reg( c_halfword_w+ c_word_w-1 DOWNTO c_word_w) := mm_reg.mac_address(47 DOWNTO 32); -- [47:32] = this node MAC address + v_reg( c_word_w-1 DOWNTO 0) := mm_reg.mac_address(31 DOWNTO 0); -- [31:0] = this node MAC address RETURN v_reg; END func_eth_mm_reg_config; @@ -282,7 +282,7 @@ PACKAGE BODY eth_pkg IS FUNCTION func_eth_mm_reg_control(mm_reg : t_eth_mm_reg_control) RETURN STD_LOGIC_VECTOR IS VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_control_nof_words*c_word_w-1 DOWNTO 0); BEGIN - v_reg := (OTHERS=>'0'); -- rsvd + v_reg := (OTHERS=>'0'); -- rsvd v_reg(c_eth_max_frame_nof_words_w+c_eth_empty_w+16-1 DOWNTO c_eth_empty_w+16) := mm_reg.tx_nof_words; -- [29:18] v_reg( c_eth_empty_w+16-1 DOWNTO 16) := mm_reg.tx_empty; -- [17:16] v_reg( 2) := mm_reg.tx_request; -- [2] @@ -340,7 +340,7 @@ PACKAGE BODY eth_pkg IS FUNCTION func_eth_mm_reg_status(mm_reg : t_eth_mm_reg_status) RETURN STD_LOGIC_VECTOR IS VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_status_nof_words*c_word_w-1 DOWNTO 0); BEGIN - v_reg := (OTHERS=>'0'); -- rsvd + v_reg := (OTHERS=>'0'); -- rsvd v_reg(c_eth_max_frame_nof_words_w+c_eth_empty_w+16-1 DOWNTO c_eth_empty_w+16) := mm_reg.rx_nof_words; -- [29:18] v_reg( c_eth_empty_w+16-1 DOWNTO 16) := mm_reg.rx_empty; -- [17:16] v_reg( 2) := mm_reg.tx_avail; -- [2] diff --git a/libraries/io/eth/tb/vhdl/tb_eth.vhd b/libraries/io/eth/tb/vhdl/tb_eth.vhd index 8c4833a5137445fbc59e8ec5ff8ab220381b359b..ff9df48eb92f05536e970a51b682f168e58c9f80 100644 --- a/libraries/io/eth/tb/vhdl/tb_eth.vhd +++ b/libraries/io/eth/tb/vhdl/tb_eth.vhd @@ -46,8 +46,9 @@ USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE common_lib.tb_common_mem_pkg.ALL; -USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; USE WORK.eth_pkg.ALL; USE tech_tse_lib.tech_tse_pkg.ALL; USE tech_tse_lib.tb_tech_tse_pkg.ALL; @@ -82,99 +83,89 @@ ARCHITECTURE tb OF tb_eth IS -- Payload user data CONSTANT c_tb_nof_data : NATURAL := 0; -- nof UDP user data, nof ping padding data - CONSTANT c_tb_ip_nof_data : NATURAL := c_udp_header_len + c_tb_nof_data; -- nof IP data, - -- also suits ICMP, because c_icmp_header_len = c_udp_header_len + CONSTANT c_tb_ip_nof_data : NATURAL := c_network_udp_header_len + c_tb_nof_data; -- nof IP data, + -- also suits ICMP, because c_network_icmp_header_len = c_network_udp_header_len CONSTANT c_tb_reply_payload : BOOLEAN := TRUE; -- TRUE copy rx payload into response payload, else header only (e.g. for ARP) -- Packet headers -- . Ethernet header - CONSTANT c_word_align : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w); - CONSTANT c_lcu_src_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300"; - CONSTANT c_dut_src_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC - CONSTANT c_dut_src_mac_hi : NATURAL := TO_UINT(c_dut_src_mac(c_eth_mac_addr_w-1 DOWNTO c_word_w)); - CONSTANT c_dut_src_mac_lo : NATURAL := TO_UINT(c_dut_src_mac( c_word_w-1 DOWNTO 0)); + CONSTANT c_lcu_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300"; + CONSTANT c_dut_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC + CONSTANT c_dut_src_mac_hi : NATURAL := TO_UINT(c_dut_src_mac(c_network_eth_mac_addr_w-1 DOWNTO c_word_w)); + CONSTANT c_dut_src_mac_lo : NATURAL := TO_UINT(c_dut_src_mac( c_word_w-1 DOWNTO 0)); -- support only ARP and IPv4 over ETH - CONSTANT c_dut_ethertype : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_arp, c_eth_type_ip, c_eth_type_arp); - CONSTANT c_tx_eth_header : t_eth_header := (word_align => c_word_align, - dst_mac => c_dut_src_mac, - src_mac => c_lcu_src_mac, - eth_type => TO_UVEC(c_dut_ethertype, c_eth_type_w)); - CONSTANT c_exp_eth_header : t_eth_header := (word_align => c_tx_eth_header.word_align, -- = - dst_mac => c_tx_eth_header.src_mac, -- \/ - src_mac => c_tx_eth_header.dst_mac, -- /\ - eth_type => c_tx_eth_header.eth_type); -- = + CONSTANT c_dut_ethertype : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_arp, c_network_eth_type_ip, c_network_eth_type_arp); + CONSTANT c_tx_eth_header : t_network_eth_header := (dst_mac => c_dut_src_mac, + src_mac => c_lcu_src_mac, + eth_type => TO_UVEC(c_dut_ethertype, c_network_eth_type_w)); + CONSTANT c_exp_eth_header : t_network_eth_header := (dst_mac => c_tx_eth_header.src_mac, -- \/ + src_mac => c_tx_eth_header.dst_mac, -- /\ + eth_type => c_tx_eth_header.eth_type); -- = -- . IP header CONSTANT c_lcu_ip_addr : NATURAL := 16#05060708#; -- = 05:06:07:08 CONSTANT c_dut_ip_addr : NATURAL := 16#01020304#; - CONSTANT c_tb_ip_total_length : NATURAL := c_ip_total_length + c_tb_ip_nof_data; - -- support only ping protocol or UDP protocol over IP - CONSTANT c_tb_ip_protocol : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_ip_protocol_udp, c_ip_protocol_icmp); + CONSTANT c_tb_ip_total_length : NATURAL := c_network_ip_total_length + c_tb_ip_nof_data; + CONSTANT c_tb_ip_protocol : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_network_ip_protocol_udp, c_network_ip_protocol_icmp); -- support only ping protocol or UDP protocol over IP - CONSTANT c_tx_ip_header : t_ip_header := (version => TO_UVEC(c_ip_version, c_ip_version_w), - header_length => TO_UVEC(c_ip_header_length, c_ip_header_length_w), - services => TO_UVEC(c_ip_services, c_ip_services_w), - total_length => TO_UVEC(c_tb_ip_total_length, c_ip_total_length_w), - identification => TO_UVEC(c_ip_identification, c_ip_identification_w), - flags => TO_UVEC(c_ip_flags, c_ip_flags_w), - fragment_offset => TO_UVEC(c_ip_fragment_offset, c_ip_fragment_offset_w), - time_to_live => TO_UVEC(c_ip_time_to_live, c_ip_time_to_live_w), - protocol => TO_UVEC(c_tb_ip_protocol, c_ip_protocol_w), - header_checksum => TO_UVEC(c_ip_header_checksum, c_ip_header_checksum_w), -- init value (or try 0xEBBD = 60349) - src_ip_addr => TO_UVEC(c_lcu_ip_addr, c_ip_addr_w), - dst_ip_addr => TO_UVEC(c_dut_ip_addr, c_ip_addr_w)); + CONSTANT c_tx_ip_header : t_network_ip_header := (version => TO_UVEC(c_network_ip_version, c_network_ip_version_w), + header_length => TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w), + services => TO_UVEC(c_network_ip_services, c_network_ip_services_w), + total_length => TO_UVEC(c_tb_ip_total_length, c_network_ip_total_length_w), + identification => TO_UVEC(c_network_ip_identification, c_network_ip_identification_w), + flags => TO_UVEC(c_network_ip_flags, c_network_ip_flags_w), + fragment_offset => TO_UVEC(c_network_ip_fragment_offset, c_network_ip_fragment_offset_w), + time_to_live => TO_UVEC(c_network_ip_time_to_live, c_network_ip_time_to_live_w), + protocol => TO_UVEC(c_tb_ip_protocol, c_network_ip_protocol_w), + header_checksum => TO_UVEC(c_network_ip_header_checksum, c_network_ip_header_checksum_w), -- init value (or try 0xEBBD = 60349) + src_ip_addr => TO_UVEC(c_lcu_ip_addr, c_network_ip_addr_w), + dst_ip_addr => TO_UVEC(c_dut_ip_addr, c_network_ip_addr_w)); - CONSTANT c_exp_ip_header : t_ip_header := (version => c_tx_ip_header.version, -- = - header_length => c_tx_ip_header.header_length, -- = - services => c_tx_ip_header.services, -- = - total_length => c_tx_ip_header.total_length, -- = - identification => c_tx_ip_header.identification, -- = - flags => c_tx_ip_header.flags, -- = - fragment_offset => c_tx_ip_header.fragment_offset, -- = - time_to_live => c_tx_ip_header.time_to_live, -- = - protocol => c_tx_ip_header.protocol, -- = - header_checksum => c_tx_ip_header.header_checksum, -- init value - src_ip_addr => c_tx_ip_header.dst_ip_addr, -- \/ - dst_ip_addr => c_tx_ip_header.src_ip_addr); -- /\ + CONSTANT c_exp_ip_header : t_network_ip_header := (version => c_tx_ip_header.version, -- = + header_length => c_tx_ip_header.header_length, -- = + services => c_tx_ip_header.services, -- = + total_length => c_tx_ip_header.total_length, -- = + identification => c_tx_ip_header.identification, -- = + flags => c_tx_ip_header.flags, -- = + fragment_offset => c_tx_ip_header.fragment_offset, -- = + time_to_live => c_tx_ip_header.time_to_live, -- = + protocol => c_tx_ip_header.protocol, -- = + header_checksum => c_tx_ip_header.header_checksum, -- init value + src_ip_addr => c_tx_ip_header.dst_ip_addr, -- \/ + dst_ip_addr => c_tx_ip_header.src_ip_addr); -- /\ -- . ARP packet - CONSTANT c_tx_arp_packet : t_arp_packet := (htype => TO_UVEC(c_arp_htype, c_arp_htype_w), - ptype => TO_UVEC(c_arp_ptype, c_arp_ptype_w), - hlen => TO_UVEC(c_arp_hlen, c_arp_hlen_w), - plen => TO_UVEC(c_arp_plen, c_arp_plen_w), - oper => TO_UVEC(c_arp_oper_request, c_arp_oper_w), - sha => c_lcu_src_mac, - spa => TO_UVEC(c_lcu_ip_addr, c_ip_addr_w), - tha => c_dut_src_mac, - tpa => TO_UVEC(c_dut_ip_addr, c_ip_addr_w)); + CONSTANT c_tx_arp_packet : t_network_arp_packet := (htype => TO_UVEC(c_network_arp_htype, c_network_arp_htype_w), + ptype => TO_UVEC(c_network_arp_ptype, c_network_arp_ptype_w), + hlen => TO_UVEC(c_network_arp_hlen, c_network_arp_hlen_w), + plen => TO_UVEC(c_network_arp_plen, c_network_arp_plen_w), + oper => TO_UVEC(c_network_arp_oper_request, c_network_arp_oper_w), + sha => c_lcu_src_mac, + spa => TO_UVEC(c_lcu_ip_addr, c_network_ip_addr_w), + tha => c_dut_src_mac, + tpa => TO_UVEC(c_dut_ip_addr, c_network_ip_addr_w)); - CONSTANT c_exp_arp_packet : t_arp_packet := (htype => c_tx_arp_packet.htype, - ptype => c_tx_arp_packet.ptype, - hlen => c_tx_arp_packet.hlen, - plen => c_tx_arp_packet.plen, - oper => TO_UVEC(c_arp_oper_reply, c_arp_oper_w), -- reply - sha => c_tx_arp_packet.tha, -- \/ - spa => c_tx_arp_packet.tpa, -- /\ \/ - tha => c_tx_arp_packet.sha, -- / \ /\ - tpa => c_tx_arp_packet.spa); -- / \ + CONSTANT c_exp_arp_packet : t_network_arp_packet := (htype => c_tx_arp_packet.htype, + ptype => c_tx_arp_packet.ptype, + hlen => c_tx_arp_packet.hlen, + plen => c_tx_arp_packet.plen, + oper => TO_UVEC(c_network_arp_oper_reply, c_network_arp_oper_w), -- reply + sha => c_tx_arp_packet.tha, -- \/ + spa => c_tx_arp_packet.tpa, -- /\ \/ + tha => c_tx_arp_packet.sha, -- / \ /\ + tpa => c_tx_arp_packet.spa); -- / \ - CONSTANT c_arp_htype : NATURAL := 1; -- Hardware type, 1=ethernet - CONSTANT c_arp_ptype : NATURAL := c_eth_type_ip; -- Protocol type, do ARP for IPv4 - CONSTANT c_arp_hlen : NATURAL := c_eth_mac_addr_len; -- Hardware length = 6 - CONSTANT c_arp_plen : NATURAL := c_ip_addr_len; -- Protocol length = 4 - CONSTANT c_arp_oper : NATURAL := 1; -- Operator, 1=request, (2=reply) - -- . ICMP header - CONSTANT c_tx_icmp_header : t_icmp_header := (msg_type => TO_UVEC(c_icmp_msg_type_request, c_icmp_msg_type_w), -- ping request - code => TO_UVEC(c_icmp_code, c_icmp_code_w), - checksum => TO_UVEC(c_icmp_checksum, c_icmp_checksum_w), -- init value - id => TO_UVEC(c_icmp_id, c_icmp_id_w), - sequence => TO_UVEC(c_icmp_sequence, c_icmp_sequence_w)); - CONSTANT c_exp_icmp_header : t_icmp_header := (msg_type => TO_UVEC(c_icmp_msg_type_reply, c_icmp_msg_type_w), -- ping reply - code => c_tx_icmp_header.code, - checksum => c_tx_icmp_header.checksum, -- init value - id => c_tx_icmp_header.id, - sequence => c_tx_icmp_header.sequence); + CONSTANT c_tx_icmp_header : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_request, c_network_icmp_msg_type_w), -- ping request + code => TO_UVEC(c_network_icmp_code, c_network_icmp_code_w), + checksum => TO_UVEC(c_network_icmp_checksum, c_network_icmp_checksum_w), -- init value + id => TO_UVEC(c_network_icmp_id, c_network_icmp_id_w), + sequence => TO_UVEC(c_network_icmp_sequence, c_network_icmp_sequence_w)); + CONSTANT c_exp_icmp_header : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_reply, c_network_icmp_msg_type_w), -- ping reply + code => c_tx_icmp_header.code, + checksum => c_tx_icmp_header.checksum, -- init value + id => c_tx_icmp_header.id, + sequence => c_tx_icmp_header.sequence); -- . UDP header CONSTANT c_dut_udp_port_ctrl : NATURAL := 11; -- ETH demux UDP for control @@ -184,19 +175,19 @@ ARCHITECTURE tb OF tb_eth IS CONSTANT c_dut_udp_port_en : NATURAL := 16#10000#; -- ETH demux UDP port enable bit 16 CONSTANT c_lcu_udp_port : NATURAL := 10; -- UDP port used for src_port CONSTANT c_dut_udp_port_st : NATURAL := c_dut_udp_port_st0; -- UDP port used for dst_port - CONSTANT c_tb_udp_total_length : NATURAL := c_udp_total_length + c_tb_nof_data; - CONSTANT c_tx_udp_header : t_udp_header := (src_port => TO_UVEC(c_lcu_udp_port, c_udp_port_w), - dst_port => TO_UVEC(c_dut_udp_port_ctrl, c_udp_port_w), -- or use c_dut_udp_port_st# - total_length => TO_UVEC(c_tb_udp_total_length, c_udp_total_length_w), - checksum => TO_UVEC(c_udp_checksum, c_udp_checksum_w)); -- init value + CONSTANT c_tb_udp_total_length : NATURAL := c_network_udp_total_length + c_tb_nof_data; + CONSTANT c_tx_udp_header : t_network_udp_header := (src_port => TO_UVEC(c_lcu_udp_port, c_network_udp_port_w), + dst_port => TO_UVEC(c_dut_udp_port_ctrl, c_network_udp_port_w), -- or use c_dut_udp_port_st# + total_length => TO_UVEC(c_tb_udp_total_length, c_network_udp_total_length_w), + checksum => TO_UVEC(c_network_udp_checksum, c_network_udp_checksum_w)); -- init value - CONSTANT c_exp_udp_header : t_udp_header := (src_port => c_tx_udp_header.dst_port, -- \/ - dst_port => c_tx_udp_header.src_port, -- /\ - total_length => c_tx_udp_header.total_length, -- = - checksum => c_tx_udp_header.checksum); -- init value + CONSTANT c_exp_udp_header : t_network_udp_header := (src_port => c_tx_udp_header.dst_port, -- \/ + dst_port => c_tx_udp_header.src_port, -- /\ + total_length => c_tx_udp_header.total_length, -- = + checksum => c_tx_udp_header.checksum); -- init value - SIGNAL tx_total_header : t_eth_total_header; -- transmitted packet header - SIGNAL exp_total_header : t_eth_total_header; -- expected received packet header + SIGNAL tx_total_header : t_network_total_header; -- transmitted packet header + SIGNAL exp_total_header : t_network_total_header; -- expected received packet header -- ETH control CONSTANT c_dut_control_rx_en : NATURAL := 2**c_eth_mm_reg_control_bi.rx_en; @@ -367,7 +358,7 @@ BEGIN eth_mm_reg_control.tx_nof_words <= INCR_UVEC(eth_mm_reg_status.rx_nof_words, -1); -- -1 to skip the CRC word for the response eth_mm_reg_control.tx_empty <= eth_mm_reg_status.rx_empty; ELSE - eth_mm_reg_control.tx_nof_words <= TO_UVEC(c_eth_total_header_nof_words, c_eth_max_frame_nof_words_w); + eth_mm_reg_control.tx_nof_words <= TO_UVEC(c_network_total_header_32b_nof_words, c_eth_max_frame_nof_words_w); eth_mm_reg_control.tx_empty <= TO_UVEC(0, c_eth_empty_w); END IF; eth_mm_reg_control.tx_en <= '1'; diff --git a/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd b/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd index 965e42b78e9d39703569f110450c33a6cbd76243..da91b51968bf737650b16ba24f5eb2feded2e8ce 100644 --- a/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd +++ b/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd @@ -77,9 +77,9 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS snk_in.data <= RESIZE_DP_DATA(X"00000800"); WAIT UNTIL rising_edge(clk); snk_in.data <= RESIZE_DP_DATA(X"4" & -- IPv4 header - TO_UVEC(IHL,c_ip_header_length_w) & + TO_UVEC(IHL,c_network_ip_header_length_w) & X"00" & - TO_UVEC((IHL+UDP_payload_len+2)*4,c_ip_total_length_w)); + TO_UVEC((IHL+UDP_payload_len+2)*4,c_network_ip_total_length_w)); WAIT UNTIL rising_edge(clk); snk_in.data <= RESIZE_DP_DATA(X"00004000"); WAIT UNTIL rising_edge(clk); @@ -91,13 +91,13 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS WAIT UNTIL rising_edge(clk); FOR I IN 6 TO IHL LOOP - snk_in.data <= RESIZE_DP_DATA(X"BAD000" & TO_UVEC(I,c_ip_header_length_w)); -- optionnal option word + snk_in.data <= RESIZE_DP_DATA(X"BAD000" & TO_UVEC(I,c_network_ip_header_length_w)); -- optionnal option word WAIT UNTIL rising_edge(clk); END LOOP; snk_in.data <= RESIZE_DP_DATA(X"10FA10FA"); -- UDP header WAIT UNTIL rising_edge(clk); - snk_in.data <= RESIZE_DP_DATA(TO_UVEC((UDP_payload_len+2)*4,c_udp_total_length_w) & X"0000"); + snk_in.data <= RESIZE_DP_DATA(TO_UVEC((UDP_payload_len+2)*4,c_network_udp_total_length_w) & X"0000"); WAIT UNTIL rising_edge(clk); FOR I IN 0 TO UDP_payload_len-1 LOOP -- UDP payload @@ -134,9 +134,9 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS -- IPv4 header WAIT UNTIL falling_edge(clk) and src_out.valid = '1'; ASSERT src_out.data(31 downto 0) = X"4" & - TO_UVEC(c_IHL,c_ip_header_length_w) & + TO_UVEC(c_IHL,c_network_ip_header_length_w) & X"00" & - TO_UVEC((c_IHL+UDP_payload_len+2)*4,c_ip_total_length_w) + TO_UVEC((c_IHL+UDP_payload_len+2)*4,c_network_ip_total_length_w) REPORT "Wrong Version / IHL / Total Length" SEVERITY FAILURE; WAIT UNTIL falling_edge(clk) and src_out.valid = '1'; @@ -153,7 +153,7 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS WAIT UNTIL falling_edge(clk) and src_out.valid = '1'; ASSERT src_out.data(31 downto 0) = X"10FA10FA" REPORT "Wrong UDP ports" SEVERITY FAILURE; WAIT UNTIL falling_edge(clk) and src_out.valid = '1'; - ASSERT src_out.data(31 downto 0) = TO_UVEC((UDP_payload_len+2)*4,c_udp_total_length_w) & + ASSERT src_out.data(31 downto 0) = TO_UVEC((UDP_payload_len+2)*4,c_network_udp_total_length_w) & X"0000" REPORT "Wrong UDP length / CRC" SEVERITY FAILURE; -- UDP payload diff --git a/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd b/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd index 4f82a69c10095264b771fc03a1fa5a5f2965cc48..c2063d4e3c2e687ecd82b9a0afcc038f68ddabbd 100644 --- a/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd +++ b/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd @@ -28,12 +28,13 @@ USE common_lib.common_mem_pkg.ALL; USE common_lib.tb_common_mem_pkg.ALL; USE common_lib.common_str_pkg.ALL; USE common_lib.common_lfsr_sequences_pkg.ALL; +USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE common_lib.tb_common_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.tb_dp_pkg.ALL; USE tech_tse_lib.tech_tse_pkg.ALL; USE tech_tse_lib.tb_tech_tse_pkg.ALL; -USE common_lib.common_network_layers_pkg.ALL; USE WORK.eth_pkg.ALL; ENTITY tb_eth_udp_offload IS @@ -71,39 +72,36 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS -- Payload user data CONSTANT c_tb_nof_data : NATURAL := 1440; -- nof UDP user data, nof ping padding data. NOTE: non-multiples of g_data_w/g_symbol_w not supported as dp_packet_enc/dec do not support encoding/decoding empty - CONSTANT c_tb_ip_nof_data : NATURAL := c_udp_header_len + c_tb_nof_data; -- nof IP data, + CONSTANT c_tb_ip_nof_data : NATURAL := c_network_udp_header_len + c_tb_nof_data; -- nof IP data, -- Headers -- . Ethernet header - CONSTANT c_word_align : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w); - CONSTANT c_lcu_src_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300"; - CONSTANT c_dut_src_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC - CONSTANT c_dut_src_mac_hi : NATURAL := TO_UINT(c_dut_src_mac(c_eth_mac_addr_w-1 DOWNTO c_word_w)); - CONSTANT c_dut_src_mac_lo : NATURAL := TO_UINT(c_dut_src_mac( c_word_w-1 DOWNTO 0)); + CONSTANT c_lcu_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300"; + CONSTANT c_dut_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC + CONSTANT c_dut_src_mac_hi : NATURAL := TO_UINT(c_dut_src_mac(c_network_eth_mac_addr_w-1 DOWNTO c_word_w)); + CONSTANT c_dut_src_mac_lo : NATURAL := TO_UINT(c_dut_src_mac( c_word_w-1 DOWNTO 0)); - CONSTANT c_tx_eth_header : t_eth_header := (word_align => c_word_align, - dst_mac => c_dut_src_mac, - src_mac => c_lcu_src_mac, - eth_type => TO_UVEC(c_eth_type_ip, c_eth_type_w)); --TO_UVEC(c_dut_ethertype, c_eth_type_w)); + CONSTANT c_tx_eth_header : t_network_eth_header := (dst_mac => c_dut_src_mac, + src_mac => c_lcu_src_mac, + eth_type => TO_UVEC(c_network_eth_type_ip, c_network_eth_type_w)); --TO_UVEC(c_dut_ethertype, c_network_eth_type_w)); -- . IP header CONSTANT c_lcu_ip_addr : NATURAL := 16#05060708#; -- = 05:06:07:08 CONSTANT c_dut_ip_addr : NATURAL := 16#01020304#; - CONSTANT c_tb_ip_total_length : NATURAL := c_ip_total_length + c_tb_ip_nof_data; - -- support only ping protocol or UDP protocol over IP - CONSTANT c_tb_ip_protocol : NATURAL := c_ip_protocol_udp; --sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_ip_protocol_udp, c_ip_protocol_icmp); + CONSTANT c_tb_ip_total_length : NATURAL := c_network_ip_total_length + c_tb_ip_nof_data; + CONSTANT c_tb_ip_protocol : NATURAL := c_network_ip_protocol_udp; --sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_network_ip_protocol_udp, c_network_ip_protocol_icmp); -- support only ping protocol or UDP protocol over IP - CONSTANT c_tx_ip_header : t_ip_header := (version => TO_UVEC(c_ip_version, c_ip_version_w), - header_length => TO_UVEC(c_ip_header_length, c_ip_header_length_w), - services => TO_UVEC(c_ip_services, c_ip_services_w), - total_length => TO_UVEC(c_tb_ip_total_length, c_ip_total_length_w), - identification => TO_UVEC(c_ip_identification, c_ip_identification_w), - flags => TO_UVEC(c_ip_flags, c_ip_flags_w), - fragment_offset => TO_UVEC(c_ip_fragment_offset, c_ip_fragment_offset_w), - time_to_live => TO_UVEC(c_ip_time_to_live, c_ip_time_to_live_w), - protocol => TO_UVEC(c_tb_ip_protocol, c_ip_protocol_w), - header_checksum => TO_UVEC(c_ip_header_checksum, c_ip_header_checksum_w), -- init value (or try 0xEBBD = 60349) - src_ip_addr => TO_UVEC(c_lcu_ip_addr, c_ip_addr_w), - dst_ip_addr => TO_UVEC(c_dut_ip_addr, c_ip_addr_w)); + CONSTANT c_tx_ip_header : t_network_ip_header := (version => TO_UVEC(c_network_ip_version, c_network_ip_version_w), + header_length => TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w), + services => TO_UVEC(c_network_ip_services, c_network_ip_services_w), + total_length => TO_UVEC(c_tb_ip_total_length, c_network_ip_total_length_w), + identification => TO_UVEC(c_network_ip_identification, c_network_ip_identification_w), + flags => TO_UVEC(c_network_ip_flags, c_network_ip_flags_w), + fragment_offset => TO_UVEC(c_network_ip_fragment_offset, c_network_ip_fragment_offset_w), + time_to_live => TO_UVEC(c_network_ip_time_to_live, c_network_ip_time_to_live_w), + protocol => TO_UVEC(c_tb_ip_protocol, c_network_ip_protocol_w), + header_checksum => TO_UVEC(c_network_ip_header_checksum, c_network_ip_header_checksum_w), -- init value (or try 0xEBBD = 60349) + src_ip_addr => TO_UVEC(c_lcu_ip_addr, c_network_ip_addr_w), + dst_ip_addr => TO_UVEC(c_dut_ip_addr, c_network_ip_addr_w)); -- . UDP header CONSTANT c_dut_udp_port_ctrl : NATURAL := 11; -- ETH demux UDP for control @@ -113,32 +111,33 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS CONSTANT c_dut_udp_port_en : NATURAL := 16#10000#; -- ETH demux UDP port enable bit 16 CONSTANT c_lcu_udp_port : NATURAL := 10; -- UDP port used for src_port CONSTANT c_dut_udp_port_st : NATURAL := c_dut_udp_port_st0; -- UDP port used for dst_port - CONSTANT c_tb_udp_total_length : NATURAL := c_udp_total_length + c_tb_nof_data; - CONSTANT c_tx_udp_header : t_udp_header := (src_port => TO_UVEC(c_lcu_udp_port, c_udp_port_w), - dst_port => TO_UVEC(c_dut_udp_port_st, c_udp_port_w), -- or use c_dut_udp_port_ctrl - total_length => TO_UVEC(c_tb_udp_total_length, c_udp_total_length_w), - checksum => TO_UVEC(c_udp_checksum, c_udp_checksum_w)); -- init value + CONSTANT c_tb_udp_total_length : NATURAL := c_network_udp_total_length + c_tb_nof_data; + CONSTANT c_tx_udp_header : t_network_udp_header := (src_port => TO_UVEC(c_lcu_udp_port, c_network_udp_port_w), + dst_port => TO_UVEC(c_dut_udp_port_st, c_network_udp_port_w), -- or use c_dut_udp_port_ctrl + total_length => TO_UVEC(c_tb_udp_total_length, c_network_udp_total_length_w), + checksum => TO_UVEC(c_network_udp_checksum, c_network_udp_checksum_w)); -- init value - CONSTANT c_total_hdr_slv : STD_LOGIC_VECTOR(c_eth_total_header_nof_words*c_word_w-1 DOWNTO 0) := c_tx_eth_header.word_align & - c_tx_eth_header.dst_mac & - c_tx_eth_header.src_mac & - c_tx_eth_header.eth_type & - c_tx_ip_header.version & - c_tx_ip_header.header_length & - c_tx_ip_header.services & - c_tx_ip_header.total_length & - c_tx_ip_header.identification & - c_tx_ip_header.flags & - c_tx_ip_header.fragment_offset & - c_tx_ip_header.time_to_live & - c_tx_ip_header.protocol & - c_tx_ip_header.header_checksum & - c_tx_ip_header.src_ip_addr & - c_tx_ip_header.dst_ip_addr & - c_tx_udp_header.src_port & - c_tx_udp_header.dst_port & - c_tx_udp_header.total_length & - c_tx_udp_header.checksum; + CONSTANT c_word_align : STD_LOGIC_VECTOR(c_network_total_header_32b_align_w-1 DOWNTO 0) := (OTHERS=>'0'); + CONSTANT c_total_hdr_slv : STD_LOGIC_VECTOR(c_network_total_header_32b_nof_words*c_word_w-1 DOWNTO 0) := c_word_align & + c_tx_eth_header.dst_mac & + c_tx_eth_header.src_mac & + c_tx_eth_header.eth_type & + c_tx_ip_header.version & + c_tx_ip_header.header_length & + c_tx_ip_header.services & + c_tx_ip_header.total_length & + c_tx_ip_header.identification & + c_tx_ip_header.flags & + c_tx_ip_header.fragment_offset & + c_tx_ip_header.time_to_live & + c_tx_ip_header.protocol & + c_tx_ip_header.header_checksum & + c_tx_ip_header.src_ip_addr & + c_tx_ip_header.dst_ip_addr & + c_tx_udp_header.src_port & + c_tx_udp_header.dst_port & + c_tx_udp_header.total_length & + c_tx_udp_header.checksum; -- =========================================================================================================================================================== @@ -152,9 +151,9 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS -- ETH TSE interface SIGNAL eth_psc_access : STD_LOGIC; - SIGNAL tb_eth_hdr : t_eth_header := c_tx_eth_header; - SIGNAL tb_ip_hdr : t_ip_header := c_tx_ip_header; - SIGNAL tb_udp_hdr : t_udp_header := c_tx_udp_header; + SIGNAL tb_eth_hdr : t_network_eth_header := c_tx_eth_header; + SIGNAL tb_ip_hdr : t_network_ip_header := c_tx_ip_header; + SIGNAL tb_udp_hdr : t_network_udp_header := c_tx_udp_header; SIGNAL eth_clk : STD_LOGIC := '0'; -- tse reference clock SIGNAL mm_clk : STD_LOGIC := '0'; @@ -307,13 +306,13 @@ BEGIN dut_eth_init <= '0'; -- MM Stimuli: write HEADER to RAM - FOR i IN c_eth_total_header_nof_words DOWNTO 1 LOOP + FOR i IN c_network_total_header_32b_nof_words DOWNTO 1 LOOP -- Extract words from SLV from left to right v_mm_wr_hdr := c_total_hdr_slv(i*c_word_w-1 DOWNTO i*c_word_w - c_word_w); proc_mem_mm_bus_wr(v_mm_wr_addr, v_mm_wr_hdr, mm_clk, ram_hdr_mosi); proc_common_wait_some_cycles(mm_clk, 5); - IF v_mm_wr_addr<c_eth_total_header_nof_words-1 THEN + IF v_mm_wr_addr<c_network_total_header_32b_nof_words-1 THEN v_mm_wr_addr := v_mm_wr_addr + 1; END IF; END LOOP; @@ -345,7 +344,7 @@ BEGIN -- Read the stripped header via MM bus and print it in the transcript window print_str("Reading stripped header from RAM:"); - FOR i IN 0 TO c_eth_total_header_nof_words-1 LOOP + FOR i IN 0 TO c_network_total_header_32b_nof_words-1 LOOP proc_mem_mm_bus_rd(i, mm_clk, ram_hdr_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); print_str("[" & time_to_str(now) & "] 0x" & slv_to_hex(ram_hdr_miso.rddata(c_word_w-1 DOWNTO 0))); @@ -421,7 +420,7 @@ BEGIN GENERIC MAP ( g_data_w => g_data_w, g_symbol_w => g_symbol_w, - g_hdr_nof_words => c_eth_total_header_nof_words + g_hdr_nof_words => c_network_total_header_32b_nof_words ) PORT MAP ( mm_rst => mm_rst, @@ -459,8 +458,8 @@ BEGIN GENERIC MAP ( g_data_w => g_data_w, g_symbol_w => g_symbol_w, - g_hdr_nof_words => c_eth_total_header_nof_words, - g_tail_nof_words=> (c_eth_crc_len * g_symbol_w) / c_word_w + g_hdr_nof_words => c_network_total_header_32b_nof_words, + g_tail_nof_words=> (c_network_eth_crc_len * g_symbol_w) / c_word_w ) PORT MAP ( mm_rst => mm_rst, diff --git a/libraries/technology/tse/tb_tech_tse.vhd b/libraries/technology/tse/tb_tech_tse.vhd index d8ef19e2d5b29a2facaa83304ef6556d52d3b0ef..e000c9d7dea0f1b21df16b65896bbe40d58b79e7 100644 --- a/libraries/technology/tse/tb_tech_tse.vhd +++ b/libraries/technology/tse/tb_tech_tse.vhd @@ -36,6 +36,7 @@ USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE WORK.tech_tse_pkg.ALL; USE WORK.tb_tech_tse_pkg.ALL; @@ -63,18 +64,17 @@ ARCHITECTURE tb OF tb_tech_tse IS CONSTANT c_tx_ready_latency : NATURAL := c_tse_tx_ready_latency; -- 0, 1 are supported, must match TSE MAC c_tse_tx_ready_latency CONSTANT c_nof_tx_not_valid : NATURAL := 0; -- when > 0 then pull tx valid low for c_nof_tx_not_valid beats during tx - CONSTANT c_word_align : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w); - CONSTANT c_dst_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300"; - CONSTANT c_src_mac : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC - CONSTANT c_ethertype : STD_LOGIC_VECTOR(c_eth_type_slv'RANGE) := X"10FA"; - CONSTANT c_etherlen : STD_LOGIC_VECTOR(c_eth_type_slv'RANGE) := "0000000000010000"; + CONSTANT c_dst_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300"; + CONSTANT c_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC"; -- = 12-34-56-78-9A-BC + CONSTANT c_ethertype : STD_LOGIC_VECTOR(c_network_eth_type_slv'RANGE) := X"10FA"; + CONSTANT c_etherlen : STD_LOGIC_VECTOR(c_network_eth_type_slv'RANGE) := "0000000000010000"; -- Packet headers - CONSTANT c_eth_header_loopback : t_eth_header := (c_word_align, c_src_mac, c_src_mac, c_ethertype); - CONSTANT c_eth_header_etherlen : t_eth_header := (c_word_align, c_src_mac, c_src_mac, c_etherlen); + CONSTANT c_eth_header_loopback : t_network_eth_header := (c_src_mac, c_src_mac, c_ethertype); + CONSTANT c_eth_header_etherlen : t_network_eth_header := (c_src_mac, c_src_mac, c_etherlen); - SIGNAL total_header_loopback : t_eth_total_header; - SIGNAL total_header_etherlen : t_eth_total_header; + SIGNAL total_header_loopback : t_network_total_header; + SIGNAL total_header_etherlen : t_network_total_header; -- Clocks and reset SIGNAL tb_end : STD_LOGIC := '0'; diff --git a/libraries/technology/tse/tb_tech_tse_pkg.vhd b/libraries/technology/tse/tb_tech_tse_pkg.vhd index ee503fe27b5800c70d1d41dba05dd6d23b8ac39e..26a153f9cf475cde2dd18ac231bbacbaf1ef2d3d 100644 --- a/libraries/technology/tse/tb_tech_tse_pkg.vhd +++ b/libraries/technology/tse/tb_tech_tse_pkg.vhd @@ -29,6 +29,7 @@ USE common_lib.tb_common_mem_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.tb_dp_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE common_lib.common_network_total_header_pkg.ALL; USE WORK.tech_tse_pkg.ALL; @@ -48,13 +49,13 @@ PACKAGE tb_tech_tse_pkg IS CONSTANT c_tse_tx_fifo_depth : IN NATURAL; CONSTANT c_tse_rx_fifo_depth : IN NATURAL; CONSTANT c_tx_ready_latency : IN NATURAL; - CONSTANT src_mac : IN STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE); + CONSTANT src_mac : IN STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE); SIGNAL psc_access : OUT STD_LOGIC; SIGNAL mm_clk : IN STD_LOGIC; SIGNAL mm_miso : IN t_mem_miso; SIGNAL mm_mosi : OUT t_mem_mosi); - PROCEDURE proc_tse_tx_packet(CONSTANT total_header : IN t_eth_total_header; + PROCEDURE proc_tse_tx_packet(CONSTANT total_header : IN t_network_total_header; CONSTANT data_len : IN NATURAL; -- in symbols = octets = bytes CONSTANT c_data_type : IN NATURAL; -- c_tb_tse_data_type_* CONSTANT c_ready_latency : IN NATURAL; -- 0, 1 are supported by proc_dp_stream_ready_latency() @@ -65,7 +66,7 @@ PACKAGE tb_tech_tse_pkg IS SIGNAL ff_src_out : OUT t_dp_sosi); -- Receive and verify packet from the TSE MAC - PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN t_eth_total_header; + PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN t_network_total_header; CONSTANT c_data_type : IN NATURAL; -- c_tb_tse_data_type_* SIGNAL ff_clk : IN STD_LOGIC; SIGNAL ff_snk_in : IN t_dp_sosi; @@ -77,8 +78,8 @@ END tb_tech_tse_pkg; PACKAGE BODY tb_tech_tse_pkg IS -- LOCAL ITEMS --------------------------------------------------------------- - CONSTANT c_nof_eth_beats : NATURAL := c_eth_nof_words; -- nof words in eth part of the header - CONSTANT c_nof_hdr_beats : NATURAL := c_eth_total_header_nof_words; -- nof words in the total header + CONSTANT c_nof_eth_beats : NATURAL := c_network_total_header_32b_eth_nof_words; -- nof words in eth part of the header + CONSTANT c_nof_hdr_beats : NATURAL := c_network_total_header_32b_nof_words; -- nof words in the total header -- GLOBAL ITEMS -------------------------------------------------------------- @@ -86,11 +87,11 @@ PACKAGE BODY tb_tech_tse_pkg IS FUNCTION func_tb_tse_header_size(data_type : NATURAL) RETURN NATURAL IS BEGIN CASE data_type IS - WHEN c_tb_tse_data_type_symbols => RETURN c_eth_nof_words; - WHEN c_tb_tse_data_type_counter => RETURN c_eth_nof_words; + WHEN c_tb_tse_data_type_symbols => RETURN c_network_total_header_32b_eth_nof_words; + WHEN c_tb_tse_data_type_counter => RETURN c_network_total_header_32b_eth_nof_words; WHEN OTHERS => NULL; END CASE; - RETURN c_eth_total_header_nof_words; + RETURN c_network_total_header_32b_nof_words; END func_tb_tse_header_size; ------------------------------------------------------------------------------ @@ -115,7 +116,7 @@ PACKAGE BODY tb_tech_tse_pkg IS CONSTANT c_tse_tx_fifo_depth : IN NATURAL; CONSTANT c_tse_rx_fifo_depth : IN NATURAL; CONSTANT c_tx_ready_latency : IN NATURAL; - CONSTANT src_mac : IN STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE); + CONSTANT src_mac : IN STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE); SIGNAL psc_access : OUT STD_LOGIC; SIGNAL mm_clk : IN STD_LOGIC; SIGNAL mm_miso : IN t_mem_miso; @@ -216,7 +217,7 @@ PACKAGE BODY tb_tech_tse_pkg IS -- . Use word aligned payload data, so with half word inserted before the 14 byte header -- . Packets can be send immediately after eachother so new sop directly after last eop -- . The word rate is controlled by respecting ready from the MAC - PROCEDURE proc_tse_tx_packet(CONSTANT total_header : IN t_eth_total_header; + PROCEDURE proc_tse_tx_packet(CONSTANT total_header : IN t_network_total_header; CONSTANT data_len : IN NATURAL; -- in symbols = octets = bytes CONSTANT c_data_type : IN NATURAL; -- c_tb_tse_data_type_* CONSTANT c_ready_latency : IN NATURAL; -- 0, 1 are supported by proc_dp_stream_ready_latency() @@ -225,10 +226,10 @@ PACKAGE BODY tb_tech_tse_pkg IS SIGNAL ff_en : IN STD_LOGIC; -- similar purpose as c_nof_not_valid, but not used so pass on signal '1' SIGNAL ff_src_in : IN t_dp_siso; SIGNAL ff_src_out : OUT t_dp_sosi) IS - CONSTANT c_eth_header : t_eth_header := total_header.eth; - CONSTANT c_arp_packet : t_eth_total_header_arr := func_eth_arp_total_header( total_header.eth, total_header.arp); - CONSTANT c_icmp_header : t_eth_total_header_arr := func_eth_icmp_total_header(total_header.eth, total_header.ip, total_header.icmp); - CONSTANT c_udp_header : t_eth_total_header_arr := func_eth_udp_total_header( total_header.eth, total_header.ip, total_header.udp); + CONSTANT c_eth_header : t_network_eth_header := total_header.eth; + CONSTANT c_arp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_arp( total_header.eth, total_header.arp); + CONSTANT c_icmp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_icmp(total_header.eth, total_header.ip, total_header.icmp); + CONSTANT c_udp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_udp( total_header.eth, total_header.ip, total_header.udp); CONSTANT c_mod : NATURAL := data_len MOD c_tse_symbols_per_beat; CONSTANT c_nof_data_beats : NATURAL := data_len / c_tse_symbols_per_beat + sel_a_b(c_mod, 1, 0); @@ -240,30 +241,30 @@ PACKAGE BODY tb_tech_tse_pkg IS ---------------------------------------------------------------------------- -- ETH Header -- . sop - ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(0)); -- all arp, icmp and udp contain the same eth header, so it is ok to use c_udp_header + ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(0)); -- all arp, icmp and udp contain the same eth header, so it is ok to use c_udp_words_arr proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops + ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops FOR I IN 2 TO c_nof_eth_beats-1 LOOP proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(I)); + ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(I)); END LOOP; ---------------------------------------------------------------------------- -- ETH higher layer headers IF c_data_type=c_tb_tse_data_type_arp THEN FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-2 LOOP proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(c_arp_packet(I)); + ff_src_out.data <= RESIZE_DP_DATA(c_arp_words_arr(I)); END LOOP; proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); -- . eop - ff_src_out.data <= RESIZE_DP_DATA(c_arp_packet(c_nof_hdr_beats-1)); + ff_src_out.data <= RESIZE_DP_DATA(c_arp_words_arr(c_nof_hdr_beats-1)); proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); ELSIF c_data_type=c_tb_tse_data_type_ping OR c_data_type=c_tb_tse_data_type_udp THEN FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); CASE c_data_type IS - WHEN c_tb_tse_data_type_ping => ff_src_out.data <= RESIZE_DP_DATA(c_icmp_header(I)); - WHEN c_tb_tse_data_type_udp => ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(I)); + WHEN c_tb_tse_data_type_ping => ff_src_out.data <= RESIZE_DP_DATA(c_icmp_words_arr(I)); + WHEN c_tb_tse_data_type_udp => ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(I)); WHEN OTHERS => NULL; END CASE; END LOOP; @@ -319,15 +320,15 @@ PACKAGE BODY tb_tech_tse_pkg IS -- . The CRC32 is also passed on to the user at eop. -- . Note that when empty/=0 then the CRC32 is not word aligned, so therefore use prev_data to be able -- to handle part of last data word in case empty/=0 at eop - PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN t_eth_total_header; + PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN t_network_total_header; CONSTANT c_data_type : IN NATURAL; -- c_tb_tse_data_type_* SIGNAL ff_clk : IN STD_LOGIC; SIGNAL ff_snk_in : IN t_dp_sosi; SIGNAL ff_snk_out : OUT t_dp_siso) IS - CONSTANT c_eth_header : t_eth_header := total_header.eth; - CONSTANT c_arp_packet : t_eth_total_header_arr := func_eth_arp_total_header( total_header.eth, total_header.arp); - CONSTANT c_icmp_header : t_eth_total_header_arr := func_eth_icmp_total_header(total_header.eth, total_header.ip, total_header.icmp); - CONSTANT c_udp_header : t_eth_total_header_arr := func_eth_udp_total_header( total_header.eth, total_header.ip, total_header.udp); + CONSTANT c_eth_header : t_network_eth_header := total_header.eth; + CONSTANT c_arp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_arp( total_header.eth, total_header.arp); + CONSTANT c_icmp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_icmp(total_header.eth, total_header.ip, total_header.icmp); + CONSTANT c_udp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_udp( total_header.eth, total_header.ip, total_header.udp); VARIABLE v_sym : UNSIGNED(c_tse_symbol_w-1 DOWNTO 0) := (OTHERS=>'0'); VARIABLE v_num : UNSIGNED(c_tse_data_w-1 DOWNTO 0) := (OTHERS=>'0'); VARIABLE v_empty : NATURAL; @@ -355,7 +356,7 @@ PACKAGE BODY tb_tech_tse_pkg IS IF c_data_type=c_tb_tse_data_type_arp THEN FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP proc_dp_stream_valid(ff_clk, ff_snk_in.valid); - ASSERT ff_snk_in.data(31 DOWNTO 0) = c_arp_packet(I) REPORT "RX: Wrong ARP response word" SEVERITY ERROR; + ASSERT ff_snk_in.data(31 DOWNTO 0) = c_arp_words_arr(I) REPORT "RX: Wrong ARP response word" SEVERITY ERROR; END LOOP; -- . continue to eop WHILE ff_snk_in.eop /= '1' LOOP @@ -364,10 +365,10 @@ PACKAGE BODY tb_tech_tse_pkg IS ELSIF c_data_type=c_tb_tse_data_type_ping OR c_data_type=c_tb_tse_data_type_udp THEN FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP proc_dp_stream_valid(ff_clk, ff_snk_in.valid); - IF I/=c_ip_header_checksum_wi THEN -- do not verify tx ip header checksum + IF I/=c_network_total_header_32b_ip_header_checksum_wi THEN -- do not verify tx ip header checksum CASE c_data_type IS - WHEN c_tb_tse_data_type_ping => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_icmp_header(I) REPORT "RX: Wrong IP/ICMP = PING response word" SEVERITY ERROR; - WHEN c_tb_tse_data_type_udp => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_udp_header(I) REPORT "RX: Wrong IP/UDP response word" SEVERITY ERROR; + WHEN c_tb_tse_data_type_ping => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_icmp_words_arr(I) REPORT "RX: Wrong IP/ICMP = PING response word" SEVERITY ERROR; + WHEN c_tb_tse_data_type_udp => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_udp_words_arr(I) REPORT "RX: Wrong IP/UDP response word" SEVERITY ERROR; WHEN OTHERS => NULL; END CASE; END IF;