verilog-ethernet笔记

github地址:https://github.com/alexforencich/verilog-ethernet

readme翻译

以太网相关组件的集合,用于千兆、10G和25G数据包处理(8位和64位数据路径)。

包括模块处理以太网帧以及IP, UDP, ARP和组件构建一个完整的UDP/IP堆栈。包括千兆和10G/25G MAC模块,10G/25G PCS/PMA PHY模块,以及10G/25G组合MAC/PCS/PMA模块。包括用于实现需要精确时间同步的系统的各种PTP相关组件。

还包括使用cocotext-eth的完整cocotb测试平台。

其中cocotbext-xxx是仿真测试模型(cocotb是一套基于python的用于构建仿真及测试用例的lib库)。

如果只支持IP和ARP,请使用ip_complete (1G)或ip_complete_64 (10G/25G)。

对于UDP、IP和ARP支持,请使用udp_complete (1G)或udp_complete_64 (10G/25G)。

顶级千兆和10G/25G MAC模块是eth_mac_*,具有各种接口和带/不带fifo。顶级10G/25G PCS/PMA PHY模块为eth_phy_10g。

顶级10G/25G MAC/PCS/PMA组合模块是eth_mac_phy_10g。

PTP组件包括一个可配置的PTP时钟(ptp_clock),一个PTP时钟CDC模块(ptp_clock_cdc),用于跨时钟域传输PTP时间,以及一个可配置的PTP周期输出模块,用于精确地从PTP时间生成任意频率。

cocotb介绍

cocotb是一个基于协程的协同仿真库,用于用Python编写VHDL和Verilog测试平台。

当前稳定版本的cocotb需要:

  1. Python 3.6+
  2. GNU Make 3+
  3. An HDL simulator (such as Icarus Verilog, Verilator, GHDL or other simulator)
pip install cocotb

一个cocotb的testbench案例:(相当于用python将xxx_tb.py代替了xxx_tb.v)

# test_dff.py

import random

import cocotb
from cocotb.clock import Clock
from cocotb.triggers import RisingEdge
from cocotb.types import LogicArray

@cocotb.test()
async def dff_simple_test(dut):
    """Test that d propagates to q"""

    # Assert initial output is unknown
    assert LogicArray(dut.q.value) == LogicArray("X")
    # Set initial input value to prevent it from floating
    dut.d.value = 0

    clock = Clock(dut.clk, 10, units="us")  # Create a 10us period clock on port clk
    # Start the clock. Start it low to avoid issues on the first RisingEdge
    cocotb.start_soon(clock.start(start_high=False))

    # Synchronize with the clock. This will regisiter the initial `d` value
    await RisingEdge(dut.clk)
    expected_val = 0  # Matches initial input value
    for i in range(10):
        val = random.randint(0, 1)
        dut.d.value = val  # Assign the random value val to the input port d
        await RisingEdge(dut.clk)
        assert dut.q.value == expected_val, f"output q was incorrect on the {i}th cycle"
        expected_val = val # Save random value for next RisingEdge

    # Check the final input on the next clock
    await RisingEdge(dut.clk)
    assert dut.q.value == expected_val, "output q was incorrect on the last cycle"

更多请见github:https://github.com/cocotb/cocotb

iverilog介绍

Iverilog是一个(适合于Linux的)用于硬件描述语言(HDL)模拟和综合的工具。它支持Verilog-1995、Verilog-2001和SystemVerilog标准。

https://zhuanlan.zhihu.com/p/643961181

MYHDL介绍

MyHDL项目的目标是为硬件设计人员提供Python语言的优雅和简单性。

MyHDL是一个免费的开源包,用于使用Python作为硬件描述和验证语言。Python是一种非常高级的语言,硬件设计人员可以使用它的全部功能来建模和模拟他们的设计。

此外,MyHDL可以将设计转换为Verilog或VHDL。这提供了进入传统设计流程的途径。

下面展示MYHDL的一个demo

from myhdl import block, delay, always, now

@block
def HelloWorld():

    @always(delay(10))
    def say_hello():
        print("%s Hello World!" % now())

    return say_hello


inst = HelloWorld()
inst.run_sim(30)

运行这个程序会显示以下结果

$ python hello1.py
10 Hello World!
20 Hello World!
30 Hello World!
<class 'myhdl._SuspendSimulation'>: Simulated 30 timesteps

更多请见官方文档:http://docs.myhdl.org/en/stable/manual/intro.html

Cygwin

Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上运行UNIX类系统。

比如说gcc, make, vim等。

官网:https://www.cygwin.com/

如何使用cygwin来 make verilog-ethernet项目

https://zhuanlan.zhihu.com/p/353958620

补充知识

PHY,PCS,PMA

在PCIe(Peripheral Component Interconnect Express)中,PCS和PMA都是物理层子层(Physical Layer Sublayer)的组成部分。

PCS是物理编码子层(Physical Coding Sublayer),它处理数据信号的编码和解码,以及错误检测和校正。PCS负责将逻辑上的数据流转换为物理层面上的数字信号,并通过使用8b/10b编码或128b/130b编码等技术来确保数据传输的可靠性和正确性。

PMA是物理介质子层(Physical Medium Attachment),它负责管理电气、时钟和定时等物理层面的信号特性。PMA还处理高速数据传输所需的时序控制和信号重建,并确保信号能够正确地传输到远端接收器。

PCS和PMA一起工作,使得PCIe可以实现高速、可靠的数据传输。


本文章使用limfx的vscode插件快速发布