文献导读:从 MATLAB 到 FPGA:A2H-MAS 如何用多智能体重塑 HLS 自动化流程
前言
AI太火了,尤其是在代码方面——AI写代码几乎可以超越人类了。在硬件描述语言上,AI也做的非常好,不论是Verilog还是SystemVerilog,亦或是CHISEL与SpinalHDL[1]。但对于FPGA原型验证,人类的路线还是一如既往,难以让AI介入。算法模型要先在MATLAB上进行验证,随后在FPGA上进行高质量的HLS[2]实现。但从 MATLAB 走到 FPGA 上高质量的 HLS 实现,往往依赖大量人工经验、反复调试和漫长迭代。
现有的LLM设计呢?尽管能生成代码,但仍存在两个问题:其一,是只关注功能正确,忽略了硬件设计更在意的时延、吞吐和资源占用;其二,是单个大模型 agent 容易出现幻觉、上下文遗忘和行为不稳定,很难可靠处理真实世界里多阶段、长链路的硬件开发任务。
怎么让大模型做出最好的回答?针对上面的两个痛点,论文 A2H-MAS: An Algorithm-to-HLS Multi-Agent System for Automated and Reliable FPGA Implementation 给出了一种方案,不是单纯让大模型把 MATLAB 翻成 C++,而是把 MATLAB → HLS → FPGA 整条链路拆成一个可验证、可复用、可迭代的自动化系统。
算法选择,永远比 pragma 更重要
pragma 是什么?它可以理解成给编译器或 HLS 工具的提示或指令。它本身通常不改变程序的功能逻辑,而是告诉工具怎么优化代码。HLS内,pragma至关重要,因为它会直接影响生成出来的硬件结构。同一段C++代码,加上合适的 pragma 后, 可能就会从很慢的硬件摇身一变成为高吞吐、低延迟的流水线结构。
但,优化是不够的。提示再好,如果结构太烂,还是治标不治本,宛如大粪雕花。A2H-MAS 的核心便是:不仅仅将任务拆分给多个 agent,还改写算法结构,使其更符合硬件数据流,在做HLS层面的性能调优,如流水线、位宽、循环展开等,即 algorithm-hardware co-design的方法。论文指出,如果算法本身还是 CPU/Matlab 风格的 frame-based、memory-centric 写法,那么再多 pragma 也可能救不回来。真正高效的 FPGA 实现,往往要先把算法改造成 sample-based、streaming-oriented 的数据流形式。作者甚至举例说,把某些相关运算改成 FIR 架构,或者把迭代算法改成表驱动实现,可能会带来数量级的资源节省,这通常比 pragma 微调更有效。
frame-based、memory-centric ,就是“帧式、全局内存式”写法:先把一大块数据整帧读进来,存在数组里,再围着这个大数组做多轮遍历、切片、随机访问,最后再整帧吐出结果:
1 | def moving_avg_frame(x, W): |
而 sample-based、streaming-oriented,翻译过来就是“采样式、流式”写法,内部只维护小状态:寄存器、环形缓冲、计数器,结果尽量按样本持续输出:
1 | from collections import deque |
A2H-MAS 到底做了什么?
A2H-MAS 的设计有两个层面。
第一个层面是系统层。作者没有用一个“大总管式”的 LLM 一把梭完成所有工作,而是把 MATLAB-to-HLS-to-hardware 流程拆成多个专门的 agent,每个 agent 有标准化输入输出接口,并且用明确规则和确定性工具来约束。论文专门强调,agent 的输入和输出都是结构化目录,例如 MATLAB 源文件、testbench、module definition、参考数据等;这样前一个 agent 的输出可以直接变成下一个 agent 的输入,整个流程像流水线一样串起来。与此同时,关键步骤不交给模型“自由发挥”,而是交给工具来做执行和验证,比如用批处理测试、模拟器和 testbench 去检查结果。作者认为,这样可以显著降低 hallucination,减少上下文丢失,并提高可复现性。
第二个层面是算法层。A2H-MAS 不是直接把整段 MATLAB 翻译成 HLS,而是先做 dataflow-oriented modular decomposition,把复杂算法拆成更小、更独立的子模块。每个子模块有清晰的输入输出接口、流水线位置和下游模块关系,相关信息会记录进结构化配置文件中。这样做的好处很明显:每个 agent 面对的问题更小,验证更方便,后续优化和集成也更稳定。
Modularization 模块化
系统会把复杂 MATLAB 算法拆成子模块,每个模块保持最小且标准化的输入输出接口,避免产生多余中间结果,同时生成 machine-readable 的配置文件,方便下游优化、翻译和验证。
Test Data Generation 测试数据生成
由于这些子模块本质上对应原始算法中的中间变量,系统可以直接运行原始算法的 testbench,自动抓取中间输入输出,形成每个子模块自己的测试输入和参考输出。作者还规定了统一命名方式,从而保证后续各阶段都使用同一份可追踪的数据集。
Function Flattening 函数展开
很多 MATLAB 代码依赖内置函数或 toolbox 函数,这些封装虽然方便算法开发,却不利于硬件改写,也不利于 LLM 理解真实计算语义。于是系统会展开这些函数调用,把它们的显式实现内联到子模块里,为后续优化打基础。
Code Optimization 代码优化
这应该是最有“硬件味”的一步——不是单纯的优化软件代码,而是让软件代码朝着“硬件优化”的方向去靠。论文明确说,这一阶段要把 MATLAB 里典型的“帧式、全局内存式”计算模式,改造成 FPGA 更喜欢的“采样式、流式”模式。为此,系统会先分析内存访问模式和数据依赖,再从LLM的知识库中挑选合适的模板,例如移位寄存器、循环缓冲区、行缓冲区、ping-pong buffer 等。作者展示了移位寄存器和 循环缓冲区的例子:前者适合 FIR 一类需要并行访问最近 N 个样本的场景,后者适合 delay line 这类顺序读写并且容易映射到 BRAM 的场景。
1 | % 移位寄存器 |
1 | % 循环缓冲区 |
Algorithm-Hardware Co-Design 算法-硬件的联合重构
在正式翻译之前,再做一次算法级重构。论文特别强调,应该先探索算法替代方案,再做 pragma 优化。例如把相关计算改成 FIR 结构,或者调整并行度因子,以更好地权衡资源和吞吐。这里所有算法级改动都要经过RTL级联合模拟仿真的时延约束验证,避免省了资源却破坏吞吐需求。
Code Translation 源代码翻译
在这一步,系统才把已经优化过的 MATLAB 代码翻成 HLS 兼容的 C++。因前面已经做过数据流重构,所以翻译反而更直接:把 MATLAB 运算系统性映射成等价的 C/C++ 形式,并保证流式传输接口和接口参数不被破坏。作者还提到,在早期探索阶段会先给变量足够宽的位宽,将位宽优化工作放到后面做。与此同时,验证环境会从 MATLAB 切到 Xilinx Vitis HLS,执行 csim、synthesis 和 C/RTL 联合仿真。
Refinement 改良
这一阶段本质上就是 HLS 设计空间探索。系统会自动扫 loop unroll、pipeline、bit-width、array partition 等参数,量化评估它们对 latency、throughput 和 resource utilization 的影响。值得注意的是,作者强调时延验证必须依赖 RTL co-simulation,而不能只看 synthesis 的估计值,因为综合时估计和真实执行周期可能不一致。
Integration & Implementation 整合与布局布线
最后,系统自动把所有 refined 子模块集成为完整的 top-level 设计,例如生成 top.cpp,用基于流式的方式组织模块之间的数据流,并在需要时复制流通道来保证模块间关系正确。之后再走完整 HLS 验证、比特流生成和板级验证。
测试
论文在两个代表性通信任务上做了实验:5G NR 的 SSB detection 和 WLAN 的 time/frequency synchronization。在 5G NR 场景中,作者提到为了减少 PSS correlation 的 DSP 使用量,把吞吐设置成每 8 个周期处理 1 个样本,但依然满足 7.68 Msps 的要求;这说明它不是只追求功能能跑通,而是在做明确的资源-性能折中。
从整体实现结果看,5G NR top-level 设计达到 292.23 MHz,资源占用为 8,669 LUT / 24,216 FF / 279 DSP / 7 BRAM;WLAN synchronization top-level 达到 337.61 MHz,资源占用为 10,981 LUT / 14,787 FF / 210 DSP / 76 BRAM。这些数字未必能直接说明“绝对最优”,但至少说明作者确实做到了子模块级自动生成和系统级自动集成。
真正最能体现论文观点的是消融实验。作者拿 calcThreshold 和 extractSSBsig 两个模块做三种对比:
- Direct:直接让 LLM 从 MATLAB 翻成 HLS C++
- Adaptation:先做面向硬件的 MATLAB 重构
- Refinement:再进一步做精细化 HLS 优化。
结果很夸张。以 calcThreshold 为例,Direct 方案用了 36,500 LUT、80,434 FF、38 DSP、16 BRAM,而且 时钟失败;Refinement 后变成 173 LUT、274 FF、3 DSP、1 BRAM,频率达到 322.27 MHz。extractSSBsig 也是类似趋势:LUT 从 4,468 降到 155,延迟从 24,890 降到 6,730。论文总结说延迟最高可降低 73%。这个结果几乎就是在用实验告诉读者:“直接翻译”是远远不够的,真正重要的是面向硬件的数据流改写和后续 refinement。
总结
把这篇论文如果放到最近一波“LLM + EDA / HLS / HDL”研究里看,它的贡献不是提出了一个全新的模型,而是提出了一套更接近真实工程流程的系统化方法:
- 把“自动化”建立在标准接口 + 工具验证 + 分阶段回归测试上,而不是只靠 prompt engineering;
- 抓住了 HLS 设计里真正关键的瓶颈:不是语法翻译,而是算法到数据流的重构;
- 用消融结果证明了“算法级优化优先于 pragma 级优化”这件事。
A2H-MAS 的价值,不在于“又一个多智能体框架”,而在于它把 MATLAB 到 FPGA 的过程重新理解成了一条需要算法-硬件协同设计、执行式验证和分阶段优化的工程流水线。
什么,你说没有开源代码?那你吹鸡毛呢。
作者说,他只有一部分早期尝试的代码,在rockyco/llm-fpga-design: LLM-Aided FPGA Design and Debug Flow,但是完全不完整。实际日志中还是失败。
HLS:High-Level Synthesis,高层次综合 ↑
