设计一款以太网交换机ASIC

Hacker News Top 新闻

摘要

本文宣布了据称是全球首款开源以太网交换机ASIC的设计与流片,预计将于2025年11月中旬进行芯片启动。文章讨论了开源网络硬件的缺乏,以及作者将构建交换机ASIC作为迈向开源路由器第一步的动机。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/24 23:04

# 设计一款以太网交换芯片 来源:https://essenceia.github.io/projects/ethernet_switch_asic/ AI 声明:所有 bug 均为人类亲手制造。 看起来我刚刚造出了世界上首款开源交换芯片,预计十一月中旬从晶圆厂拿到成品。 交换芯片布局渲染图(面积密度视图已开启),占据 `711.2 x 325` um 面积。该芯片的第一版目前已经流片在 Tiny Tapeout gf26b 穿梭芯片(https://tinytapeout.com/chips/ttgf26b/)上,属于第二次 wafer.space(https://wafer.space/)运行的一部分。硅片启动预计于 `2026-11-15` 开始。以下是它的仓库: 系好安全带,欢迎来到一个更加疯狂的传奇故事。 ## 开源网络 ASIC 在哪里?\# (https://essenceia.github.io/projects/ethernet_switch_asic/#where-are-the-open-source-networking-asics) 近期 FCC 的决定(https://essenceia.github.io/thoughts/fcc_has_sudo_rights/)让网络设备的核心重要性成为焦点,同时也让我意识到,完全开源的网络设备硬件竟然完全不存在。 尽管开源硅片仍处于萌芽阶段,但目前我们看到许多项目正在设计、测试,甚至最雄心勃勃的一些项目已经流片,并且已有经过验证的硅片在实际环境中运行。 了不起的 Kian-V 项目,一个经过硅片验证的 RISC-V SoC(https://github.com/splinedrive/kianRiscV/tree/master/linux_socs/LinuxSoC_v2),在 wafer.space 的第一次运行中制造。是的,它能运行 Linux。链接到原帖(https://x.com/splinedrive/status/2078548839326445672?s=20)。尽管如此,绝大多数最雄心勃勃的项目主要还是 RISC-V SoC(https://www.crowdsupply.com/baochip/dabao)。 令人惊讶的是,人们对构建网络设备开源硬件的兴趣要少得多。 好吧……其实并不意外……网络设备远没有 CPU 那么“性感”,因此从开源社区获得的关注也少得多。另一方面,这意味着有一条巨大的未开发之路,向任何有足够时间(以及超越常理的理智)的人来说,可以构建开源网络设备芯片! 因为,在硅片鸿沟的另一边,开源网络设备的世界实际上相当丰富,无论是蓬勃发展的软件生态系统还是开放的 PCB/电子生态系统,都有大量功能齐全的开源路由器可供选择(https://openwrt.org/toh/openwrt/one)。然而,由于当前生态系统的局限性,在引擎盖下,所有这些路由器仍然运行着闭源、黑盒的专有芯片来完成核心计算和路由任务。 *那么,构建一款路由器芯片需要什么?* 这是一个非常雄心勃勃的项目,因为路由器涉及一个复杂的 SoC,既需要足够强大的 CPU 来运行网络协议栈,又需要专门的网络硬件以及有线和无线连接的模拟前端。由于直接从头开始构建一款完整路由器对于单个人来说过于雄心勃勃,几乎不可能实现,那么我们先从一个更可行的第一步开始:构建一款交换机。毕竟,虽然大多数人只有一台路由器,但你可以拥有多个小型交换机,而且我们也没有这些交换机的开源芯片。 哦,我说的不是构建一个 FPGA 交换机,不,我说的是构建一款交换机 ASIC,流片,然后证明硅片能工作。 ## 交换机类型\# (https://essenceia.github.io/projects/ethernet_switch_asic/#switch-flavors) 在开始确定我们要构建哪种交换机之前,让我快速概述一下市面上不同类型的交换机。对网络设备非常熟悉的读者可以跳过这部分。 ### 术语表\# (https://essenceia.github.io/projects/ethernet_switch_asic/#glossary) #### 物理层\# (https://essenceia.github.io/projects/ethernet_switch_asic/#physical-layer) 以太网支持多种物理层,在 IEEE 802.3 规范中概述。规范中的每个子句定义了在给定带宽下通过介质承载以太网协议的底层介质特性。 一个 10 Gb 光纤以太网链路和一个 10 Mb 同轴电缆都可以承载以太网数据包,并且对于物理层之上的层次来说,数据包看起来完全一样。 不同之处在于物理层,规范中精确说明了数据将如何、以何种时序、采用何种编码在介质上传输。 这确保了不同制造商制造的设备对“说以太网”的含义达成一致,从而使它们能够互操作。 因此,我必须回答的首要问题之一是:我的交换机应该支持哪种物理层。这将决定我必须路由多少流量、处理速度有多快以及我能承载多少带宽。 #### 管理型 vs 非管理型\# (https://essenceia.github.io/projects/ethernet_switch_asic/#managed-vs-unmanaged) 第二个问题是:我想构建哪种类型的交换机? 交换机有两大类别:管理型和非管理型。顾名思义,管理型交换机可以从外部进行配置和管理。这允许更智能的路由,例如支持不同的 VLAN。 而非管理型交换机本质上是不可配置的网络设备,你将其插入网络,它就能工作(直到电涌将你们分开)。 #### 直通转发 vs 存储转发\# (https://essenceia.github.io/projects/ethernet_switch_asic/#cut-through-vs-store-and-forward) 最后一个交换机特性是直通转发与存储转发。 直通转发交换机在数据包仍在到达时就开始转发,从而显著降低网络延迟;而存储转发交换机会等待整个数据包到达,检查是否发生损坏,然后仅在检查通过后才转发数据包。 问题在于,当数据包损坏时,直通转发交换机可能仍然会转发它,从而导致损坏的数据包在网络中传播,因为转发在可以检查 FCS(帧检验序列)之前就开始了。 ### 在约束条件下设计(再次)\# (https://essenceia.github.io/projects/ethernet_switch_asic/#designing-against-constraints-again) 和往常一样,在我的 ASIC 设计工作中,我构建的东西既受我想要的形状影响,也受硅片约束的限制。 #### 引脚\# (https://essenceia.github.io/projects/ethernet_switch_asic/#pins) 我的第一个主要约束是引脚:不仅数量有限,而且最大带宽也有限。 由于我将通过 Tiny Tapeout 穿梭芯片(https://tinytapeout.com/chips/ttgf26b/)流片第一代芯片,而且纯粹使用数字单元,因此受到这些引脚的限制。 总共给我提供了 24 个引脚:8 个输入、8 个输出和 8 个双向(可配置为输入或输出)GPIO 引脚,额定在 50 MHz 下可靠运行(输入和输出数据均如此)。 缺少任何模拟前端使得直接构建符合 IEEE 物理层规范的东西成为挑战,但有一种变通方法:使用外部 PHY(物理层)芯片,并通过标准化的 RMII 总线(https://en.wikipedia.org/wiki/Media-independent_interface#Reduced_media-independent_interface)与之接口。尽管每个以太网接口消耗 7 位,但这使得我 50 Mbps 的引脚能够通过 **100Mbps 以太网**(100BASE-TX(https://en.wikipedia.org/wiki/Fast_Ethernet))发送和接收。 Tiny Tapeout 穿梭芯片 | 索引 | 输入 | 输出 | 双向 | |------|--------|--------|----------| | 0 | ui[0] | uo[0] | uio[0] | | 1 | ui[1] | uo[1] | uio[1] | | 2 | ui[2] | uo[2] | uio[2] | | 3 | ui[3] | uo[3] | uio[3] | | 4 | ui[4] | uo[4] | uio[4] | | 5 | ui[5] | uo[5] | uio[5] | | 6 | ui[6] | uo[6] | uio[6] | | 7 | ui[7] | uo[7] | uio[7] | 我将使用广泛可用的 Microchip LAN8720A/LAN8720AI(这是本文中唯一提到 AI 的地方)PHY 芯片(https://github.com/Essenceia/ethernet_switch_asic/blob/main/docs/LAN8720A-LAN8720Ai-Data-Sheet-DS00002165.pdf)来接口。稍后我将更深入地介绍这款 ASIC 如何与这个 PHY 接口。 #### 面积\# (https://essenceia.github.io/projects/ethernet_switch_asic/#area) 我的第二个主要约束是有限的晶片面积。 毕竟这些都是我自己掏腰包支付的,面积越大意味着制造成本越高。我并不是想攒一堆金子,只是根据马斯洛需求层次理论,华夫饼比面积更重要,更高的制造成本意味着更少的华夫饼。所以就像任何半导体公司一样,我有动力控制我的面积预算。 马斯洛需求层次理论(失真的 ASIC 版)。由于存储转发要求交换机在转发前存储整个数据包,而以太网帧最大可达 +1.5k 字节(巨型帧可达 +9k 字节),因此需要大量的存储空间。一种变通方法是将数据包存储到片外存储器,但目前我没有足够的引脚预算来实现这一点,因此片内存储器是我唯一的选择。 问题是,片内存储器消耗很大的面积,因为 SRAM 的面积占用大,而触发器的每比特存储面积更大。 如果只是几个字节,还可以商量,但对于多个 1.5k 字节的数据包来说,这无法接受,因此排除了存储转发。 使用 Tim Edwards 出色的 OCD 256x8 SRAM IP(https://github.com/RTimothyEdwards/gf180mcu_ocd_ip_sram)绘制的交换芯片布局超高分辨率渲染图(用于比例参考)。该 SRAM 宏单元有两个 bank,位于布局的右侧,采用 `W`(西)方向放置。假设我使用 Tim Edwards 出色的 OCD 256x8 SRAM IP(https://github.com/RTimothyEdwards/gf180mcu_ocd_ip_sram),一个 256 字节的 SRAM 占用 301.3 x 224.93 um(在此实现中使用 `W` 方向),仅它自己就占了布局的 1/3。如果我们想存储哪怕一个完整的数据包,就需要 6 个这样的实例,而且由于我们有 3 个端口,我们需要复制 3 次,所以总共 18 个实例。现在,我们有一个更大的 1028 字节版本的 SRAM(https://github.com/RTimothyEdwards/gf180mcu_ocd_ip_sram/blob/main/cells/gf180mcu_ocd_ip_sram__sram1024x8m8wm1/gf180mcu_ocd_ip_sram__sram1024x8m8wm1.lef),尺寸为 301.3 x 515.81 um,这很好地提高了我们的存储面积密度。但同样,如果我们实例化六个这样的宏单元,占用的面积将是我们目前可用面积的 3 倍。 现在,Tiny Tapeout 穿梭芯片确实允许我将这个设计最多再扩大两个因子(即 4 倍)。但成本也会扩大 4 倍,这时我们就进入了全芯片数量级的成本。如果我选择全芯片路线,那么由于我可以使用更多的引脚,这又解锁了与更大外部存储器接口的可能性,从而再次改变了正确技术权衡的格局。 #### 易于使用\# (https://essenceia.github.io/projects/ethernet_switch_asic/#easy-to-use) 最后,我想要一个不需要外部软件或配置的东西。 首先,因为我希望社区中的外部第三方用户能够轻松拿起这个 ASIC 并开始使用。一旦我开始涉及自定义软件,这件事就变得越来越困难。我的目标是尽可能接近即插即用,易于使用是衡量成功的标准。 这并不是说社区无法编译和烧录我的自定义嵌入式怪物,只是他们这样做的意愿会随着每一步的增加而指数级下降。 其次,因为我再次在非常紧张的时间表上工作,自定义软件支持会显著增加流片前和启动阶段的工作量。(别忘了,我们仍然在谈论一个人的项目。)对于这个以太网交换机项目尤其如此,因为我的目标是兼容广泛采用的开源交换机管理软件和协议,例如用于监控的 SNMP(https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol)或用于监控和配置的 SSH。 对这些协议的支持并非我能在硬件中轻松实现的东西,尤其是 SSH,最好的设计决策是将其卸载到 CPU 上。因此,要么在 ASIC 上集成一个片内 CPU,要么构建一个自定义接口连接外部 MCU 并将所有请求卸载给它。两个选项都涉及大量的软件工作,而片内 CPU 还预示着巨大的设计工作和更多的面积使用。到了这一步,我就接近计划中的路由器架构,而不是第一代交换机了。 所以,出于这两个原因,我选择构建非管理型交换机。 #### 我们要构建什么?\# (https://essenceia.github.io/projects/ethernet_switch_asic/#what-are-we-building) 总结一下,我正在构建一个: - 3 端口 - 全双工 - 100 Mbps 带宽 - 直通转发 - 非管理型 以太网交换机。 现在我们已经确定了要构建什么,是时候专注于有趣的部分了:如何构建它!🥳 ## 系统概述\# (https://essenceia.github.io/projects/ethernet_switch_asic/#system-overview) ### 隐藏在视线之外的真实以太网帧\# (https://essenceia.github.io/projects/ethernet_switch_asic/#the-real-ethernet-frame-that-is-hidden-from-view) 大多数人实际上从未见过完整的以太网数据包。 当你在计算机上通过 tcpdump 或 wireshark 检查以太网流量时,实际上你只看到了以太网帧的一部分,有些部分缺失了。这些部分通常被计算机的网络接口在将数据包转发到软件领域之前剥离,因此对用户隐藏了。 通过 tcpdump 捕获的随机 IPv4 数据包(`tcpdump -xx -e -v 'ether proto 0x0800'`): ``` 16:36:51.298082 60:e9:aa:92:dc:7d (oui Unknown) > 5c:e9:31:1e:9d:00 (oui Unknown), ethertype IPv4 (0x0800), length 78: (tos 0x2,ECT(0), ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 64) superpitchu.53332 > dfw25s53-in-f9.1e100.net.https: UDP, length 36 0x0000: 5ce9 311e 9d00 60e9 aa92 dc7d 0800 4502 0x0010: 0040 0000 4000 4011 2b98 c0a8 0085 4a7d 0x0020: 0369 d054 01bb 002c a93f 6fe8 5bd5 5378 0x0030: f4c9 ccae 477c 5083 0696 8fa4 4f62 57bf 0x0040: 41a9 78a3 fc60 7781 2b8b 38a1 2ccd ``` 缺失的部分是: - **前导码 + SFD**:在 MAC 头部开始之前,存在一个 7 字节的交替比特序列,表示数据包即将开始,称为前导码,随后是一个 1 字节的标记,以双断言比特序列结束,称为 SFD(帧起始定界符),表示接下来的比特是 MAC 头部。 - **帧检验序列**尾部:在数据包末尾有一个 4 字节的尾部,称为 FCS(帧检验序列),用于检查以太网帧的内容在传输过程中是否损坏。存储转发交换机和大多数计算机的网络接口卡都会检查这一点,并在数据包转发之前丢弃所有未通过此测试的帧。 原始数据包概述 由于在通过网络接口评估后,前导码+SFD 和 FCS 没有进一步的相关用途,它们会在剩余的数据包比特被转发到网络协议栈之前被剥离。 现在,由于我们通过 Microchip PHY 工作,我们实际上不会直接与以太网物理层接口,因为 PHY 会抽象掉精确的 100BASE-TX PHY 行为,尽管功能

相似文章

如何以免费模式建立半导体公司?

Hacker News Top

本文探讨了AESC Silicon开创的开源硅商业模式,该模式提供免费的核心IP,并像Linux一样收取支持和定制费用。文章强调了可验证安全性和定制芯片的更低门槛,并介绍了IP Forge,一个用于开源IP模块的包管理器。

RISC-V路由器

Hacker News Top

一款基于RISC-V的路由器的众筹活动目前已完成目标的10%,有89位贡献者。

你能逆向工程一个ASIC吗?

Hacker News Top

Jane Street 发布了一个新谜题,挑战参与者从 GDS 版图中逆向工程一个 ASIC,恢复网表,推断电路用途,并找到最终答案。

搭建 OPNsense 路由器

Lobsters Hottest

一份关于为家庭网络搭建定制 OPNsense 路由器的详细指南,介绍了路由器架构、VLAN 配置,以及选用 OPNsense 替代商业网关方案的理由。