- 硬件开发
- 网络
- 嵌入式
【免费下载链接】taxi
AXI, AXI stream, Ethernet, and PCIe components in System Verilog
Taxi 是 FPGA Ninja 开源的 System Verilog 传输组件库,其中的Zircon IP 协议栈实现了 IPv4、IPv6 与 UDP 的硬件卸载,覆盖 1Gbps 到 100Gbps 线速场景:它在硬件里完成报文头解析(parse)与重组(deparse)、VLAN 标签插拔、头部与载荷校验和计算/校验、接收报文规则匹配与哈希,并在多个应用接口间复用传输。本文将带你拆解 Zircon 的 8 个核心模块、收发流水线设计以及如何用仓库自带的 Cocotb + Verilator 仿真框架验证它。
为什么需要硬件 IP 协议栈?
在高速网卡场景中,CPU 逐包解析 IP 头、算校验和的软处理早已成为瓶颈。把协议处理下沉到 FPGA 硬件(即"硬件卸载")可以:
- 线速处理:报文以流水方式穿过解析器,不依赖 CPU,100G 端口也能零丢包;
- 低延迟:报文头在硬件内被直接拆解,应用逻辑只拿到需要的字段或纯载荷;
- 可复用:基于 AXI4-Stream 标准接口,接任何 MAC 都能用。
Zircon 的定位正是"轻量级线速 IP 栈",它也是下一代开源网卡 Corundum 的重要组成模块,源码位于 src/zircon/rtl/。
Zircon 功能一览
| 能力 | 说明 | 实现模块 |
|---|---|---|
| IPv4 / IPv6 解析 | 提取地址、TTL、DSCP、协议号等字段 | zircon_ip_rx_parse.sv |
| 报文重组 | 根据元数据重建以太网帧、插入 VLAN | zircon_ip_tx_deparse.sv |
| 长度与校验和 | 硬件计算/校验 IP 头及 UDP 校验和 | zircon_ip_len_cksum.sv |
| VLAN 插拔 | 收发方向均支持 VLAN 标签 | parse / deparse |
| RSS 哈希 | 接收方向对报文做流哈希(可关) | rx_ingress |
| 多应用复用 | 最多 4 路用户接口(N_UI)并发 | tx_ingress / rx_egress |
| 交付模式可配 | 原始包、剥离 VLAN、简化头、仅载荷 | 应用逻辑按需取用 |
说明:Zircon 仍处于活跃开发阶段,TCP、RDMA 支持与 Corundum 集成是官方计划中的功能。
整体架构:8 个模块组成收发两条流水线
Zircon 全部由 8 个 System Verilog 模块组成,收(RX)发(TX)方向各 4 级,级与级之间用 AXI4-Stream 接口串成流水线,报文头流与元数据流并行传递:
RX: MAC ──▶ rx_ingress ──▶ rx_parse ──▶ (规则匹配/哈希) ──▶ rx_egress ──▶ 应用逻辑 │ └──▶ len_cksum(长度/校验和旁路计算) TX: 应用逻辑 ──▶ tx_ingress ──▶ tx_buffer ──▶ tx_deparse ──▶ tx_egress ──▶ MAC各模块职责速览(源码见 src/zircon/rtl/):
- zircon_ip_rx_ingress:接收 MAC 帧,用异步 FIFO 跨时钟域并做异常帧(坏帧、超长帧)处理;
- zircon_ip_rx_parse:解析以太网/IP/L4 头部,输出 16 个 64bit 块的结构化元数据;
- zircon_ip_len_cksum:逐字节并行归约计算报文长度与 16bit 校验和累加值;
- zircon_ip_rx_egress:把处理后的报文经异步 FIFO 送到应用侧时钟域;
- zircon_ip_tx_ingress:应用侧提交报文并返回完成(cpl)信号;
- zircon_ip_tx_buffer:共享片上 RAM(默认 32KB)缓冲报文,保证乱序提交也能按序发送;
- zircon_ip_tx_deparse:按元数据重建完整报文头并插入 VLAN;
- zircon_ip_tx_egress:拼装头/载荷、跨时钟域送 MAC 并回传发送完成。
RX 流水线:从 MAC 帧到结构化元数据
1. rx_ingress:跨时钟域的第一道闸门
MAC 数据面通常运行在独立时钟域。zircon_ip_rx_ingress.sv 内部例化了 taxi_axis_async_fifo_adapter 完成跨域缓冲,并提供两组关键参数:
MAC_RX_FIFO_DEPTH(默认 32):接收 FIFO 深度;MAC_RX_FIFO_EB_MODE:背压模式下不丢包而是"标记满",把丢包决策权交还上游。
2. rx_parse:一次扫出整张元数据表
解析器 zircon_ip_rx_parse.sv 是本栈最精巧的模块。它把每个报文解析成一个固定的 16×64bit 元数据表,字段布局在源码注释中写得很清楚:
- 块 00:标志位/载荷长度、包校验和;
- 块 01:RSS 哈希值、头/载荷偏移;
- 块 02/03/04:VLAN 标签、以太目的地址、源地址+EtherType;
- 块 07:协议号、TTL/Hop Limit、DSCP、ECN、IP ID/流量类;
- 块 08~11:IPv6 目的/源地址(128bit);
- 块 12~14:L4 端口、TCP flags、wnd/urg、seq/ack(为后续 TCP 支持预留)。
这张"元数据表"在流水线中一路随行,下游模块(含 TX 方向的 deparse)都直接复用它——这是 Zircon 做到低延迟的关键:解析一次,处处可用。
3. len_cksum:校验和硬件卸载
zircon_ip_len_cksum.sv 用多级并行加法树(LEVELS = $clog2(BYTE_LANES))对整包做字节求和,与报文并行流过管线,在帧结束时产出长度与校验和结果,供接收方向验证、发送方向填充。对新手而言,这就是"校验和卸载"的最小硬件实现样本,值得精读。
TX 流水线:元数据驱动的报文重组
发送方向与接收方向形成镜像:应用逻辑只需提交"载荷 + 元数据",硬件负责把完整报文"拼回来"。
- zircon_ip_tx_ingress.sv:接收应用提交(
N_UI默认 4 路),异步 FIFO 跨域并提供m_axis_ui_tx_cpl完成流; - zircon_ip_tx_buffer.sv:
TX_RAM_SIZE(默认 32768 字节)片上 RAM 做包缓存,先出长度元数据、后搬包数据,保证重组时数据就绪; - zircon_ip_tx_deparse.sv:按同一张 16 块元数据表重建以太头、IP 头(支持
IPV6_EN开/关)与 VLAN 标签,并自动做大端字节序转换; - zircon_ip_tx_egress.sv:头/载荷合并、异步 FIFO 送 MAC 时钟域,
s_axis_mac_tx_cpl回传发送完成。
这种"元数据驱动"的设计让重组完全流水化,不需要整包驻留 SRAM 等待头生成,从而支撑 100G 线速。
关键参数速查:如何配置 Zircon
| 参数 | 默认值 | 位置 | 作用 |
|---|---|---|---|
IPV6_EN | 1 | parse / deparse / ingress / egress | 是否启用 IPv6 支持 |
HASH_EN | 1 | rx_ingress / rx_parse | 是否计算 RSS 哈希 |
N_UI | 4 | tx_ingress / rx_egress / tx_buffer | 用户(应用)接口数量 |
MAC_RX_FIFO_DEPTH | 32 | rx_ingress | MAC 接收跨域 FIFO 深度 |
UI_RX_FIFO_DEPTH | 32 | rx_egress | 应用接收跨域 FIFO 深度 |
UI_TX_FIFO_DEPTH | 32 | tx_ingress | 应用发送跨域 FIFO 深度 |
TX_RAM_SIZE | 32768 | tx_buffer | 发送包缓存 RAM 大小(字节) |
START_OFFSET | 14 | len_cksum | 长度/校验和起始偏移(跳过以太头) |
所有模块均基于 Taxi 统一的 taxi_axis_if 接口,数据位宽、KEEP 掩码、ID/DEST/USER 边带字段全参数化,与仓库内其他 AXI Stream 组件即插即用。
动手验证:Cocotb + Verilator 仿真框架
Zircon 自带测试台,每个被测模块一个目录,含 Makefile、Cocotb 用例与 Verilog testbench 三件套(见 src/zircon/tb/):
- zircon_ip_rx_parse/:解析器用例 test_zircon_ip_rx_parse.py;
- zircon_ip_tx_deparse/:重组器用例 test_zircon_ip_tx_deparse.py;
- zircon_ip_len_cksum/:校验和用例 test_zircon_ip_len_cksum.py。
快速上手步骤(需要已安装 Verilator 与 Cocotb):
- 把仓库克隆到本地:
git clone https://gitcode.com/gh_mirrors/taxi7/taxi; - 进入目标测试目录,例如
src/zircon/tb/zircon_ip_rx_parse; - 执行
make即可编译并运行仿真,日志会逐用例打印 PASS/FAIL。
提示:仓库根目录 tox.ini 定义了回归测试环境,适合批量跑全部模块。
适用场景与延伸阅读
Zircon 适合以下场景:
- 在自研 FPGA 网卡的 MAC 之后插入标准 IP/UDP 处理层,做线速转发、过滤与载荷提取;
- 结合 Corundum 网卡 实现带 RSS 哈希的多队列收发包;
- 学习高速流式协议处理:解析表、校验和归约树、元数据驱动重组都是教科书级实现。
延伸阅读(仓库内相对路径):
- 项目总览:README.md
- 协议栈源码:src/zircon/rtl/
- 测试台:src/zircon/tb/
- AXI Stream 接口定义:taxi_axis_if.sv
- 异步 FIFO(跨域缓冲核心):taxi_axis_async_fifo.sv
掌握 Zircon 的"元数据表 + 流水级"设计思想后,你也能在自己的 FPGA 项目里快速搭出一条 100G 线速的 IPv4/IPv6/UDP 处理通道。
- 硬件开发
- 网络
- 嵌入式
【免费下载链接】taxi
AXI, AXI stream, Ethernet, and PCIe components in System Verilog
相关推荐
Bt性能调优指南:10个技巧提升下载速度与系统稳定性
Bt性能调优指南:10个技巧提升下载速度与系统稳定性 Bt是一款功能强大的BitTorrent库和客户端,支持DHT、磁力链接、加密等多种特性。本文将分享10个
告别手动缩进:dart-vim-plugin 智能缩进配置与实战技巧
告别手动缩进:dart vim plugin 智能缩进配置与实战技巧 编写 Dart 与 Flutter 代码时,最影响效率的细节莫过于缩进:嵌套大括号、尾随逗
如何快速实现IP地址精准定位?免费离线IP数据库(IPv4+IPv6)完整指南
如何快速实现IP地址精准定位?免费离线IP数据库(IPv4+IPv6)完整指南 GitHub 加速计划 / ip / ip database 是一款功能强大的免
数据库后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考