Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| en:verilog:ethernet:readme [2014/11/20 01:25] – created alex | en:verilog:ethernet:readme [2019/04/04 05:34] (current) – alex | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Verilog Ethernet Components Readme ====== | ====== Verilog Ethernet Components Readme ====== | ||
| + | |||
| + | For more information and updates: http:// | ||
| + | |||
| + | GitHub repository: https:// | ||
| ===== Introduction ===== | ===== Introduction ===== | ||
| - | Collection of Ethernet-related components for both gigabit and 10G packet processing (8 bit and 64 bit datapaths). | + | Collection of Ethernet-related components for both gigabit and 10G packet |
| + | processing (8 bit and 64 bit datapaths). | ||
| + | Ethernet frames as well as IP, UDP, and ARP and the components for | ||
| + | constructing a complete UDP/IP stack. | ||
| + | 10G, a 10G PCS/PMA PHY module, and a 10G combination MAC/PCS/PMA module. | ||
| + | includes | ||
| + | |||
| + | For IP and ARP support only, use ip_complete (1G) or ip_complete_64 (10G). | ||
| + | |||
| + | For UDP, IP, and ARP support, use udp_complete (1G) or udp_complete_64 (10G). | ||
| + | |||
| + | Top level gigabit and 10G MAC modules are eth_mac_*, with various interfaces | ||
| + | and with/ | ||
| + | level 10G MAC/PCS/PMA combination module is eth_mac_phy_10g. | ||
| ===== Documentation ===== | ===== Documentation ===== | ||
| + | |||
| + | ==== arp module ==== | ||
| + | |||
| + | ARP handling logic with parametrizable retry timeout parameters. | ||
| + | |||
| + | ==== arp_64 module ==== | ||
| + | |||
| + | ARP handling logic with parametrizable retry timeout parameters and 64 bit | ||
| + | datapath for 10G Ethernet. | ||
| + | |||
| + | ==== arp_cache module ==== | ||
| + | |||
| + | Basic hash-based cache for ARP entries. | ||
| ==== arp_eth_rx module ==== | ==== arp_eth_rx module ==== | ||
| Line 23: | Line 53: | ||
| ARP frame transmitter with 64 bit datapath for 10G Ethernet. | ARP frame transmitter with 64 bit datapath for 10G Ethernet. | ||
| - | ==== eth_arb_mux_N | + | ==== axis_eth_fcs module ==== |
| + | |||
| + | Ethernet frame check sequence calculator. | ||
| + | |||
| + | ==== axis_eth_fcs_64 module ==== | ||
| + | |||
| + | Ethernet frame check sequence calculator with 64 bit datapath for 10G Ethernet. | ||
| + | |||
| + | ==== axis_eth_fcs_check module ==== | ||
| + | |||
| + | Ethernet frame check sequence checker. | ||
| + | |||
| + | ==== axis_eth_fcs_insert module ==== | ||
| + | |||
| + | Ethernet frame check sequence inserter. | ||
| + | |||
| + | ==== axis_gmii_rx module ==== | ||
| + | |||
| + | AXI stream GMII/MII frame receiver with clock enable and MII select. | ||
| + | |||
| + | ==== axis_gmii_tx module ==== | ||
| + | |||
| + | AXI stream GMII/MII frame transmitter with clock enable and MII select. | ||
| + | |||
| + | ==== axis_xgmii_rx_32 module ==== | ||
| + | |||
| + | AXI stream XGMII frame receiver with 32 bit datapath. | ||
| + | |||
| + | ==== axis_xgmii_rx_64 module ==== | ||
| + | |||
| + | AXI stream XGMII frame receiver with 64 bit datapath. | ||
| + | |||
| + | ==== axis_xgmii_tx_32 | ||
| - | Ethernet | + | AXI stream XGMII frame transmitter |
| - | Can be generated with arbitrary port counts with eth_arb_mux.py. | + | ==== axis_xgmii_tx_64 module ==== |
| - | ==== eth_arb_mux_64_N module ==== | + | AXI stream XGMII frame transmitter with 64 bit datapath. |
| - | Ethernet frame arbitrated muliplexer with 8 bit data width for 10G Ethernet. | + | ==== eth_arb_mux module ==== |
| - | Can be generated | + | Ethernet frame arbitrated muliplexer |
| + | count. | ||
| ==== eth_axis_rx module ==== | ==== eth_axis_rx module ==== | ||
| Line 51: | Line 114: | ||
| Ethernet frame transmitter with 64 bit datapath for 10G Ethernet. | Ethernet frame transmitter with 64 bit datapath for 10G Ethernet. | ||
| - | ==== eth_demux_N | + | ==== eth_demux |
| - | Ethernet frame demuliplexer with 8 bit data width for gigabit Ethernet. Supports priority and round-robin arbitration. | + | Ethernet frame demuliplexer with parametrizable |
| + | Supports priority and round-robin arbitration. | ||
| - | Can be generated with arbitrary port counts with eth_demux.py. | + | ==== eth_mac_1g module ==== |
| - | ==== eth_demux_64_N module ==== | + | Gigabit Ethernet MAC with GMII interface. |
| - | Ethernet frame demuliplexer with 64 bit data width for 10G Ethernet. | + | ==== eth_mac_1g_fifo module ==== |
| - | Can be generated | + | Gigabit Ethernet MAC with GMII interface and FIFOs. |
| - | ==== eth_mux_N | + | ==== eth_mac_1g_gmii |
| - | Ethernet | + | Tri-mode |
| + | adaptation logic. | ||
| - | Can be generated with arbitrary port counts with eth_mux.py. | + | ==== eth_mac_1g_gmii_fifo module ==== |
| - | ==== eth_mux_64_N module ==== | + | Tri-mode Ethernet MAC with GMII/MII interface, FIFOs, and automatic PHY rate |
| + | adaptation logic. | ||
| - | Ethernet frame muliplexer with 64 bit data width for 10G Ethernet. | + | ==== eth_mac_1g_rgmii module ==== |
| - | Can be generated | + | Tri-mode Ethernet MAC with RGMII interface and automatic PHY rate adaptation |
| + | logic. | ||
| + | |||
| + | ==== eth_mac_1g_rgmii_fifo module ==== | ||
| + | |||
| + | Tri-mode Ethernet MAC with RGMII interface, FIFOs, and automatic PHY rate | ||
| + | adaptation logic. | ||
| + | |||
| + | ==== eth_mac_10g module ==== | ||
| + | |||
| + | 10G Ethernet MAC with XGMII interface. | ||
| + | bits. | ||
| + | |||
| + | ==== eth_mac_10g_fifo module ==== | ||
| + | |||
| + | 10G Ethernet MAC with XGMII interface and FIFOs. | ||
| + | 32 and 64 bits. | ||
| + | |||
| + | ==== eth_mac_mii module ==== | ||
| + | |||
| + | Ethernet MAC with MII interface. | ||
| + | |||
| + | ==== eth_mac_mii_fifo module ==== | ||
| + | |||
| + | Ethernet MAC with MII interface and FIFOs. | ||
| + | |||
| + | ==== eth_mac_phy_10g module ==== | ||
| + | |||
| + | 10G Ethernet MAC/PHY combination module with SERDES interface. | ||
| + | |||
| + | ==== eth_mac_phy_10g_fifo module ==== | ||
| + | |||
| + | 10G Ethernet MAC/PHY combination module with SERDES interface and FIFOs. | ||
| + | |||
| + | ==== eth_mac_phy_10g_rx module ==== | ||
| + | |||
| + | 10G Ethernet MAC/PHY combination module with SERDES interface, RX path. | ||
| + | |||
| + | ==== eth_mac_phy_10g_tx module ==== | ||
| + | |||
| + | 10G Ethernet MAC/PHY combination module with SERDES interface, TX path. | ||
| + | |||
| + | ==== eth_mux module ==== | ||
| + | |||
| + | Ethernet frame muliplexer with parametrizable data width and port count. | ||
| + | Supports priority and round-robin arbitration. | ||
| + | |||
| + | ==== eth_phy_10g module ==== | ||
| + | |||
| + | 10G Ethernet PCS/PMA PHY. | ||
| + | |||
| + | ==== eth_phy_10g_rx module ==== | ||
| + | |||
| + | 10G Ethernet PCS/PMA PHY receive-side logic. | ||
| + | |||
| + | ==== eth_phy_10g_rx_ber_mon module ==== | ||
| + | |||
| + | 10G Ethernet PCS/PMA PHY BER monitor. | ||
| + | |||
| + | ==== eth_phy_10g_rx_frame_sync module ==== | ||
| + | |||
| + | 10G Ethernet PCS/PMA PHY frame synchronizer. | ||
| + | |||
| + | ==== eth_phy_10g_tx module ==== | ||
| + | |||
| + | 10G Ethernet PCS/PMA PHY transmit-side logic. | ||
| + | |||
| + | ==== gmii_phy_if module ==== | ||
| + | |||
| + | GMII/MII PHY interface and clocking logic. | ||
| ==== ip module ==== | ==== ip module ==== | ||
| - | IPv4 block with 8 bit data width for gigabit Ethernet. | + | IPv4 block with 8 bit data width for gigabit Ethernet. |
| + | transmssion and reception. | ||
| ==== ip_64 module ==== | ==== ip_64 module ==== | ||
| - | IPv4 block with 64 bit data width for 10G Ethernet. | + | IPv4 block with 64 bit data width for 10G Ethernet. |
| + | transmssion and reception. | ||
| - | ==== ip_arb_mux_N | + | ==== ip_arb_mux |
| - | IP frame arbitrated muliplexer with 8 bit data width for gigabit | + | IP frame arbitrated muliplexer with parametrizable |
| - | Ethernet. Supports priority and round-robin arbitration. | + | Supports priority and round-robin arbitration. |
| - | Can be generated with arbitrary port counts with ip_arb_mux.py. | + | ==== ip_complete module ==== |
| - | ==== ip_arb_mux_64_N | + | IPv4 module |
| - | IP frame arbitrated muliplexer with 8 bit data width for 10G Ethernet. | + | Top level for gigabit IP stack. |
| - | Can be generated | + | ==== ip_complete_64 module ==== |
| + | |||
| + | IPv4 module | ||
| + | |||
| + | Top level for 10G IP stack. | ||
| + | |||
| + | ==== ip_demux module ==== | ||
| + | |||
| + | IP frame demuliplexer | ||
| + | Supports priority and round-robin arbitration. | ||
| ==== ip_eth_rx module ==== | ==== ip_eth_rx module ==== | ||
| Line 112: | Line 258: | ||
| IP frame transmitter with 64 bit datapath for 10G Ethernet. | IP frame transmitter with 64 bit datapath for 10G Ethernet. | ||
| - | ==== ip_demux_N | + | ==== ip_mux |
| - | IP frame demuliplexer | + | IP frame muliplexer |
| + | Supports priority and round-robin arbitration. | ||
| - | Can be generated with arbitrary port counts with ip_demux.py. | + | ==== lfsr module ==== |
| - | ==== ip_demux_64_N | + | Fully parametrizable combinatorial parallel LFSR/ |
| - | IP frame demuliplexer with 64 bit data width for 10G Ethernet. | + | ==== mii_phy_if module ==== |
| - | Can be generated with arbitrary port counts with ip_demux_64.py. | + | MII PHY interface and clocking logic. |
| - | ==== ip_mux_N | + | ==== rgmii_phy_if |
| - | IP frame muliplexer with 8 bit data width for gigabit Ethernet. | + | RGMII PHY interface |
| - | Can be generated with arbitrary port counts with ip_mux.py. | + | ==== udp module ==== |
| - | ==== ip_mux_64_N module ==== | + | UDP block with 8 bit data width for gigabit Ethernet. |
| + | transmssion and reception. | ||
| - | IP frame muliplexer with 64 bit data width for 10G Ethernet. | + | ==== udp_64 module ==== |
| - | Can be generated | + | UDP block with 64 bit data width for 10G Ethernet. |
| + | transmssion and reception. | ||
| - | ==== udp_arb_mux_N | + | ==== udp_arb_mux |
| - | UDP frame arbitrated muliplexer with 8 bit data width for gigabit Ethernet. Supports priority and round-robin arbitration. | + | UDP frame arbitrated muliplexer with parametrizable |
| + | count. Supports priority and round-robin arbitration. | ||
| - | Can be generated with arbitrary port counts with udp_arb_mux.py. | + | ==== udp_checksum_gen module ==== |
| - | ==== udp_arb_mux_64_N | + | UDP checksum generator |
| + | UDP checksum fields. | ||
| - | UDP frame arbitrated muliplexer with 8 bit data width for 10G Ethernet. | + | ==== udp_checksum_gen_64 module ==== |
| - | Can be generated | + | UDP checksum generator module |
| + | length, IP length, and UDP checksum fields. | ||
| + | |||
| + | ==== udp_complete module ==== | ||
| + | |||
| + | UDP module | ||
| + | |||
| + | Top level for gigabit UDP stack. | ||
| + | |||
| + | ==== udp_complete_64 module ==== | ||
| + | |||
| + | UDP module with IPv4 and ARP integration and 64 bit data width for 10G | ||
| + | Ethernet. | ||
| + | |||
| + | Top level for 10G UDP stack. | ||
| + | |||
| + | ==== udp_demux module ==== | ||
| + | |||
| + | UDP frame demuliplexer with parametrizable data width and port count. | ||
| + | Supports priority and round-robin arbitration. | ||
| ==== udp_ip_rx module ==== | ==== udp_ip_rx module ==== | ||
| Line 164: | Line 334: | ||
| UDP frame transmitter with 64 bit datapath for 10G Ethernet. | UDP frame transmitter with 64 bit datapath for 10G Ethernet. | ||
| - | ==== udp_demux_N | + | ==== udp_mux |
| - | UDP frame demuliplexer | + | UDP frame muliplexer |
| + | Supports priority and round-robin arbitration. | ||
| - | Can be generated with arbitrary port counts with udp_demux.py. | + | ==== xgmii_baser_dec_64 module ==== |
| - | ==== udp_demux_64_N module ==== | + | XGMII 10GBASE-R decoder for 10G PCS/PMA PHY. |
| - | UDP frame demuliplexer with 64 bit data width for 10G Ethernet. | + | ==== xgmii_baser_enc_64 module ==== |
| - | Can be generated with arbitrary port counts with udp_demux_64.py. | + | XGMII 10GBASE-R encoder for 10G PCS/PMA PHY. |
| - | ==== udp_mux_N | + | ==== xgmii_deinterleave |
| - | UDP frame muliplexer with 8 bit data width for gigabit Ethernet. Supports priority | + | XGMII de-interleaver |
| + | control | ||
| - | Can be generated with arbitrary port counts with udp_mux.py. | + | ==== xgmii_interleave module ==== |
| - | ==== udp_mux_64_N module ==== | + | XGMII interleaver for interfacing with PHY cores that interleave the control |
| - | + | and data lines. | |
| - | UDP frame muliplexer with 64 bit data width for 10G Ethernet. | + | |
| - | + | ||
| - | Can be generated with arbitrary port counts with udp_mux_64.py. | + | |
| ==== Common signals ==== | ==== Common signals ==== | ||
| Line 202: | Line 371: | ||
| < | < | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| Line 207: | Line 379: | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| - | rtl/eth_arb_mux_4.v | + | rtl/axis_eth_fcs.v : Ethernet |
| - | rtl/eth_arb_mux_64.py : Ethernet | + | rtl/axis_eth_fcs_64.v : Ethernet |
| - | rtl/eth_arb_mux_64_4.v : 4 port Ethernet | + | rtl/axis_eth_fcs_insert.v |
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| - | rtl/ | + | rtl/ |
| - | rtl/eth_demux_4.v | + | rtl/eth_mac_1g.v : Gigabit |
| - | rtl/eth_demux_64.py : Ethernet | + | rtl/eth_mac_1g_fifo.v : Gigabit |
| - | rtl/eth_demux_64_4.v : 4 port Ethernet | + | rtl/eth_mac_1g_gmii.v |
| - | rtl/eth_mux.py | + | rtl/eth_mac_1g_gmii_fifo.v |
| - | rtl/eth_mux_4.v | + | rtl/eth_mac_1g_rgmii.v : Tri-mode |
| - | rtl/eth_mux_64.py : Ethernet | + | rtl/eth_mac_1g_rgmii_fifo.v : Tri-mode Ethernet RGMII MAC with FIFO |
| - | rtl/eth_mux_64_4.v : 4 port Ethernet frame multiplexer | + | rtl/ |
| + | rtl/eth_mac_10g_fifo.v : 10G Ethernet XGMII MAC with FIFO | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| - | rtl/ | + | rtl/ |
| - | rtl/ip_arb_mux_4.v : 4 port IP frame arbitrated multiplexer | + | rtl/ip_complete.v |
| - | rtl/ip_arb_mux_64.py : IP frame arbitrated multiplexer generator | + | rtl/ip_complete_64.v : |
| - | rtl/ip_arb_mux_64_4.v | + | rtl/ip_demux.v : IP frame demultiplexer |
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| - | rtl/ip_demux.py : IP frame demultiplexer generator | + | rtl/ip_mux.v |
| - | rtl/ip_demux_4.v : 4 port IP frame demultiplexer | + | rtl/lfsr.v |
| - | rtl/ip_demux_64.py : | + | rtl/ |
| - | rtl/ip_demux_64_4.v | + | rtl/ |
| - | rtl/ip_mux.py : IP frame multiplexer generator | + | rtl/rgmii_phy_if.v : |
| - | rtl/ip_mux_4.v : 4 port IP frame multiplexer | + | rtl/ssio_ddr_in.v |
| - | rtl/ip_mux_64.py | + | rtl/ssio_ddr_in_diff.v |
| - | rtl/ip_mux_64_4.v : | + | rtl/ssio_ddr_out.v : Generic source synchronous IO DDR output module |
| - | rtl/ | + | rtl/ssio_ddr_out_diff.v : Generic source synchronous IO DDR differential output module |
| - | rtl/udp_arb_mux_4.v | + | rtl/ssio_sdr_in.v : |
| - | rtl/udp_arb_mux_64.py : UDP frame arbitrated multiplexer | + | rtl/ |
| - | rtl/udp_arb_mux_64_4.v : 4 port UDP frame arbitrated multiplexer | + | rtl/ |
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/ | ||
| + | rtl/udp_checksum_gen.v : UDP checksum generator | ||
| + | rtl/udp_checksum_gen_64.v : UDP checksum | ||
| + | rtl/udp_complete.v : UDP stack (IP-ARP-UDP) | ||
| + | rtl/ | ||
| + | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| rtl/ | rtl/ | ||
| - | rtl/udp_demux.py | + | rtl/udp_mux.v : UDP frame multiplexer |
| - | rtl/udp_demux_4.v | + | rtl/xgmii_baser_dec_64.v : XGMII 10GBASE-R decoder |
| - | rtl/udp_demux_64.py : UDP frame demultiplexer generator (64 bit) | + | rtl/xgmii_baser_enc_64.v |
| - | rtl/udp_demux_64_4.v : 4 port UDP frame demultiplexer (64 bit) | + | rtl/xgmii_deinterleave.v : XGMII data/control de-interleaver |
| - | rtl/udp_mux.py | + | rtl/xgmii_interleave.v : XGMII data/control interleaver |
| - | rtl/udp_mux_4.v | + | |
| - | rtl/udp_mux_64.py | + | |
| - | rtl/ | + | |
| </ | </ | ||
| Line 261: | Line 457: | ||
| transfer with header data | transfer with header data | ||
| + | |||
| < | < | ||
| __ __ __ __ __ __ __ | __ __ __ __ __ __ __ | ||
| Line 270: | Line 467: | ||
| _____ | _____ | ||
| hdr_data | hdr_data | ||
| - | ___________ _____ _____ | ||
| - | tdata XXXXXXXXX_A0________X_A1__X_A2__XXXXXXXXXXXX | ||
| ___________ _____ _____ | ___________ _____ _____ | ||
| tdata XXXXXXXXX_A0________X_A1__X_A2__XXXXXXXXXXXX | tdata XXXXXXXXX_A0________X_A1__X_A2__XXXXXXXXXXXX | ||
| Line 288: | Line 483: | ||
| two byte transfer with sink pause after each byte | two byte transfer with sink pause after each byte | ||
| + | |||
| < | < | ||
| __ __ __ __ __ __ __ __ __ | __ __ __ __ __ __ __ __ __ | ||
| Line 307: | Line 503: | ||
| two back-to-back packets, no pauses | two back-to-back packets, no pauses | ||
| + | |||
| < | < | ||
| __ __ __ __ __ __ __ __ __ | __ __ __ __ __ __ __ __ __ | ||
| Line 326: | Line 523: | ||
| bad frame | bad frame | ||
| + | |||
| < | < | ||
| __ __ __ __ __ __ | __ __ __ __ __ __ | ||
| Line 346: | Line 544: | ||
| ===== Testing ===== | ===== Testing ===== | ||
| - | Running the included testbenches requires MyHDL and Icarus Verilog. | + | Running the included testbenches requires MyHDL and Icarus Verilog. |
| + | that myhdl.vpi is installed properly for cosimulation to work correctly. | ||
| + | testbenches can be run with a Python test runner like nose or py.test, or the | ||
| + | individual test scripts can be run with python directly. | ||
| ==== Testbench Files ==== | ==== Testbench Files ==== | ||
| Line 353: | Line 554: | ||
| tb/ | tb/ | ||
| tb/ | tb/ | ||
| + | tb/ | ||
| tb/ | tb/ | ||
| + | tb/ | ||
| tb/ | tb/ | ||
| + | tb/ | ||
| + | tb/ | ||
| tb/ | tb/ | ||
| + | tb/ | ||
| </ | </ | ||