FPGA 上的 Quake(MRISC32 CPU)[视频]

Quake 已被移植到运行在 FPGA 中的自定义 MRISC32 softcore CPU 上,许多人对这款 1990 年代 3D 游戏能在完全自制的硬件、工具链和 ISA 上如此流畅运行感到惊讶。评论者借此展开对“Quake 专用”硬件、FPGA 在通用计算方面局限性的畅想,以及开源工具(如 Yosys 和 F4PGA)如何让这类项目更易接触的讨论。帖子还深入探讨了 CPU 微架构——从以向量为先的设计到现代 x86 和 ARM 流水线——以分析指令集、分支预测和代码密度如何影响这类项目的性能。

项目概览与说明

  • 这个演示是在 FPGA 中的自定义 32 位 MRISC32 softcore CPU 上运行 Quake 的原始软件渲染器,而不是纯粹“全逻辑”的 Quake 实现。
  • 作者将 Quake 作为一个现实的基准测试,用来调优缓存、分支预测器以及整体 CPU 设计。
  • 在 Cyclone V 开发板上,它以大约 40 FPS 运行,分辨率为 320×180,并上采样到 1080p,配有正规的 FPU,时钟约 110 MHz(时序裕量在正式收敛之外被“超频”了)。

经典游戏的硬件实现与软件实现

  • 几位评论者畅想把 Quake 专用硬件完全放进 FPGA 逻辑里,实现极高帧率运行。
  • 也有人指出,完整硬件实现大型通用游戏并不现实;softcore 加速器或自定义指令更为可行。
  • 历史背景:早期街机游戏和部分主机主要使用离散或模拟硬件;完全数字化、类似 GPU 的架构要到更晚才成为主流。

FPGA 工具链与生态

  • 工具链广受批评(例如厂商 IDE);被视为 FPGA 更广泛应用的一大障碍。
  • 提到的开源项目有:Yosys、F4PGA/SymbiFlow、Verilator。它们很有前景,但普遍被认为不如主流编译器栈成熟。

自定义 GPU 与相关项目

  • 文中引用了多个相关的 FPGA 图形项目:
    • 在很小的 FPGA 上运行的 Quake 地图查看器和微型 Quake 渲染器。
    • 一款具有 90 年代中期风格的自定义 FPGA GPU,通过类似 Vulkan 的 API 运行 Quake。
    • 一个“Doom 芯片”和其他微型 GPU 实验。
  • 大家对在同一 FPGA 上或通过 PCIe 结合自定义 CPU 和 GPU 很感兴趣,不过也提到硬件与板级设计的复杂性。

MRISC32 ISA、向量与微架构

  • MRISC32 是一种“vector-first”的 RISC 风格 ISA,具有简单的硬件向量,适合 Quake/Doom 的光栅化循环。
  • 目前向量使用依赖手写汇编;编译器自动向量化支持仍然缺失。
  • 讨论深入到流水线设计、分支预测策略,以及分支延迟槽与现代预测器之间的比较。

RISC 与 CISC 以及 GBOoO 争论

  • 长篇子线程讨论:
    • 现代 x86 核心如何在内部把复杂指令翻译成微操作。
    • 它们是否应被视为“底层是 load/store RISC”还是一个独立类别(“great big out‑of‑order” 设计)。
    • 在 x86、AArch64 和 RISC‑V 之间,代码密度、uop cache 大小、指令解码复杂度以及能效的权衡。
  • 结论:前端复杂性和 uop cache 是主要的“x86 税”;但无论 ISA 如何,所有高性能核心如今都趋向于类似的大型乱序微架构。

显示、分辨率与复古美学

  • 有些人更喜欢在 CRT 上以低分辨率运行 Quake,认为模拟平滑和大脑“补全”让游戏比今天清晰的 LCD 缩放看起来更好。
  • 该演示先以低分辨率渲染,再用最近邻缩放到 1080p,从而产生非常锐利的像素;至于是否需要额外平滑,意见不一。

实用入门建议

  • 对 FPGA 新手的建议是:
    • 买一块便宜的 FPGA 开发板并开始试验。
    • 随着设计变大,使用 Verilator 做仿真。
    • 浏览社区资源(例如面向 FPGA 的论坛/subreddit)以获取开发板和教程推荐。

其他

  • 还有一段关于如何阻止侵入式“Sign in with Google”弹窗的讨论;据说使用带有“annoyances”过滤规则的 uBlock Origin 有帮助。