直至宇宙热寂把我们分开:每秒通过100Mbps以太网广播倒计时至宇宙热寂

Lobsters Hottest 工具

摘要

一个开源ASIC设计,每秒通过100Mbps以太网广播倒计时至宇宙热寂。

<p><a href="https://lobste.rs/s/jlj10f/until_heat_death_do_us_part_counting_until">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/03 08:21

Essenceia/Until_Heat_Death_Do_Us_Part

来源:https://github.com/Essenceia/Until_Heat_Death_Do_Us_Part

计数至宇宙热寂

一款 ASIC,配备足够大的计数器,理论上可计数至宇宙热寂。 每 20 纳秒递增一次计数器值,每秒通过 100Mbps 以太网广播一个以太网帧,内含当前计数器值——反正也没人会长时间监听。

假设宇宙在大约 10^{100} 年后消亡。如果你有耐心等到那时,当计数器最终溢出时,藏着一个小彩蛋。

芯片布局图

快速入门见文档。

末日计数器

无需害怕,在计数器溢出之前,太阳早已吞噬我们这颗脆弱的星球。

假设大冻结在 10^{100} 年后到来,且我们以 50MHz 运行,则有:

  • 每秒 `50 \times 10^6` 个时钟周期
  • 每天 `50 \times 10^6 \times 60 \times 60 \times 24` 个时钟周期
  • 每年 `50 \times 10^6 \times 60 \times 60 \times 24 \times 365.25` 个时钟周期
  • 到大冻结共有 `50 \times 10^6 \times 60 \times 60 \times 24 \times 365.25 \times 10^{100}` 个时钟周期

因此,我们至少需要一个大小为 `\log_2(50 \times 10^6 \times 60 \times 60 \times 24 \times 365.25 \times 10^{100}) = 382.679718 \approx 383` 位的计数器。

软件支持

为了帮助你嗅探本地网络流量并解析以太网帧,我在 tools 文件夹下提供了 packet_receiver 程序——以防到那时大家都忘了怎么编程。如果编译器还存在,可以用以下命令构建:

cd tools
make

运行时要将希望嗅探的网络接口作为第一个参数指定,另外,需要 sudo 权限。

例如:

sudo ./packet_receiver wlp3s0

目前,它将计数器值解析为 uint64_t 类型,因此理论上这只会在未来 11680 年内正常工作。我知道这令人担忧,你也一定对明知故犯地发布有缺陷软件这种草率工程行为感到震惊——我听到你的声音了。但让我们先让人类度过“纪元危机”(https://en.wikipedia.org/wiki/Year_2038_problem),再来纠结这个问题吧。

遇到 bug 时请直接提交 issue,如果我有空就会修复。

100Mbps 以太网

本项目复用了 Teapot 以太网加速器封装(https://github.com/Essenceia/Teapot),用于通过 CAT-3/5 网线以全双工模式进行 100Mbps 以太网通信。希望到那时还有人记得如何用以太网对话。

以太网数据包

该封装工作在第 2 层以太网数据包层面,即以太网帧级别。支持两种类型的包:

  • 应用数据包,ethtype = 0x88B5,由加速器发送
  • 配置数据包,ethtype = 0x88B6,用于设置 ASIC 的 MAC 地址、VLAN ID 以及 TX 相位选择

所有目的 MAC 与 ASIC 当前 MAC 地址不匹配的数据包将被过滤掉。除非另行指定,ASIC 的 MAC 地址为 00:90:CF:00:BE:EF(读作 Nortel:BEEF)。

应用数据包

末日计数器不监听任何传入数据包(反正我们都快死了),而是每秒广播一次当前计数器值。就像一个可爱的信标,永远提醒着广袤的虚空:曾经有一群猿类,他们以观看猫咪视频为宗教仪式,他们曾存在于此。

响应帧格式:

[ 目的 MAC (6 字节) FF:FF:FF:FF:FF:FF ][ 源 MAC (6 字节) ][ ethtype = 0x88B5 (2 字节) ][ 魔数 (2 字节) 0xCAFE ][ 计数器 (48 字节) ][ FCS (4 字节) ]

计数器值和魔数均以小端序发送,粒度为 1 字节(标准方式)。

配置数据包

配置数据包用于设置 ASIC 当前的:

  • MAC 地址
  • VLAN ID
  • TX 数据到时钟的相位偏移

这些数据包不会被转发到加速器,因此不提供接收确认。此外,由于面积限制,这些配置不会被存储转发。任何损坏的数据包都会导致配置损坏。

数据包格式:

[ 目的 MAC (6 字节) ][ 源 MAC (6 字节) ][ ethtype = 0x88B6 (2 字节) ][ 新 MAC (6 字节) ][ 填充 (3 位)][ VID (12 位)][ 填充 (38 字节) ][ FCS (4 字节) ]

除非另行配置,应用数据包使用 ethertype 0x88B6,这是 IEEE 802.3 规定的第二个“本地实验性 Ethertype”,Linux 网络库并不知晓其存在。所以请相信我:它是真实存在的。

配置参数

MAC 地址

ASIC 当前 MAC 地址。所有目的 MAC 不匹配此地址的数据包将被过滤掉,所有响应将使用此地址作为源地址。

默认 MAC:00:90:CF:00:BE:EF(读作 Nortel:BEEF)

VLAN ID

对于带有 VLAN 标记的数据包,不匹配当前 VLAN ID 的数据包将被过滤掉。如果没有 VLAN 标记,则视为属于当前 VLAN。

默认 VLAN ID:0xDAD

配置引脚

TX 数据与参考时钟的相位偏移

为了补偿由时钟输入引脚到小型 tapeout 设计的数据输出触发器,再返回到输出引脚的路径延迟导致的输出数据与参考时钟的偏移,数据输出触发器的参考时钟是可选的,允许使用 180 度反相的参考时钟。

该反相配置在复位期间根据 tx_phase 引脚的状态捕获。

取值:

  • 0:无相移
  • 1:180 度相移

假设

设计将使用官方 Microchip LAN8720A 子板(https://www.microchip.com/en-us/development-tool/AC320004-3#Overview)进行测试。

本 ASIC 将支持 100Mbps 以太网,基于以下假设:

  • PHY 使用 Microchip LAN8720A(I) 芯片实现
  • 外部网络为全双工
    • 在 ASIC 中放弃对 CRS 的支持
  • 不支持 10Mbps
    • 禁用自动协商
  • LAN8720A 的时钟由与 ASIC 共享的外部时钟提供
  • 来自 LAN8720A 的流被视为无间隙;任何数据包间隙都会导致正在进行的包被标记为包含错误

MAC 行为

本 MAC 支持:

  • 巨帧,最大 9000 字节
  • VLAN 标记(802.21Q)

MAC 将过滤掉所有不匹配配置的目的 MAC 地址的单播数据包。这意味着所有广播和多播数据包都会被转发。

致谢

感谢 Reddit 上的 thegreatpotatogod 用这个糟糕的想法启发了我;感谢 Tiny Tapeout 项目及其贡献者;感谢所有致力于开源硅片工具社区的人们,是你们让这一切成为可能。

相似文章

设计一款以太网交换机ASIC

Hacker News Top

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