[Paper] 面向Julia语言的高级综合工具链
Source: arXiv - 2512.15679v1
概述
该论文提出了一种 首创的编译器工具链,能够将 Julia 代码直接转换为可综合的 SystemVerilog,使开发者无需学习硬件描述语言或在源码中添加大量 pragma 即可面向 FPGA。该工具链基于 MLIR 基础设施,弥合了长期阻碍 FPGA 快速原型开发的 “双语言问题”,让算法设计者能够继续使用高级且富有表现力的 Julia 生态系统,同时仍然获得定制硅芯片的性能和能效优势。
关键贡献
- 基于 MLIR 的 Julia‑to‑RTL 编译器:一个全自动流水线,将高级 Julia 内核降至供应商无关的 SystemVerilog,无需额外指令或语言扩展。
- 支持动态和静态调度:工具链能够生成在编译时调度操作(静态)或在运行时决定调度(动态)的硬件,覆盖广泛的算法模式。
- 开箱即用的 AXI4‑Stream 集成:生成的 RTL 包含即用型 AXI4‑Stream 接口,简化了与片上存储、DMA 引擎或其他 IP 块的连接。
- 竞争力的性能:基准测试在真实 FPGA 板上约 100 MHz 运行,达到手工调优的基于 C/C++ 的 HLS 流程 60 %–83 % 的吞吐量。
- 供应商无关的 RTL 输出:生成的 SystemVerilog 可用于任何主要 FPGA 供应商的综合工具(Xilinx、Intel、Lattice 等)。
方法论
-
Front‑end parsing – Julia source is parsed using the existing Julia compiler front‑end, preserving high‑level type information and multiple dispatch semantics.
前端解析 – 使用现有的 Julia 编译器前端解析 Julia 源代码,保留高级类型信息和多重分派语义。 -
MLIR lowering – The parsed Julia IR is translated into a series of MLIR dialects (standard, affine, and a custom “Julia‑HLS” dialect) that capture loops, memory accesses, and data‑flow.
MLIR 降级 – 将解析后的 Julia IR 转换为一系列 MLIR 方言(standard、affine 以及自定义的 “Julia‑HLS” 方言),用于捕获循环、内存访问和数据流。 -
Scheduling & optimization – The MLIR passes perform loop transformations (tiling, unrolling), data‑dependency analysis, and decide whether a kernel should be statically scheduled (fixed pipeline) or dynamically scheduled (runtime control logic).
调度与优化 – MLIR 传递执行循环变换(分块、展开)、数据依赖分析,并决定内核是采用静态调度(固定流水线)还是动态调度(运行时控制逻辑)。 -
Hardware emission – Optimized MLIR is lowered to a SystemVerilog dialect, automatically inserting AXI4‑Stream handshaking logic and generating RTL modules for arithmetic units, buffers, and control FSMs.
硬件生成 – 将优化后的 MLIR 降低为 SystemVerilog 方言,自动插入 AXI4‑Stream 握手逻辑,并生成算术单元、缓冲区和控制有限状态机的 RTL 模块。 -
Verification & synthesis – The produced SystemVerilog is compiled with vendor tools (e.g., Xilinx Vivado) to obtain timing‑closed designs; functional correctness is validated against software reference models.
验证与综合 – 使用厂商工具(例如 Xilinx Vivado)编译生成的 SystemVerilog,以获得时序闭合的设计;功能正确性通过与软件参考模型对比进行验证。
The entire flow is scripted, so a Julia developer can run a single command (julia --project=fpga my_kernel.jl) and obtain a synthesizable hardware design.
整个流程已脚本化,Julia 开发者只需运行单个命令 (julia --project=fpga my_kernel.jl) 即可获得可综合的硬件设计。
结果与发现
| 基准 | 频率 (MHz) | 吞吐量相对于 C/C++ HLS* |
|---|---|---|
| FIR filter | 100 | 82.6 % |
| FFT (radix‑2) | 98 | 78.4 % |
| Matrix‑vector multiply | 101 | 71.2 % |
| Polynomial evaluation | 99 | 59.7 % |
*吞吐量以相同 FPGA 设备上的每秒操作数衡量,使用最先进的 C/C++ HLS 工具链(Xilinx Vitis HLS)。
关键观察
- 无需手动 pragma;编译器自动推断流水线深度和存储器划分。
- 生成的 RTL 在中端器件(如 Xilinx Artix‑7)上实现了时序闭合,资源使用适中(较大核约占 LUT 的 30 %)。
- 动态调度内核带来了适度的开销(吞吐量约低 10 %),但为数据依赖工作负载提供了灵活性。
实际意义
- 快速原型开发:数据科学家和算法工程师可以在 Julia 中迭代内核逻辑,实时查看硬件性能估计,并在无需单独 HDL 团队的情况下将设计推向硅片。
- 统一代码库:已经使用 Julia 进行仿真、测试或 GPU 加速的项目,现在可以添加 FPGA 目标,而无需复制代码或维护独立的 C/C++ 内核。
- 降低 FPGA 采用门槛:中小型公司、初创企业和研究实验室可以在不雇佣专门 RTL 工程师的情况下探索定制加速器,加速 AI 推理、信号处理和科学计算工作负载的上市时间。
- 互操作性:由于输出是带有 AXI4‑Stream 接口的普通 SystemVerilog,内核可以集成到现有 FPGA 设计中,与供应商 IP 混合使用,或组合成更大的 SoC 流水线。
限制与未来工作
- Performance gap: 虽然 60 %–83 % 的 C/C++ HLS 吞吐量令人印象深刻,但某些对延迟敏感的 kernel 仍落后于手工优化的设计。
- Resource overhead: 通用硬件生成有时会过度分配缓冲区或使用保守的流水线深度,导致 LUT/BRAM 使用率高于手动调优的实现。
- Toolchain maturity: 当前原型仅支持 Julia 语言特性的一部分(无元编程,对复杂数据结构的支持有限)。要实现更广泛的采用,需要将覆盖范围扩展到完整语言。
- Dynamic scheduling cost: 运行时控制逻辑会增加延迟;未来工作将探索混合静态/动态调度启发式方法以降低此开销。
- Verification ecosystem: 针对生成的 RTL 与原始 Julia 语义的自动形式化验证仍是一个未解决的研究方向。
作者计划扩大基准套件,集成更激进的 MLIR 优化,并开源该工具链以促进社区贡献。
作者
- Benedict Short
- Ian McInerney
- John Wickerson
论文信息
- arXiv ID: 2512.15679v1
- 分类: cs.SE, cs.AR, cs.PL
- 发表时间: 2025年12月17日
- PDF: 下载 PDF