抖音粉丝群1
『7x24小时有问必答』

这个 Rust 项目将 Verilog 编译成 Factorio 蓝图——甚至在游戏里跑 RISC-V CPU

起初这只是一个 Rust 学习实验,结果却演变成了今年最不寻常的编译器项目之一:输入 Verilog,输出原版 Factorio 蓝图。
有些项目只是普通的副业。而有些项目会让你停下划动的手指,打开 GitHub 仓库,然后惊叹:“等等……这真的能实现?”
当我发现 verilog2factorio 时,这就是我的反应。这是一个由 Ben J. C. 发起的野心勃勃的 Rust 项目,它能够接收 Verilog 硬件描述,并将其编译成纯原版的 Factorio 算术运算器蓝图。
这不仅仅是简单的逻辑玩具,也不是只会闪烁的计数器。这是一个可以在游戏内部运行 C 程序的功能性 RISC-V CPU
仅凭这一点就足以让这个项目值得大书特书。但更令人印象深刻的是其背后的工程之旅:编译器设计、图变换、仿真、物理布局规划、布线、GUI 工具链以及优化工作——这一切都是围绕 Rust 构建的。

为什么这个项目如此迷人

乍一看,Factorio 和 Verilog 似乎属于完全不同的宇宙。Verilog 用于描述数字硬件;而 Factorio 是一款工厂建设游戏,玩家使用传送带、机械臂和运算器自动化生产线和各种荒谬的机器。
但是,Factorio 中的运算器足够强大,其行为类似于逻辑电路。这打开了一扇通往狂想的大门:如果你能用 Verilog 描述电路,然后自动将其编译成可运行的 Factorio 蓝图会怎样?
这正是 verilog2factorio 所做的事情。其流水线以 Verilog 为输入,以可导入游戏的蓝图为输出。在此之间,项目执行了一长串转换:逻辑提取、信号映射、优化、仿真、布局、布线、配电以及最终的 JSON 生成。
换句话说,这不仅仅是一个猎奇项目。它是一个为非常不寻常的目标平台构建的真正编译器和规划系统。

从 Rust 学习项目到编译器工程

这个项目最令人共鸣的部分在于它的起源。它始于学习 Rust 和探索编译器想法的一种方式。但像许多伟大的技术副业一样,一旦核心想法被证明可行,它就开始膨胀。
在这个过程中,项目积累了一系列令人印象深刻的能力:
用于逻辑映射和蓝图生成的 Rust 后端集成 Yosys 作为 Verilog 前端Lua 脚本以定制和编排编译流程纯 Rust 运算器模拟器基于 egui 构建的节点式 GUI(支持原生和 Web)图分区和布局优化SVG 生成整数线性规划实验用于物理规划的模拟退火算法超参数调优
这份清单本身告诉了我们一个重要的事实:雄心勃勃的项目是学习 Rust 最快的方式之一。并非因为一切都会一帆风顺,而是因为它迫使你在这个奖励深思熟虑的语言中进行设计、失败、重构和重建。
这个项目就是一个完美的例子。据报道,一些方法在小规模情况下有效,但在规模扩大时就崩溃了。例如,基于 ILP(整数线性规划)的布局规划曾被探索过,但当设计空间变得太大时,最终被放弃,转而使用模拟退火算法。这就是真正的工程——绝不仅仅是“写一次教程代码就完事”。

核心亮点:在 Factorio 中运行 RISC-V CPU

这里的突出成就描述起来很简单,但其意义怎么高估都不为过:该编译器可以接收一个超嵌入式 RISC-V32 核心,将其转换为 Factorio 运算器,并在游戏中运行 C 程序。
这将项目从“聪明”提升到了“极其令人印象深刻”的层次。将算术或布尔表达式映射到运算器逻辑是一回事;而编译一个 CPU 核心、保持行为一致、分析时序、物理布线,并使其在游戏引擎的限制内工作,则完全是另一回事。
这种端到端的结果证明了该系统不仅在概念上有趣,而且是切实可运行的。许多实验性编译器项目止步于“玩具演示”阶段,而这个项目走得远得多。

架构解析:从 Verilog 到蓝图

在宏观层面,该系统使用两个主要阶段。

1. 基于 Yosys 的 Verilog 前端

第一阶段使用 Yosys 处理 Verilog,并生成最终可以翻译成 Factorio 兼容行为的逻辑图。这里有一个关键点:Yosys 流程经过了精心调整,以适配 Factorio 实际支持良好的运算符。
这是一个巨大的挑战。如果你简单地将 Verilog 扔进通用的综合流水线,最终可能会得到一个复杂性爆炸的图。在像 Factorio 这样的目标环境中,这可能转化为过多的运算器和不切实际的设计。
因此,该综合阶段没有依赖开箱即用的默认设置,而是被塑造成保留 Factorio 可以高效实现的模式——特别是围绕有符号 32 位操作和其他原生友好的行为。这就是项目开始感觉更像是一个真正的编译器后端问题的地方:你的前端选择会极大地影响后端的优化效果。

2. Rust 后端:映射、优化与生成

一旦综合逻辑可用,Rust 就接管了后续工作。后端将 Yosys JSON 读取到内部表示中,并通过多个阶段逐步完善它。
系统首先确定位应如何分组,如何恢复字级操作,以及信号应如何流经设计。这最终导致了一种更结构化的中间形式,可以翻译成 Factorio 原语。
简单的操作(如加法、减法、乘法、除法、取模、按位与/或)通常可以直接映射到算术运算器。更复杂的逻辑则使用判决器、查找表风格的策略或积之和风格的简化来表示。
这种分阶段设计是项目最引人注目的部分之一,因为它反映了一个经典的编译器真理:优秀的编译器取决于其中间表示(IR)的优劣。该项目没有直接从“Verilog JSON”跳转到“蓝图 JSON”,而是沿途引入了几种有目的的表示形式,每种都针对不同的关注点进行了优化:正确性、逻辑恢复、优化、仿真、规划或输出生成。这是扎实的编译器工程。

严谨的验证机制

这个项目比许多花哨的演示感觉更可信的一个原因是,它包含了健壮的验证思想。系统支持对结果逻辑设计进行仿真,并使用 VCD 追踪将其与原始 Verilog 行为进行比对。
这意味着生成的 Factorio 逻辑不仅仅是假设正确,而是可以与 Verilog 测试平台驱动的参考进行逐步比较。这正是经验丰富的工程师所尊重的工作流程:是的,构建奇怪的东西,但要严格验证它。
该项目还包含一个纯 Rust 运算器模拟器,这增加了另一层能力。一旦逻辑以 Factorio 兼容的形式表示,模拟器就可以单步执行时间并详细检查线路和组件的行为。这解锁了一个清晰的调试循环:
创建一个 Verilog 测试模块和测试平台模拟预期行为运行 Factorio 侧的表示随时间比较输出结果
这是 Rust 在工具链繁重的项目中如何大放异彩的绝佳例子。你获得了控制力、性能、强类型以及构建仿真基础设施的能力,而无需引入大量运行时复杂性。

物理布局规划:挑战升级

转换逻辑只是战斗的一半。真正的挑战是将该逻辑转变为在 Factorio 二维物理世界中有效运行的东西。一旦逻辑设计存在,项目必须回答一系列新问题:
哪些组件应该彼此靠近放置?布线应该如何走线?如何高效处理长距离连接?如何在不破坏布局的情况下分配电力?
这就是项目变得令人愉悦的严肃的地方。逻辑图使用著名的图分区工具 Metis 被划分为块。然后,使用自定义的模拟退火策略安排这些块,以减少布线负担并提高局部性。
接下来是布线,通过 A* 搜索处理,并设计了旨在减少跳数的成本模型。布线之后还有另一个实际问题:配电。由于布线后的布局也涉及电线杆,系统可以重复利用基础设施,然后启发式地填补缺失的覆盖范围,同时试图维持单一连接的电力网络并最小化铜线使用。
此时,很难不佩服项目的范围。这不是简单的“作者用 Rust 写了一个解析器”,这更接近于:“作者为视频游戏逻辑环境构建了一个特定领域的综合、规划、布线和仿真工具链。”

游戏里的时序分析

另一个引人注目的细节是对时序分析的支持。系统执行拓扑分析,将到达时间推过设计,并估算最小时钟周期。对于 RISC-V 核心,报告的时序定格在 41 个游戏 tick
这是一个写起来非常有趣的句子。时钟周期不是以硅上的纳秒为单位测量,而是以 Factorio 的 tick 为单位。然而,其基本概念与硬件工程中的相同:理解关键路径,量化延迟,并查看何处可能有助优化。
这种严肃的工程概念与非传统目标的结合,正是该项目令人难忘的原因。

为什么 Rust 是最佳选择

这个项目本可以尝试用其他语言完成,但 Rust 感觉特别适合它。因为像这样的项目处于以下领域的交汇点:
系统编程重图变换数据建模自定义优化流水线仿真序列化性能敏感的工具链
Rust 在该领域表现出色。它为复杂的内部表示提供了所需的控制力,为重复的仿真和优化过程提供了所需的性能,并在项目积累大量动态部分时提供了所需的可靠性。
同样重要的是,Rust 鼓励雄心勃勃的项目所需的那种架构纪律。当你同时处理综合结果、检查设计、逻辑设计、物理布局、布线状态和最终蓝图序列化时,类型安全不再是一种奢侈品,而是生存工具。

给 Rust 开发者的启示

除了“看这个很酷的 Factorio 编译器”之外,这里还有一个更大的教训。真正的教训是:如果你想在 Rust 上变得出色,就去构建一些稍微不合理的东西。但要足够雄心勃勃,以至于你无法通过浅显的理解完成它。
这个项目就是这一点的完美案例研究。它迫使工作跨越编译器、优化、仿真、UI、数据建模和算法设计。有些想法失败了。有些不得不被废弃。有些被更好的方法取代。这就是深度技能发展的方式。Rust 奖励这种坚持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码