github地址:https://github.com/alexforencich/verilog-ethernet
以太网相关组件的集合,用于千兆、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是一个基于协程的协同仿真库,用于用Python编写VHDL和Verilog测试平台。
当前稳定版本的cocotb需要:
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是一个(适合于Linux的)用于硬件描述语言(HDL)模拟和综合的工具。它支持Verilog-1995、Verilog-2001和SystemVerilog标准。
https://zhuanlan.zhihu.com/p/643961181
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是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上运行UNIX类系统。
比如说gcc, make, vim等。
官网:https://www.cygwin.com/
如何使用cygwin来 make
verilog-ethernet项目
https://zhuanlan.zhihu.com/p/353958620
在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插件快速发布