From 7395517e522e4dcce39a696cf7981e9ece423e77 Mon Sep 17 00:00:00 2001 From: Larry Ruckman Date: Wed, 10 Jul 2024 18:12:36 -0700 Subject: [PATCH] depreciating VLAN support in ethernet/IpV4Engine because never tested and never used --- ethernet/EthMacCore/rtl/EthMacPkg.vhd | 4 +- ethernet/IpV4Engine/rtl/ArpEngine.vhd | 198 +++++------------ ethernet/IpV4Engine/rtl/IpV4Engine.vhd | 15 +- ethernet/IpV4Engine/rtl/IpV4EngineDeMux.vhd | 133 +++-------- ethernet/IpV4Engine/rtl/IpV4EngineRx.vhd | 172 +++++---------- ethernet/IpV4Engine/rtl/IpV4EngineTx.vhd | 231 ++++++-------------- ethernet/IpV4Engine/tb/IpV4EngineCoreTb.vhd | 20 +- ethernet/IpV4Engine/tb/IpV4EngineTb.vhd | 14 +- ethernet/UdpEngine/rtl/UdpEngineWrapper.vhd | 4 +- 9 files changed, 231 insertions(+), 560 deletions(-) diff --git a/ethernet/EthMacCore/rtl/EthMacPkg.vhd b/ethernet/EthMacCore/rtl/EthMacPkg.vhd index d92ffdfa52..fc95888382 100644 --- a/ethernet/EthMacCore/rtl/EthMacPkg.vhd +++ b/ethernet/EthMacCore/rtl/EthMacPkg.vhd @@ -17,7 +17,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -30,7 +29,6 @@ package EthMacPkg is -- EtherTypes constant ARP_TYPE_C : slv(15 downto 0) := x"0608"; -- EtherType = ARP = 0x0806 constant IPV4_TYPE_C : slv(15 downto 0) := x"0008"; -- EtherType = IPV4 = 0x0800 - constant VLAN_TYPE_C : slv(15 downto 0) := x"0081"; -- EtherType = VLAN = 0x8100 -- IPV4 Protocol Constants constant UDP_C : slv(7 downto 0) := x"11"; -- Protocol = UDP = 0x11 @@ -68,7 +66,7 @@ package EthMacPkg is -- TDEST_INTERLEAVE_C => EMAC_AXIS_CONFIG_C.TDEST_INTERLEAVE_C, TSTRB_EN_C => EMAC_AXIS_CONFIG_C.TSTRB_EN_C, TDATA_BYTES_C => EMAC_AXIS_CONFIG_C.TDATA_BYTES_C, - TDEST_BITS_C => 0, -- TDEST not used internally of EthMacTop.vhd + TDEST_BITS_C => 0, -- TDEST not used internally of EthMacTop.vhd TID_BITS_C => EMAC_AXIS_CONFIG_C.TID_BITS_C, TKEEP_MODE_C => EMAC_AXIS_CONFIG_C.TKEEP_MODE_C, TUSER_BITS_C => EMAC_AXIS_CONFIG_C.TUSER_BITS_C, diff --git a/ethernet/IpV4Engine/rtl/ArpEngine.vhd b/ethernet/IpV4Engine/rtl/ArpEngine.vhd index d53315ad0c..075f676d22 100644 --- a/ethernet/IpV4Engine/rtl/ArpEngine.vhd +++ b/ethernet/IpV4Engine/rtl/ArpEngine.vhd @@ -17,7 +17,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -28,8 +27,7 @@ entity ArpEngine is generic ( TPD_G : time := 1 ns; CLIENT_SIZE_G : positive := 1; - CLK_FREQ_G : real := 156.25E+06; -- In units of Hz - VLAN_G : boolean := false); + CLK_FREQ_G : real := 156.25E+06); -- In units of Hz port ( -- Local Configuration localMac : in slv(47 downto 0); @@ -55,8 +53,8 @@ architecture rtl of ArpEngine is constant BROADCAST_MAC_C : slv(47 downto 0) := (others => '1'); constant HARDWWARE_TYPE_C : slv(15 downto 0) := x"0100"; -- HardwareType = ETH = 0x0001 constant PROTOCOL_TYPE_C : slv(15 downto 0) := x"0008"; -- ProtocolType = IP = 0x0800 - constant HARDWWARE_LEN_C : slv(7 downto 0) := x"06"; -- HardwareLength = 6 (6 Bytes/MAC) - constant PROTOCOL_LEN_C : slv(7 downto 0) := x"04"; -- ProtocolLength = 4 (6 Bytes/IP) + constant HARDWWARE_LEN_C : slv(7 downto 0) := x"06"; -- HardwareLength = 6 (6 Bytes/MAC) + constant PROTOCOL_LEN_C : slv(7 downto 0) := x"04"; -- ProtocolLength = 4 (6 Bytes/IP) constant ARP_REQ_C : slv(15 downto 0) := x"0100"; -- OpCode = ARP Request = 0x0001 constant ARP_REPLY_C : slv(15 downto 0) := x"0200"; -- OpCode = ARP Reply = 0x0002 constant TIMER_1_SEC_C : natural := getTimeRatio(CLK_FREQ_G, 1.0); @@ -100,7 +98,8 @@ architecture rtl of ArpEngine is begin - comb : process (arpAckSlaves, arpReqMasters, ibArpMaster, localIp, localMac, obArpSlave, r, rst) is + comb : process (arpAckSlaves, arpReqMasters, ibArpMaster, localIp, localMac, + obArpSlave, r, rst) is variable v : RegType; variable i : natural; begin @@ -155,45 +154,21 @@ begin v.arpAckMasters(r.ackCnt).tValid := '1'; v.arpAckMasters(r.ackCnt).tData(47 downto 0) := localMac; else - ------------------------ - -- Checking for non-VLAN - ------------------------ - if (VLAN_G = false) then - v.tData(0)(47 downto 0) := BROADCAST_MAC_C; - v.tData(0)(95 downto 48) := localMac; - v.tData(0)(111 downto 96) := ARP_TYPE_C; - v.tData(0)(127 downto 112) := HARDWWARE_TYPE_C; - v.tData(1)(15 downto 0) := PROTOCOL_TYPE_C; - v.tData(1)(23 downto 16) := HARDWWARE_LEN_C; - v.tData(1)(31 downto 24) := PROTOCOL_LEN_C; - v.tData(1)(47 downto 32) := ARP_REQ_C; - v.tData(1)(95 downto 48) := localMac; - v.tData(1)(127 downto 96) := localIp; - v.tData(2)(47 downto 0) := BROADCAST_MAC_C; - v.tData(2)(79 downto 48) := arpReqMasters(r.reqCnt).tData(31 downto 0); -- Known IP address - v.tData(2)(127 downto 80) := (others => '0'); - -------------------- - -- Checking for VLAN - -------------------- - else - v.tData(0)(47 downto 0) := BROADCAST_MAC_C; - v.tData(0)(95 downto 48) := localMac; - v.tData(0)(111 downto 96) := VLAN_TYPE_C; - v.tData(0)(127 downto 122) := (others => '0'); - v.tData(1)(15 downto 0) := ARP_TYPE_C; - v.tData(1)(31 downto 16) := HARDWWARE_TYPE_C; - v.tData(1)(47 downto 32) := PROTOCOL_TYPE_C; - v.tData(1)(55 downto 48) := HARDWWARE_LEN_C; - v.tData(1)(63 downto 56) := PROTOCOL_LEN_C; - v.tData(1)(79 downto 64) := ARP_REQ_C; - v.tData(1)(127 downto 80) := localMac; - v.tData(2)(31 downto 0) := localIp; - v.tData(2)(79 downto 32) := BROADCAST_MAC_C; - v.tData(2)(111 downto 80) := arpReqMasters(r.reqCnt).tData(31 downto 0); -- Known IP address - v.tData(2)(127 downto 112) := (others => '0'); - end if; + v.tData(0)(47 downto 0) := BROADCAST_MAC_C; + v.tData(0)(95 downto 48) := localMac; + v.tData(0)(111 downto 96) := ARP_TYPE_C; + v.tData(0)(127 downto 112) := HARDWWARE_TYPE_C; + v.tData(1)(15 downto 0) := PROTOCOL_TYPE_C; + v.tData(1)(23 downto 16) := HARDWWARE_LEN_C; + v.tData(1)(31 downto 24) := PROTOCOL_LEN_C; + v.tData(1)(47 downto 32) := ARP_REQ_C; + v.tData(1)(95 downto 48) := localMac; + v.tData(1)(127 downto 96) := localIp; + v.tData(2)(47 downto 0) := BROADCAST_MAC_C; + v.tData(2)(79 downto 48) := arpReqMasters(r.reqCnt).tData(31 downto 0); -- Known IP address + v.tData(2)(127 downto 80) := (others => '0'); -- Next state - v.state := TX_S; + v.state := TX_S; end if; end if; end if; @@ -259,70 +234,32 @@ begin v.state := IDLE_S; -- Reset the counter v.cnt := 0; - ------------------------ - -- Checking for non-VLAN - ------------------------ - if (VLAN_G = false) then - if (r.tData(0)(127 downto 112) = HARDWWARE_TYPE_C) -- Check for valid Hardware type - and (r.tData(1)(15 downto 0) = PROTOCOL_TYPE_C) -- Check for valid Protocol type - and (r.tData(1)(23 downto 16) = HARDWWARE_LEN_C) -- Check for valid Hardware Length - and (r.tData(1)(31 downto 24) = PROTOCOL_LEN_C) then -- Check for valid Protocol Length - -- Check OP-CODE = ARP Request - if (r.tData(1)(47 downto 32) = ARP_REQ_C) then - -- Check if the target IP address matches local address - if r.tData(2)(79 downto 48) = localIp then - -- Modified the local buffer to become a reply packet - v.tData(0)(47 downto 0) := r.tData(0)(95 downto 48); - v.tData(0)(95 downto 48) := localMac; - v.tData(1)(47 downto 32) := ARP_REPLY_C; - v.tData(1)(95 downto 48) := localMac; - v.tData(1)(127 downto 96) := localIp; - v.tData(2)(47 downto 0) := r.tData(1)(95 downto 48); - v.tData(2)(79 downto 48) := r.tData(1)(127 downto 96); - v.tData(2)(127 downto 80) := (others => '0'); - -- Next state - v.state := TX_S; - end if; - -- Check OP-CODE = ARP Reply - elsif (r.tData(1)(47 downto 32) = ARP_REPLY_C) then - -- Check if the target IP + MAC address matches local address - if (r.tData(2)(47 downto 0) = localMac) and (r.tData(2)(79 downto 48) = localIp) then - -- Next state - v.state := SCAN_S; - end if; + if (r.tData(0)(127 downto 112) = HARDWWARE_TYPE_C) -- Check for valid Hardware type + and (r.tData(1)(15 downto 0) = PROTOCOL_TYPE_C) -- Check for valid Protocol type + and (r.tData(1)(23 downto 16) = HARDWWARE_LEN_C) -- Check for valid Hardware Length + and (r.tData(1)(31 downto 24) = PROTOCOL_LEN_C) then -- Check for valid Protocol Length + -- Check OP-CODE = ARP Request + if (r.tData(1)(47 downto 32) = ARP_REQ_C) then + -- Check if the target IP address matches local address + if r.tData(2)(79 downto 48) = localIp then + -- Modified the local buffer to become a reply packet + v.tData(0)(47 downto 0) := r.tData(0)(95 downto 48); + v.tData(0)(95 downto 48) := localMac; + v.tData(1)(47 downto 32) := ARP_REPLY_C; + v.tData(1)(95 downto 48) := localMac; + v.tData(1)(127 downto 96) := localIp; + v.tData(2)(47 downto 0) := r.tData(1)(95 downto 48); + v.tData(2)(79 downto 48) := r.tData(1)(127 downto 96); + v.tData(2)(127 downto 80) := (others => '0'); + -- Next state + v.state := TX_S; end if; - end if; - -------------------- - -- Checking for VLAN - -------------------- - else - if (r.tData(1)(31 downto 16) = HARDWWARE_TYPE_C) -- Check for valid Hardware type - and (r.tData(1)(47 downto 32) = PROTOCOL_TYPE_C) -- Check for valid Protocol type - and (r.tData(1)(55 downto 48) = HARDWWARE_LEN_C) -- Check for valid Hardware Length - and (r.tData(1)(63 downto 56) = PROTOCOL_LEN_C) then -- Check for valid Protocol Length - -- Check OP-CODE = ARP Request - if (r.tData(1)(79 downto 64) = ARP_REQ_C) then - -- Check if the target IP address matches local address - if r.tData(2)(111 downto 80) = localIp then - -- Modified the local buffer to become a reply packet - v.tData(0)(47 downto 0) := r.tData(0)(95 downto 48); - v.tData(0)(95 downto 48) := localMac; - v.tData(1)(79 downto 64) := ARP_REPLY_C; - v.tData(1)(127 downto 80) := localMac; - v.tData(2)(31 downto 0) := localIp; - v.tData(2)(79 downto 32) := r.tData(1)(127 downto 80); - v.tData(2)(111 downto 80) := r.tData(2)(31 downto 0); - v.tData(2)(127 downto 112) := (others => '0'); - -- Next state - v.state := TX_S; - end if; - -- Check OP-CODE = ARP Reply - elsif (r.tData(1)(79 downto 64) = ARP_REPLY_C) then - -- Check if the target IP + MAC address matches local address - if (r.tData(2)(79 downto 32) = localMac) and (r.tData(2)(111 downto 80) = localIp) then - -- Next state - v.state := SCAN_S; - end if; + -- Check OP-CODE = ARP Reply + elsif (r.tData(1)(47 downto 32) = ARP_REPLY_C) then + -- Check if the target IP + MAC address matches local address + if (r.tData(2)(47 downto 0) = localMac) and (r.tData(2)(79 downto 48) = localIp) then + -- Next state + v.state := SCAN_S; end if; end if; end if; @@ -330,29 +267,14 @@ begin when SCAN_S => -- Check the tValid if (arpReqMasters(r.ackCnt).tValid = '1') and (v.arpAckMasters(r.ackCnt).tValid = '0') then - ------------------------ - -- Checking for non-VLAN - ------------------------ - if (VLAN_G = false) then - -- Check if Source's IP address match request IP address - if arpReqMasters(r.ackCnt).tData(31 downto 0) = r.tData(1)(127 downto 96) then - -- ACK the request - v.arpReqSlaves(r.ackCnt).tReady := '1'; - v.arpAckMasters(r.ackCnt).tValid := '1'; - v.arpAckMasters(r.ackCnt).tData(47 downto 0) := r.tData(1)(95 downto 48); -- Source's MAC address - -- Reset the timer - v.arpTimers(r.ackCnt) := 0; - end if; - else - -- Check if Source's IP address match request IP address - if arpReqMasters(r.ackCnt).tData(31 downto 0) = r.tData(2)(31 downto 0) then - -- ACK the request - v.arpReqSlaves(r.ackCnt).tReady := '1'; - v.arpAckMasters(r.ackCnt).tValid := '1'; - v.arpAckMasters(r.ackCnt).tData(47 downto 0) := r.tData(1)(127 downto 80); -- Source's MAC address - -- Reset the timer - v.arpTimers(r.ackCnt) := 0; - end if; + -- Check if Source's IP address match request IP address + if arpReqMasters(r.ackCnt).tData(31 downto 0) = r.tData(1)(127 downto 96) then + -- ACK the request + v.arpReqSlaves(r.ackCnt).tReady := '1'; + v.arpAckMasters(r.ackCnt).tValid := '1'; + v.arpAckMasters(r.ackCnt).tData(47 downto 0) := r.tData(1)(95 downto 48); -- Source's MAC address + -- Reset the timer + v.arpTimers(r.ackCnt) := 0; end if; end if; -- Check the counter @@ -369,23 +291,19 @@ begin -- Check if ready to move data if v.txArpMaster.tValid = '0' then -- Move data - v.txArpMaster.tValid := '1'; - v.txArpMaster.tData(127 downto 0) := r.tData(r.cnt); + v.txArpMaster.tValid := '1'; + v.txArpMaster.tData(127 downto 0) := r.tData(r.cnt); -- Increment the counter - v.cnt := r.cnt + 1; + v.cnt := r.cnt + 1; if r.cnt = 0 then ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.txArpMaster, '1'); elsif r.cnt = 2 then -- Set the EOF flag - v.txArpMaster.tLast := '1'; + v.txArpMaster.tLast := '1'; -- Set the tKeep - if (VLAN_G = false) then - v.txArpMaster.tKeep(15 downto 0) := x"03FF"; - else - v.txArpMaster.tKeep(15 downto 0) := x"3FFF"; - end if; + v.txArpMaster.tKeep(15 downto 0) := x"03FF"; -- Next state - v.state := IDLE_S; + v.state := IDLE_S; end if; end if; ---------------------------------------------------------------------- diff --git a/ethernet/IpV4Engine/rtl/IpV4Engine.vhd b/ethernet/IpV4Engine/rtl/IpV4Engine.vhd index e9d354f53d..81146736dc 100644 --- a/ethernet/IpV4Engine/rtl/IpV4Engine.vhd +++ b/ethernet/IpV4Engine/rtl/IpV4Engine.vhd @@ -29,8 +29,7 @@ entity IpV4Engine is CLK_FREQ_G : real := 156.25E+06; -- In units of Hz TTL_G : slv(7 downto 0) := x"20"; IGMP_G : boolean := false; - IGMP_GRP_SIZE : positive := 1; - VLAN_G : boolean := false); -- true = VLAN support + IGMP_GRP_SIZE : positive := 1); port ( -- Local Configurations localMac : in slv(47 downto 0); -- big-Endian configuration @@ -97,8 +96,7 @@ begin U_EthFrameDeMux : entity surf.IpV4EngineDeMux generic map ( - TPD_G => TPD_G, - VLAN_G => VLAN_G) + TPD_G => TPD_G) port map ( -- Local Configurations localMac => localMac, @@ -135,8 +133,7 @@ begin generic map ( TPD_G => TPD_G, CLIENT_SIZE_G => CLIENT_SIZE_G, - CLK_FREQ_G => CLK_FREQ_G, - VLAN_G => VLAN_G) + CLK_FREQ_G => CLK_FREQ_G) port map ( -- Local Configurations localMac => localMac, @@ -159,8 +156,7 @@ begin generic map ( TPD_G => TPD_G, PROTOCOL_SIZE_G => PROTOCOL_SIZE_C, - PROTOCOL_G => PROTOCOL_C, - VLAN_G => VLAN_G) + PROTOCOL_G => PROTOCOL_C) port map ( -- Interface to Ethernet Frame MUX/DEMUX ibIpv4Master => ibIpv4Master, @@ -179,8 +175,7 @@ begin TPD_G => TPD_G, PROTOCOL_SIZE_G => PROTOCOL_SIZE_C, PROTOCOL_G => PROTOCOL_C, - TTL_G => TTL_G, - VLAN_G => VLAN_G) + TTL_G => TTL_G) port map ( -- Local Configurations localMac => localMac, diff --git a/ethernet/IpV4Engine/rtl/IpV4EngineDeMux.vhd b/ethernet/IpV4Engine/rtl/IpV4EngineDeMux.vhd index 9d7eaaea45..fa89a1e598 100644 --- a/ethernet/IpV4Engine/rtl/IpV4EngineDeMux.vhd +++ b/ethernet/IpV4Engine/rtl/IpV4EngineDeMux.vhd @@ -17,7 +17,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -26,8 +25,7 @@ use surf.EthMacPkg.all; entity IpV4EngineDeMux is generic ( - TPD_G : time := 1 ns; - VLAN_G : boolean := false); + TPD_G : time := 1 ns); port ( -- Local Configurations localMac : in slv(47 downto 0); -- big-Endian configuration @@ -48,11 +46,6 @@ architecture rtl of IpV4EngineDeMux is constant BROADCAST_MAC_C : slv(47 downto 0) := (others => '1'); - type StateType is ( - IDLE_S, - CHECK_S, - MOVE_S); - type RegType is record arpSel : sl; ipv4Sel : sl; @@ -60,7 +53,6 @@ architecture rtl of IpV4EngineDeMux is ibArpMaster : AxiStreamMasterType; ibIpv4Master : AxiStreamMasterType; obMacSlave : AxiStreamSlaveType; - state : StateType; end record RegType; constant REG_INIT_C : RegType := ( @@ -69,8 +61,7 @@ architecture rtl of IpV4EngineDeMux is dly => AXI_STREAM_MASTER_INIT_C, ibArpMaster => AXI_STREAM_MASTER_INIT_C, ibIpv4Master => AXI_STREAM_MASTER_INIT_C, - obMacSlave => AXI_STREAM_SLAVE_INIT_C, - state => IDLE_S); + obMacSlave => AXI_STREAM_SLAVE_INIT_C); signal r : RegType := REG_INIT_C; signal rin : RegType; @@ -94,99 +85,37 @@ begin -- Check if there is data to move if (obMacMaster.tValid = '1') and (v.ibArpMaster.tValid = '0') and (v.ibIpv4Master.tValid = '0') then - ---------------------------------------------------------------------- - -- Checking for non-VLAN - ---------------------------------------------------------------------- - if (VLAN_G = false) then - -- Accept for data - v.obMacSlave.tReady := '1'; - -- Check for SOF and not EOF - if (ssiGetUserSof(EMAC_AXIS_CONFIG_C, obMacMaster) = '1') and (obMacMaster.tLast = '0') then - -- Reset the flags - v.arpSel := '0'; - v.ipv4Sel := '0'; - -- Check for a valid ARP EtherType - if (obMacMaster.tData(111 downto 96) = ARP_TYPE_C) then - -- Check the destination MAC address - if(obMacMaster.tData(47 downto 0) = BROADCAST_MAC_C) or (obMacMaster.tData(47 downto 0) = localMac) then - v.arpSel := '1'; - v.ibArpMaster := obMacMaster; - end if; - -- Check for a valid IPV4 EtherType and (IPVersion + Header length) - elsif (obMacMaster.tData(111 downto 96) = IPV4_TYPE_C) and (obMacMaster.tData(119 downto 112) = x"45") then - -- Check the destination MAC address - if(obMacMaster.tData(47 downto 0) = BROADCAST_MAC_C) or (obMacMaster.tData(47 downto 0) = localMac) then - v.ipv4Sel := '1'; - v.ibIpv4Master := obMacMaster; - end if; + -- Accept for data + v.obMacSlave.tReady := '1'; + -- Check for SOF and not EOF + if (ssiGetUserSof(EMAC_AXIS_CONFIG_C, obMacMaster) = '1') and (obMacMaster.tLast = '0') then + -- Reset the flags + v.arpSel := '0'; + v.ipv4Sel := '0'; + -- Check for a valid ARP EtherType + if (obMacMaster.tData(111 downto 96) = ARP_TYPE_C) then + -- Check the destination MAC address + if(obMacMaster.tData(47 downto 0) = BROADCAST_MAC_C) or (obMacMaster.tData(47 downto 0) = localMac) then + v.arpSel := '1'; + v.ibArpMaster := obMacMaster; + end if; + -- Check for a valid IPV4 EtherType and (IPVersion + Header length) + elsif (obMacMaster.tData(111 downto 96) = IPV4_TYPE_C) and (obMacMaster.tData(119 downto 112) = x"45") then + -- Check the destination MAC address + if(obMacMaster.tData(47 downto 0) = BROADCAST_MAC_C) or (obMacMaster.tData(47 downto 0) = localMac) then + v.ipv4Sel := '1'; + v.ibIpv4Master := obMacMaster; end if; - elsif r.arpSel = '1' then - v.ibArpMaster := obMacMaster; - elsif r.ipv4Sel = '1' then - v.ibIpv4Master := obMacMaster; - end if; - if obMacMaster.tLast = '1' then - -- Reset the flags - v.arpSel := '0'; - v.ipv4Sel := '0'; end if; - ---------------------------------------------------------------------- - -- Checking for VLAN - ---------------------------------------------------------------------- - else - -- State Machine - case r.state is - ---------------------------------------------------------------------- - when IDLE_S => - -- Accept for data - v.obMacSlave.tReady := '1'; - -- Check for SOF and not EOF - if (ssiGetUserSof(EMAC_AXIS_CONFIG_C, obMacMaster) = '1') and (obMacMaster.tLast = '0') then - -- Check for a valid VLAN EtherType - if (obMacMaster.tData(111 downto 96) = VLAN_TYPE_C) then - -- Reset the flags - v.arpSel := '0'; - v.ipv4Sel := '0'; - -- Latch the data bus - v.dly := obMacMaster; - -- Next state - v.state := CHECK_S; - end if; - end if; - ---------------------------------------------------------------------- - when CHECK_S => - -- Check for a valid ARP EtherType - if (obMacMaster.tData(15 downto 0) = ARP_TYPE_C) then - -- Check the destination MAC address - if(r.dly.tData(47 downto 0) = BROADCAST_MAC_C) or (r.dly.tData(47 downto 0) = localMac) then - v.arpSel := '1'; - v.ibArpMaster := r.dly; - end if; - -- Check for a valid IPV4 EtherType and (IPVersion + Header length) - elsif (obMacMaster.tData(15 downto 0) = IPV4_TYPE_C) and (obMacMaster.tData(23 downto 16) = x"45") then - -- Check the destination MAC address - if(r.dly.tData(47 downto 0) = BROADCAST_MAC_C) or (r.dly.tData(47 downto 0) = localMac) then - v.ipv4Sel := '1'; - v.ibIpv4Master := r.dly; - end if; - end if; - -- Next state - v.state := MOVE_S; - ---------------------------------------------------------------------- - when MOVE_S => - -- Accept for data - v.obMacSlave.tReady := '1'; - if r.arpSel = '1' then - v.ibArpMaster := obMacMaster; - elsif r.ipv4Sel = '1' then - v.ibIpv4Master := obMacMaster; - end if; - if obMacMaster.tLast = '1' then - -- Next state - v.state := IDLE_S; - end if; - ---------------------------------------------------------------------- - end case; + elsif r.arpSel = '1' then + v.ibArpMaster := obMacMaster; + elsif r.ipv4Sel = '1' then + v.ibIpv4Master := obMacMaster; + end if; + if obMacMaster.tLast = '1' then + -- Reset the flags + v.arpSel := '0'; + v.ipv4Sel := '0'; end if; end if; diff --git a/ethernet/IpV4Engine/rtl/IpV4EngineRx.vhd b/ethernet/IpV4Engine/rtl/IpV4EngineRx.vhd index b47403efce..1af8e9d054 100644 --- a/ethernet/IpV4Engine/rtl/IpV4EngineRx.vhd +++ b/ethernet/IpV4Engine/rtl/IpV4EngineRx.vhd @@ -18,7 +18,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -30,8 +29,7 @@ entity IpV4EngineRx is TPD_G : time := 1 ns; SIM_ERROR_HALT_G : boolean := false; PROTOCOL_SIZE_G : positive := 1; - PROTOCOL_G : Slv8Array := (0 => UDP_C); - VLAN_G : boolean := false); + PROTOCOL_G : Slv8Array := (0 => UDP_C)); port ( -- Interface to Ethernet Frame MUX/DEMUX ibIpv4Master : in AxiStreamMasterType; @@ -147,31 +145,19 @@ begin -- Check for data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Accept the data - v.rxSlave.tReady := '1'; - -- Check for non-VLAN - if (VLAN_G = false) then - -- Calculate the IPV4 Pseudo Header length (in little Endian) - v.len(15 downto 8) := rxMaster.tData(7 downto 0); -- IPV4_Length(15 downto 8) - v.len(7 downto 0) := rxMaster.tData(15 downto 8); -- IPV4_Length(7 downto 0) - v.len := v.len - 20; -- IPV4 Pseudo Header's length = protocol length - 20 Bytes - -- Latch the protocol value - v.protocol := rxMaster.tData(63 downto 56); - -- Source IP Address(31 downto 0) - v.txMaster.tData(95 downto 64) := rxMaster.tData(111 downto 80); - -- Destination IP Address(31 downto 16) - v.txMaster.tData(111 downto 96) := rxMaster.tData(127 downto 112); - else - -- Calculate the IPV4 Pseudo Header length (in little Endian) - v.len(15 downto 8) := rxMaster.tData(39 downto 32); -- IPV4_Length(15 downto 8) - v.len(7 downto 0) := rxMaster.tData(47 downto 40); -- IPV4_Length(7 downto 0) - v.len := v.len - 20; -- IPV4 Pseudo Header's length = protocol length - 20 Bytes - -- Latch the protocol value - v.protocol := rxMaster.tData(95 downto 88); - -- Source IP Address(31 downto 16) - v.txMaster.tData(79 downto 64) := rxMaster.tData(127 downto 112); - end if; + v.rxSlave.tReady := '1'; + -- Calculate the IPV4 Pseudo Header length (in little Endian) + v.len(15 downto 8) := rxMaster.tData(7 downto 0); -- IPV4_Length(15 downto 8) + v.len(7 downto 0) := rxMaster.tData(15 downto 8); -- IPV4_Length(7 downto 0) + v.len := v.len - 20; -- IPV4 Pseudo Header's length = protocol length - 20 Bytes + -- Latch the protocol value + v.protocol := rxMaster.tData(63 downto 56); + -- Source IP Address(31 downto 0) + v.txMaster.tData(95 downto 64) := rxMaster.tData(111 downto 80); + -- Destination IP Address(31 downto 16) + v.txMaster.tData(111 downto 96) := rxMaster.tData(127 downto 112); -- Next state if protocol not detected during the "for loop" - v.state := IDLE_S; + v.state := IDLE_S; -- Loop through the protocol buses for i in (PROTOCOL_SIZE_G-1) downto 0 loop if (v.protocol = PROTOCOL_G(i)) then @@ -187,68 +173,30 @@ begin -- Check for data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Move the data - v.txMaster.tValid := '1'; + v.txMaster.tValid := '1'; -- Set the SOF ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.txMaster, '1'); - -- Check for non-VLAN - if (VLAN_G = false) then - -- Destination IP Address(15 downto 0) - v.txMaster.tData(127 downto 112) := rxMaster.tData(15 downto 0); - -- Track the leftovers - v.tData(7 downto 0) := x"00"; - v.tData(15 downto 8) := r.protocol; - v.tData(23 downto 16) := r.len(15 downto 8); - v.tData(31 downto 24) := r.len(7 downto 0); - v.tData(127 downto 32) := rxMaster.tData(111 downto 16); - v.tKeep(3 downto 0) := "1111"; - v.tKeep(15 downto 4) := rxMaster.tKeep(13 downto 2); - v.tLast := rxMaster.tLast; - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for no remainder - if (rxMaster.tKeep(15 downto 14) = 0) then - -- Accept the data - v.rxSlave.tReady := '1'; - -- Next state - v.state := LAST_S; - else - -- Next state - v.state := IPV4_HDR2_S; - end if; - else + -- Destination IP Address(15 downto 0) + v.txMaster.tData(127 downto 112) := rxMaster.tData(15 downto 0); + -- Track the leftovers + v.tData(7 downto 0) := x"00"; + v.tData(15 downto 8) := r.protocol; + v.tData(23 downto 16) := r.len(15 downto 8); + v.tData(31 downto 24) := r.len(7 downto 0); + v.tData(127 downto 32) := rxMaster.tData(111 downto 16); + v.tKeep(3 downto 0) := "1111"; + v.tKeep(15 downto 4) := rxMaster.tKeep(13 downto 2); + v.tLast := rxMaster.tLast; + v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); + -- Check for no remainder + if (rxMaster.tKeep(15 downto 14) = 0) then -- Accept the data - v.rxSlave.tReady := '1'; - -- Source IP Address(15 downto 0) - v.txMaster.tData(95 downto 80) := rxMaster.tData(15 downto 0); - -- Destination IP Address(31 downto 0) - v.txMaster.tData(127 downto 96) := rxMaster.tData(47 downto 16); - -- Track the leftovers - v.tData(7 downto 0) := x"00"; - v.tData(15 downto 8) := r.protocol; - v.tData(23 downto 16) := r.len(15 downto 8); - v.tData(31 downto 24) := r.len(7 downto 0); - v.tData(111 downto 32) := rxMaster.tData(127 downto 48); - v.tKeep(3 downto 0) := "1111"; - v.tKeep(13 downto 4) := rxMaster.tKeep(15 downto 6); - v.tKeep(15 downto 14) := "00"; - v.tLast := rxMaster.tLast; - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for EOF - if (rxMaster.tLast = '1') then - -- Check the leftovers - if (v.tKeep /= 0) then - -- Next state - v.state := LAST_S; - else - -- Set EOF and EOFE - v.txMaster.tLast := '1'; - ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); - -- Next state - v.state := IDLE_S; - end if; - else - -- Next state - v.state := MOVE_S; - end if; + v.rxSlave.tReady := '1'; + -- Next state + v.state := LAST_S; + else + -- Next state + v.state := IPV4_HDR2_S; end if; end if; ---------------------------------------------------------------------- @@ -256,17 +204,17 @@ begin -- Check for data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Accept the data - v.rxSlave.tReady := '1'; + v.rxSlave.tReady := '1'; -- Move the data v.txMaster.tValid := '1'; v.txMaster.tData(127 downto 0) := r.tData; v.txMaster.tKeep(15 downto 0) := r.tKeep; -- Track the leftovers - v.tData(15 downto 0) := rxMaster.tData(127 downto 112); - v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); - v.tKeep(15 downto 2) := (others => '0'); - v.tLast := rxMaster.tLast; - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); + v.tData(15 downto 0) := rxMaster.tData(127 downto 112); + v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); + v.tKeep(15 downto 2) := (others => '0'); + v.tLast := rxMaster.tLast; + v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); -- Check for EOF if (rxMaster.tLast = '1') then -- Check the leftovers @@ -290,33 +238,19 @@ begin -- Check for data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Accept the data - v.rxSlave.tReady := '1'; + v.rxSlave.tReady := '1'; -- Move the data - v.txMaster.tValid := '1'; - -- Check for non-VLAN - if (VLAN_G = false) then - -- Move the data - v.txMaster.tData(15 downto 0) := r.tData(15 downto 0); - v.txMaster.tData(127 downto 16) := rxMaster.tData(111 downto 0); - v.txMaster.tKeep(1 downto 0) := r.tKeep(1 downto 0); - v.txMaster.tKeep(15 downto 2) := rxMaster.tKeep(13 downto 0); - -- Track the leftovers - v.tData(15 downto 0) := rxMaster.tData(127 downto 112); - v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); - v.tLast := rxMaster.tLast; - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - else - -- Move the data - v.txMaster.tData(111 downto 0) := r.tData(111 downto 0); - v.txMaster.tData(127 downto 112) := rxMaster.tData(15 downto 0); - v.txMaster.tKeep(13 downto 0) := r.tKeep(13 downto 0); - v.txMaster.tKeep(15 downto 14) := rxMaster.tKeep(1 downto 0); - -- Track the leftovers - v.tData(111 downto 0) := rxMaster.tData(127 downto 16); - v.tKeep(13 downto 0) := rxMaster.tKeep(15 downto 2); - v.tLast := rxMaster.tLast; - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - end if; + v.txMaster.tValid := '1'; + -- Move the data + v.txMaster.tData(15 downto 0) := r.tData(15 downto 0); + v.txMaster.tData(127 downto 16) := rxMaster.tData(111 downto 0); + v.txMaster.tKeep(1 downto 0) := r.tKeep(1 downto 0); + v.txMaster.tKeep(15 downto 2) := rxMaster.tKeep(13 downto 0); + -- Track the leftovers + v.tData(15 downto 0) := rxMaster.tData(127 downto 112); + v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); + v.tLast := rxMaster.tLast; + v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); -- Check for tLast if (v.tLast = '1') then -- Check the leftover tKeep is not empty @@ -343,7 +277,7 @@ begin v.txMaster.tLast := '1'; ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, r.eofe); -- Next state - v.state := IDLE_S; + v.state := IDLE_S; end if; ---------------------------------------------------------------------- end case; diff --git a/ethernet/IpV4Engine/rtl/IpV4EngineTx.vhd b/ethernet/IpV4Engine/rtl/IpV4EngineTx.vhd index 7809f12dea..153d042063 100644 --- a/ethernet/IpV4Engine/rtl/IpV4EngineTx.vhd +++ b/ethernet/IpV4Engine/rtl/IpV4EngineTx.vhd @@ -18,7 +18,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -30,8 +29,7 @@ entity IpV4EngineTx is TPD_G : time := 1 ns; PROTOCOL_SIZE_G : positive := 1; PROTOCOL_G : Slv8Array := (0 => UDP_C); - TTL_G : slv(7 downto 0) := x"20"; - VLAN_G : boolean := false); + TTL_G : slv(7 downto 0) := x"20"); port ( -- Local Configurations localMac : in slv(47 downto 0); -- big-Endian configuration @@ -152,23 +150,15 @@ begin v.txMaster.tDest := x"00"; end if; -- Set the DST MAC and SRC MAC - v.txMaster.tData(47 downto 0) := rxMaster.tData(47 downto 0); - v.txMaster.tData(95 downto 48) := localMac; - -- Check for non-VLAN - if (VLAN_G = false) then - v.txMaster.tData(111 downto 96) := IPV4_TYPE_C; - v.txMaster.tData(119 downto 112) := x"45"; -- IPVersion = 4,Header length = 5 - v.txMaster.tData(127 downto 120) := x"00"; --- DSCP and ECN - else - -- Set the EtherType = VLAN Type - v.txMaster.tData(111 downto 96) := VLAN_TYPE_C; - -- VID = 0x0 here because it gets overwritten in the MAC - v.txMaster.tData(127 downto 112) := (others => '0'); - end if; + v.txMaster.tData(47 downto 0) := rxMaster.tData(47 downto 0); + v.txMaster.tData(95 downto 48) := localMac; + v.txMaster.tData(111 downto 96) := IPV4_TYPE_C; + v.txMaster.tData(119 downto 112) := x"45"; -- IPVersion = 4,Header length = 5 + v.txMaster.tData(127 downto 120) := x"00"; --- DSCP and ECN -- Track the leftovers - v.tData(63 downto 0) := rxMaster.tData(127 downto 64); + v.tData(63 downto 0) := rxMaster.tData(127 downto 64); -- Next state - v.state := IPV4_HDR0_S; + v.state := IPV4_HDR0_S; end if; end if; ---------------------------------------------------------------------- @@ -176,105 +166,52 @@ begin -- Check for data if (v.txMaster.tValid = '0') then -- Send the IPV4 header - v.txMaster.tValid := '1'; - -- Check for non-VLAN - if (VLAN_G = false) then - v.txMaster.tData(7 downto 0) := x"00"; -- IPV4_Length(15 downto 8) Note: Calculated in EthMac core - v.txMaster.tData(15 downto 8) := x"00"; -- IPV4_Length(7 downto 0) Note: Calculated in EthMac core - v.txMaster.tData(23 downto 16) := r.id(15 downto 8); -- IPV4_ID(15 downto 8) - v.txMaster.tData(31 downto 24) := r.id(7 downto 0); -- IPV4_ID(7 downto 0) - v.txMaster.tData(39 downto 32) := x"40"; -- Flags(2 downto 0) = Don't Fragment (DF) and Fragment_Offsets(12 downto 8) = 0x0 - v.txMaster.tData(47 downto 40) := x"00"; -- Fragment_Offsets(7 downto 0) = 0x0 - v.txMaster.tData(55 downto 48) := TTL_G; -- Time-To-Live (number of hops before packet is discarded) - v.txMaster.tData(63 downto 56) := PROTOCOL_G(conv_integer(r.tDest)); -- Protocol - v.txMaster.tData(71 downto 64) := x"00"; -- IPV4_Checksum(15 downto 8) Note: Filled in next state - v.txMaster.tData(79 downto 72) := x"00"; -- IPV4_Checksum(7 downto 0) Note: Filled in next state - v.txMaster.tData(111 downto 80) := r.tData(31 downto 0); -- Source IP Address(31 downto 0) - v.txMaster.tData(127 downto 112) := r.tData(47 downto 32); -- Destination IP Address(31 downto 16) - else - v.txMaster.tData(15 downto 0) := IPV4_TYPE_C; - v.txMaster.tData(23 downto 16) := x"45"; -- IPVersion = 4,Header length = 5 - v.txMaster.tData(31 downto 24) := x"00"; -- DSCP and ECN - v.txMaster.tData(39 downto 32) := x"00"; -- IPV4_Length(15 downto 8) Note: Calculated in EthMac core - v.txMaster.tData(47 downto 40) := x"00"; -- IPV4_Length(7 downto 0) Note: Calculated in EthMac core - v.txMaster.tData(55 downto 48) := r.id(15 downto 8); -- IPV4_ID(15 downto 8) - v.txMaster.tData(63 downto 56) := r.id(7 downto 0); -- IPV4_ID(7 downto 0) - v.txMaster.tData(71 downto 64) := x"40"; -- Flags(2 downto 0) = Don't Fragment (DF) and Fragment_Offsets(12 downto 8) = 0x0 - v.txMaster.tData(79 downto 72) := x"00"; -- Fragment_Offsets(7 downto 0) = 0x0 - v.txMaster.tData(87 downto 80) := TTL_G; -- Time-To-Live (number of hops before packet is discarded) - v.txMaster.tData(95 downto 88) := PROTOCOL_G(conv_integer(r.tDest)); -- Protocol - v.txMaster.tData(103 downto 96) := x"00"; -- IPV4_Checksum(15 downto 8) Note: Calculated in EthMac core - v.txMaster.tData(111 downto 104) := x"00"; -- IPV4_Checksum(7 downto 0) Note: Calculated in EthMac core - v.txMaster.tData(127 downto 112) := r.tData(15 downto 0); -- Source IP Address(31 downto 16) - end if; + v.txMaster.tValid := '1'; + v.txMaster.tData(7 downto 0) := x"00"; -- IPV4_Length(15 downto 8) Note: Calculated in EthMac core + v.txMaster.tData(15 downto 8) := x"00"; -- IPV4_Length(7 downto 0) Note: Calculated in EthMac core + v.txMaster.tData(23 downto 16) := r.id(15 downto 8); -- IPV4_ID(15 downto 8) + v.txMaster.tData(31 downto 24) := r.id(7 downto 0); -- IPV4_ID(7 downto 0) + v.txMaster.tData(39 downto 32) := x"40"; -- Flags(2 downto 0) = Don't Fragment (DF) and Fragment_Offsets(12 downto 8) = 0x0 + v.txMaster.tData(47 downto 40) := x"00"; -- Fragment_Offsets(7 downto 0) = 0x0 + v.txMaster.tData(55 downto 48) := TTL_G; -- Time-To-Live (number of hops before packet is discarded) + v.txMaster.tData(63 downto 56) := PROTOCOL_G(conv_integer(r.tDest)); -- Protocol + v.txMaster.tData(71 downto 64) := x"00"; -- IPV4_Checksum(15 downto 8) Note: Filled in next state + v.txMaster.tData(79 downto 72) := x"00"; -- IPV4_Checksum(7 downto 0) Note: Filled in next state + v.txMaster.tData(111 downto 80) := r.tData(31 downto 0); -- Source IP Address(31 downto 0) + v.txMaster.tData(127 downto 112) := r.tData(47 downto 32); -- Destination IP Address(31 downto 16) -- Increment the counter - v.id := r.id + 1; + v.id := r.id + 1; -- Next state - v.state := IPV4_HDR1_S; + v.state := IPV4_HDR1_S; end if; ---------------------------------------------------------------------- when IPV4_HDR1_S => -- Check if ready to move data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Accept the data - v.rxSlave.tReady := '1'; - -- Check for non-VLAN - if (VLAN_G = false) then - -- Update the tData bus - v.txMaster.tData(15 downto 0) := r.tData(63 downto 48); -- Destination IP Address(15 downto 0) - v.txMaster.tData(111 downto 16) := rxMaster.tData(127 downto 32); - -- Update the tKeep bus - v.txMaster.tKeep(1 downto 0) := (others => '1'); - v.txMaster.tKeep(13 downto 2) := rxMaster.tKeep(15 downto 4); - v.txMaster.tKeep(15 downto 14) := (others => '0'); - -- Get the EOFE - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for tLast - if (rxMaster.tLast = '1') then - -- Move the data - v.txMaster.tValid := '1'; - -- Set the tLast flag - v.txMaster.tLast := '1'; - -- Set the EOFE - ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); - -- Next state - v.state := IDLE_S; - else - -- Next state - v.state := IPV4_HDR2_S; - end if; - else + v.rxSlave.tReady := '1'; + -- Update the tData bus + v.txMaster.tData(15 downto 0) := r.tData(63 downto 48); -- Destination IP Address(15 downto 0) + v.txMaster.tData(111 downto 16) := rxMaster.tData(127 downto 32); + -- Update the tKeep bus + v.txMaster.tKeep(1 downto 0) := (others => '1'); + v.txMaster.tKeep(13 downto 2) := rxMaster.tKeep(15 downto 4); + v.txMaster.tKeep(15 downto 14) := (others => '0'); + -- Get the EOFE + v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); + -- Check for tLast + if (rxMaster.tLast = '1') then -- Move the data - v.txMaster.tValid := '1'; - -- Update the tData bus - v.txMaster.tData(15 downto 0) := r.tData(31 downto 16); -- Source IP Address(15 downto 0) - v.txMaster.tData(47 downto 16) := r.tData(63 downto 32); -- Destination IP Address(31 downto 0) - v.txMaster.tData(127 downto 48) := rxMaster.tData(111 downto 32); - -- Update the tKeep bus - v.txMaster.tKeep(5 downto 0) := (others => '1'); - v.txMaster.tKeep(15 downto 6) := rxMaster.tKeep(13 downto 4); - -- Track the leftovers - v.tData(15 downto 0) := rxMaster.tData(127 downto 112); - v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); - -- Get the EOFE - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for tLast - if (rxMaster.tLast = '1') then - -- Check the leftover tKeep is not empty - if (v.tKeep /= 0) then - -- Next state - v.state := LAST_S; - else - -- Set the EOF/EOFE - v.txMaster.tLast := '1'; - ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); - -- Next state - v.state := IDLE_S; - end if; - else - -- Next state - v.state := MOVE_S; - end if; + v.txMaster.tValid := '1'; + -- Set the tLast flag + v.txMaster.tLast := '1'; + -- Set the EOFE + ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); + -- Next state + v.state := IDLE_S; + else + -- Next state + v.state := IPV4_HDR2_S; end if; end if; ---------------------------------------------------------------------- @@ -316,59 +253,31 @@ begin -- Check for data if (rxMaster.tValid = '1') and (v.txMaster.tValid = '0') then -- Accept the data - v.rxSlave.tReady := '1'; + v.rxSlave.tReady := '1'; -- Move the data - v.txMaster.tValid := '1'; - -- Check for non-VLAN - if (VLAN_G = false) then - -- Move the data - v.txMaster.tData(111 downto 0) := r.tData(111 downto 0); - v.txMaster.tData(127 downto 112) := rxMaster.tData(15 downto 0); - v.txMaster.tKeep(13 downto 0) := r.tKeep(13 downto 0); - v.txMaster.tKeep(15 downto 14) := rxMaster.tKeep(1 downto 0); - -- Track the leftovers - v.tData(111 downto 0) := rxMaster.tData(127 downto 16); - v.tKeep(13 downto 0) := rxMaster.tKeep(15 downto 2); - -- Get the EOFE - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for tLast - if (rxMaster.tLast = '1') then - -- Check the leftover tKeep is not empty - if (v.tKeep /= 0) then - -- Next state - v.state := LAST_S; - else - -- Set the EOF/EOFE - v.txMaster.tLast := '1'; - ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); - -- Next state - v.state := IDLE_S; - end if; - end if; - else - -- Move the data - v.txMaster.tData(15 downto 0) := r.tData(15 downto 0); - v.txMaster.tData(127 downto 16) := rxMaster.tData(111 downto 0); - v.txMaster.tKeep(1 downto 0) := r.tKeep(1 downto 0); - v.txMaster.tKeep(15 downto 2) := rxMaster.tKeep(13 downto 0); - -- Track the leftovers - v.tData(15 downto 0) := rxMaster.tData(127 downto 112); - v.tKeep(1 downto 0) := rxMaster.tKeep(15 downto 14); - -- Get the EOFE - v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); - -- Check for tLast - if (rxMaster.tLast = '1') then - -- Check the leftover tKeep is not empty - if (v.tKeep /= 0) then - -- Next state - v.state := LAST_S; - else - -- Set the EOF/EOFE - v.txMaster.tLast := '1'; - ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); - -- Next state - v.state := IDLE_S; - end if; + v.txMaster.tValid := '1'; + -- Move the data + v.txMaster.tData(111 downto 0) := r.tData(111 downto 0); + v.txMaster.tData(127 downto 112) := rxMaster.tData(15 downto 0); + v.txMaster.tKeep(13 downto 0) := r.tKeep(13 downto 0); + v.txMaster.tKeep(15 downto 14) := rxMaster.tKeep(1 downto 0); + -- Track the leftovers + v.tData(111 downto 0) := rxMaster.tData(127 downto 16); + v.tKeep(13 downto 0) := rxMaster.tKeep(15 downto 2); + -- Get the EOFE + v.eofe := ssiGetUserEofe(EMAC_AXIS_CONFIG_C, rxMaster); + -- Check for tLast + if (rxMaster.tLast = '1') then + -- Check the leftover tKeep is not empty + if (v.tKeep /= 0) then + -- Next state + v.state := LAST_S; + else + -- Set the EOF/EOFE + v.txMaster.tLast := '1'; + ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, v.eofe); + -- Next state + v.state := IDLE_S; end if; end if; end if; @@ -383,7 +292,7 @@ begin v.txMaster.tLast := '1'; ssiSetUserEofe(EMAC_AXIS_CONFIG_C, v.txMaster, r.eofe); -- Next state - v.state := IDLE_S; + v.state := IDLE_S; end if; ---------------------------------------------------------------------- end case; diff --git a/ethernet/IpV4Engine/tb/IpV4EngineCoreTb.vhd b/ethernet/IpV4Engine/tb/IpV4EngineCoreTb.vhd index 8a8ddd9e96..23bebd75de 100644 --- a/ethernet/IpV4Engine/tb/IpV4EngineCoreTb.vhd +++ b/ethernet/IpV4Engine/tb/IpV4EngineCoreTb.vhd @@ -17,7 +17,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -31,8 +30,6 @@ entity IpV4EngineCoreTb is LOCAL_IP_G : slv(31 downto 0); REMOTE_MAC_G : slv(47 downto 0); REMOTE_IP_G : slv(31 downto 0); - VLAN_G : boolean; - VID_G : slv(15 downto 0); MAX_CNT_G : natural; UDP_LEN_G : natural); port ( @@ -115,7 +112,8 @@ architecture rtl of IpV4EngineCoreTb is begin - comb : process (arpAckMaster, arpReqSlave, ibProtocolMaster, obProtocolSlave, r, rst) is + comb : process (arpAckMaster, arpReqSlave, ibProtocolMaster, + obProtocolSlave, r, rst) is variable v : RegType; variable i : natural; begin @@ -188,15 +186,15 @@ begin v.txCnt := r.txCnt + 1; ssiSetUserSof(EMAC_AXIS_CONFIG_C, v.obProtocolMaster, '1'); v.obProtocolMaster.tdata(47 downto 0) := r.remoteMac; -- Remote IP address - v.obProtocolMaster.tdata(63 downto 48) := VID_G; -- VLAN's ID - v.obProtocolMaster.tdata(95 downto 64) := LOCAL_IP_G; -- Source IPv4 Address + v.obProtocolMaster.tdata(63 downto 48) := (others => '0'); + v.obProtocolMaster.tdata(95 downto 64) := LOCAL_IP_G; -- Source IPv4 Address v.obProtocolMaster.tdata(127 downto 96) := REMOTE_IP_G; -- Destination IPv4 Address elsif r.txCnt = 1 then v.txCnt := r.txCnt + 1; - v.obProtocolMaster.tdata(7 downto 0) := x"00"; -- Zeros - v.obProtocolMaster.tdata(15 downto 8) := UDP_C; -- Protocol + v.obProtocolMaster.tdata(7 downto 0) := x"00"; -- Zeros + v.obProtocolMaster.tdata(15 downto 8) := UDP_C; -- Protocol v.obProtocolMaster.tdata(23 downto 16) := r.len(15 downto 8); -- Datagram Length - v.obProtocolMaster.tdata(31 downto 24) := r.len(7 downto 0); -- Datagram Length + v.obProtocolMaster.tdata(31 downto 24) := r.len(7 downto 0); -- Datagram Length v.obProtocolMaster.tdata(127 downto 32) := (others => '0'); else -- Send data @@ -244,7 +242,7 @@ begin v.rxCnt := r.rxCnt + 1; -- Check for errors if (ssiGetUserSof(EMAC_AXIS_CONFIG_C, ibProtocolMaster) = '0') - or (ibProtocolMaster.tdata(47 downto 0) /= r.remoteMac) -- Remote IP address + or (ibProtocolMaster.tdata(47 downto 0) /= r.remoteMac) -- Remote IP address or (ibProtocolMaster.tdata(95 downto 64) /= REMOTE_IP_G) -- Source IPv4 Address or (ibProtocolMaster.tdata(127 downto 96) /= LOCAL_IP_G) then -- Destination IPv4 Address v.failed(1) := '1'; @@ -253,7 +251,7 @@ begin -- Increment the counter v.rxCnt := r.rxCnt + 1; -- Check for errors - if (ibProtocolMaster.tdata(7 downto 0) /= x"00") -- Zeros + if (ibProtocolMaster.tdata(7 downto 0) /= x"00") -- Zeros or (ibProtocolMaster.tdata(15 downto 8) /= UDP_C) -- Protocol or (ibProtocolMaster.tdata(23 downto 16) /= r.len(15 downto 8)) -- Datagram Length or (ibProtocolMaster.tdata(31 downto 24) /= r.len(7 downto 0)) then -- Datagram Length diff --git a/ethernet/IpV4Engine/tb/IpV4EngineTb.vhd b/ethernet/IpV4Engine/tb/IpV4EngineTb.vhd index 77e4c17d10..813665e490 100644 --- a/ethernet/IpV4Engine/tb/IpV4EngineTb.vhd +++ b/ethernet/IpV4Engine/tb/IpV4EngineTb.vhd @@ -17,7 +17,6 @@ use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; - library surf; use surf.StdRtlPkg.all; use surf.AxiStreamPkg.all; @@ -35,9 +34,6 @@ architecture testbed of IpV4EngineTb is constant REMOTE_MAC_C : slv(47 downto 0) := x"DEADBEEFCAFE"; constant REMOTE_IP_C : slv(31 downto 0) := x"ABCDEFFF"; - constant VLAN_C : boolean := false; - constant VID_C : slv(15 downto 0) := x"0000"; - constant PROTOCOL_C : Slv8Array(0 downto 0) := (0 => UDP_C); constant MAX_CNT_C : natural := 256; constant UDP_LEN_C : natural := 16*MAX_CNT_C; @@ -65,7 +61,7 @@ begin ClkRst_Inst : entity surf.ClkRst generic map ( CLK_PERIOD_G => CLK_PERIOD_C, - RST_START_DELAY_G => 0 ns, -- Wait this long into simulation before asserting reset + RST_START_DELAY_G => 0 ns, -- Wait this long into simulation before asserting reset RST_HOLD_TIME_G => 1000 ns) -- Hold reset for this long) port map ( clkP => clk, @@ -80,8 +76,7 @@ begin PROTOCOL_SIZE_G => 1, PROTOCOL_G => PROTOCOL_C, CLIENT_SIZE_G => 1, - ARP_TIMEOUT_G => 156250000, - VLAN_G => VLAN_C) + ARP_TIMEOUT_G => 156250000) port map ( -- Local Configurations localMac => LOCAL_MAC_C, @@ -166,8 +161,7 @@ begin PROTOCOL_SIZE_G => 1, PROTOCOL_G => PROTOCOL_C, CLIENT_SIZE_G => 1, - ARP_TIMEOUT_G => 156250000, - VLAN_G => VLAN_C) + ARP_TIMEOUT_G => 156250000) port map ( -- Local Configurations localMac => REMOTE_MAC_C, @@ -216,8 +210,6 @@ begin LOCAL_IP_G => LOCAL_IP_C, REMOTE_MAC_G => REMOTE_MAC_C, REMOTE_IP_G => REMOTE_IP_C, - VLAN_G => VLAN_C, - VID_G => VID_C, MAX_CNT_G => MAX_CNT_C, UDP_LEN_G => UDP_LEN_C) port map ( diff --git a/ethernet/UdpEngine/rtl/UdpEngineWrapper.vhd b/ethernet/UdpEngine/rtl/UdpEngineWrapper.vhd index fdde578a71..7763736090 100644 --- a/ethernet/UdpEngine/rtl/UdpEngineWrapper.vhd +++ b/ethernet/UdpEngine/rtl/UdpEngineWrapper.vhd @@ -45,7 +45,6 @@ entity UdpEngineWrapper is CLK_FREQ_G : real := 156.25E+06; -- In units of Hz COMM_TIMEOUT_G : positive := 30; -- In units of seconds, Client's Communication timeout before re-ARPing or DHCP discover/request TTL_G : slv(7 downto 0) := x"20"; -- IPv4's Time-To-Live (TTL) - VLAN_G : boolean := false; -- true = VLAN support SYNTH_MODE_G : string := "inferred"); -- Synthesis mode for internal RAMs port ( -- Local Configurations @@ -134,8 +133,7 @@ begin CLIENT_SIZE_G => CLIENT_SIZE_G, CLK_FREQ_G => CLK_FREQ_G, IGMP_G => IGMP_G, - IGMP_GRP_SIZE => IGMP_GRP_SIZE, - VLAN_G => VLAN_G) + IGMP_GRP_SIZE => IGMP_GRP_SIZE) port map ( -- Local Configurations localMac => localMac,