⭐⭐⭐⭐⭐ 5星

Building an FPGA 3dfx Voodoo with Modern RTL Tools

来源: noquiche.fyi | 作者: fayalalebrun | 日期: 2026-03-22

核心成就:用现代RTL工具重建经典显卡

作者使用SpinalHDL在FPGA上成功重建了3dfx Voodoo 1显卡,这不仅是硬件复刻,更展示了现代RTL工具如何让单兵作战成为可能。

关键成就:这个设计现在可以由一个人描述、模拟和调试,前提是工具让你能够直接表达架构并在正确的抽象层次上检查执行。

Voodoo 1:比看起来更难

Voodoo 1看起来很不起眼——它只是一个内存映射加速器,做一件事:尽可能快地渲染三角形。

但它并不简单。尽管没有变换和光照硬件,没有可编程着色器,它的图形行为全部固定在硅片中:Gouraud着色的渐变、纹理采样、mipmapping、双线性和三线性过滤、alpha裁剪、裁剪、深度测试、雾等等。

核心对比:现代GPU的复杂性来自灵活性。原始Voodoo的复杂性来自固定功能硬件中编码的大量渲染行为。

寄存器接口的复杂性

Voodoo的寄存器接口展示了固定功能风格的复杂性。向triangleCmd或ftriangleCmd写入会启动三角形渲染,而寄存器组中的其他寄存器描述了如何rasterize三角形。

关键问题:Voodoo是深度流水线的。渲染一个像素涉及一系列阶段:梯度步进、纹理采样、颜色组合、深度比较等等。流水线将工作分成多个阶段,这样多个像素可以同时飞行。

Voodoo寄存器的四种行为

类型行为
FIFO按顺序入队并应用
FIFO + Stall入队,但仅在流水线排空后应用
Direct立即应用
Float转换后写入定点形式

使用SpinalHDL建模

Voodoo有430个配置字段分布在许多寄存器中,每个寄存器属于四类之一。在传统的HDL如Verilog中,这些差异通常分散在多个地方。

SpinalHDL有一个有用的抽象叫做RegIf。它允许你自然地声明寄存器,并为周围生成大量控制逻辑。作者扩展了它,让寄存器声明可以直接编码Voodoo特定的语义。

核心洞察:因为寄存器元数据是显式的,RegIf还可以导出规范文档和验证代码!这代表了硬件设计方法论的重大进步。

调试创新:netlist-aware波形查询

作者使用conetrace进行调试,这是一种netlist-aware波形查询工具,允许在正确的抽象层次上检查执行,而不需要在波形中手动滚动。

这解决了深度图形流水线调试的核心挑战:不是"让三角形出现"困难,而是足够精确地匹配Voodoo的确切行为,让错误的像素停止出现。

现代RTL工具改变了什么

  • 更高的抽象层次:SpinalHDL允许用更少的代码表达更复杂的硬件
  • 更好的调试工具:netlist-aware查询代替手动波形滚动
  • 单兵作战成为可能:一个人可以完成以前需要一个团队的工作
  • 硬件-软件协同:寄存器规范可以自动生成文档和验证
FPGA 硬件 3dfx Voodoo SpinalHDL RTL 复古游戏