⑤ R3A: Reliable RTL Repair Framework with Multi-Agent Fault Localization and Stochastic Tree-of-Thoughts Patch Generation

可译为:

《R3A:一种可靠的 RTL 修复框架,结合多智能体故障定位随机思维树补丁生成

更详细、学术一点的翻译:

《R3A:一种可靠的 RTL 修复框架,采用多智能体故障定位以及基于随机 Tree-of-Thoughts 的补丁生成方法

词语拆解:

  • Reliable RTL Repair Framework
    可靠的 RTL 修复框架
  • Multi-Agent Fault Localization
    多智能体故障定位
    意思是由多个 agent 协同分析,找出 RTL 代码中最可能出错的位置。
  • Stochastic Tree-of-Thoughts
    随机化思维树
    Tree-of-Thoughts 是一种让模型以树状分支方式探索多种推理路径的方法
    stochastic 表示其中带有随机采样或随机探索机制
  • Patch Generation
    补丁生成 / 修复补丁生成

整体理解:

这篇标题表达的是一个更完整、更先进的修复框架:

  1. 先用多智能体来做故障定位
  2. 再用随机化的思维树推理生成多个候选补丁

最终实现更可靠的 RTL 修复

一、这篇论文到底在研究什么

这篇论文研究的是:能不能更可靠地用大语言模型自动修复 RTL(寄存器传输级)硬件代码里的 bug。作者认为,传统 RTL 自动修复方法虽然严谨,但修复能力受限;而直接用 LLM 虽然灵活,但结果不稳定。所以他们想解决一个核心矛盾:

传统方法太“死”,LLM 太“飘”,有没有办法让 LLM 既灵活又可靠?

论文提出的答案是一个框架,叫 R³A。这个框架不是单纯让 LLM 一次性吐出补丁,而是把整个修 bug 过程做成一个带搜索的 agent 系统,并且分成两步:

  • 先做故障定位,缩小可疑代码范围
  • 再做补丁生成,反复试错,直到找到能通过测试的修改方案

二、作者为什么觉得这个问题难

作者在引言里讲了两个主要难点。

1. LLM 本身有随机性,不可靠

LLM 生成答案是采样出来的,同样的问题多问几次,答案可能不同。对于写代码这件事,有时这反而是优点,因为可以多试几种修法;但在 RTL 调试里,这会变成问题,因为硬件验证非常强调稳定和正确。作者把这个问题概括为:LLM 有随机性,不能保证每次都给出正确修复。

2. RTL 代码和波形太长,输入上下文很差

RTL 设计通常层次多、代码长,而且波形数据按周期展开,非常冗长。LLM 面对这种长而稀疏的信息时,很容易注意力分散,看到很多表面异常,却抓不住真正的根因。作者认为,直接把整份 RTL 和波形都塞给模型,不仅低效,而且会导致输出不稳定。

所以这篇论文的本质,是在解决两个问题:

  • 怎么让 LLM 修 bug 更稳定
  • 怎么让 LLM 看到更聚焦、更有用的上下文

三、R³A 的核心思想是什么

论文的核心思想可以概括成一句话:

先用多智能体找到“哪里可能错了”,再用带随机搜索的 Tree-of-Thoughts 去试探“怎么改才对”。

作者把整个框架分成三部分:

  • 多智能体故障定位
  • 随机 Tree-of-Thoughts 补丁生成
  • ADI(Agent-Debugger Interface)接口层,负责让 agent 能看代码、看波形、调用编译/仿真工具

论文第 3 页 Figure 1 是总览图。左边是 fault localization,右边是 patch generation。这个图其实就是整篇论文的骨架。


四、第一部分:故障定位是怎么做的

作者提出的是一种 multi-agent anomaly detection,也就是“多智能体异常检测”。

它为什么需要多智能体

因为完整 RTL 设计太大,单个 LLM 很难一次看完并准确定位。于是作者把大问题拆成多个小问题:把 RTL 代码切成一段一段,每段交给一个 agent 去判断“这段代码和当前错误有没有关系”。

具体流程

论文第 5 页 Figure 3 讲得很清楚,流程大致是四步:

第一步:代码分段

作者先把完整 RTL 设计按语法结构拆分。做法是基于 AST 递归切分,直到得到一些较小但语法完整的代码片段。

第二步:构造 local view

每个代码片段会和相关错误信息组合起来,比如:

  • 编译或 lint 报错
  • 仿真结果
  • 波形不一致信息

这样就形成一个“局部视图”,也就是 agent 的输入。

第三步:每个 agent 独立分析

每个 local view 给一个 LLM agent,让它判断这段代码是不是可疑,并给出异常位置和原因。

第四步:聚合和筛选

把多个 agent 的结果收集起来,保留高分异常,再做排序和过滤,得到最终的 fault candidates,也就是可能出错的位置。

这一部分的意义

它不是直接找出唯一正确的 bug 行,而是给后续补丁生成提供较好的起点。作者也承认,这些 candidates 可能不完全准确,但至少能帮助 patch generation agent 聚焦。并且后续 agent 不会被严格限制在这些位置上,它仍然可以发现候选点之外的问题。

你可以怎么理解它

这有点像:

  • 一个大项目代码太多
  • 先让几个人分别检查不同模块
  • 每个人报出自己怀疑的地方
  • 最后汇总成一份“重点排查清单”

这份清单不一定百分百对,但能显著减少盲查成本。


五、第二部分:补丁生成是怎么做的

这是整篇论文最核心的技术点。

作者不是让 LLM 一次输出最终补丁,而是把修复过程定义成一个搜索问题。论文第 3 页 Figure 2 和第 4 页的算法是这里的关键。

1. 补丁生成为什么是搜索问题

作者把一个调试状态定义成二元组:

  • 代码状态 c
  • 对话历史 h

也就是说,一个状态不只是“当前代码长什么样”,还包括“agent 之前已经看过什么、问过什么、试过什么”。这样,bug 修复就不是一次生成,而是在很多状态之间移动。

初始状态是原始代码加初始对话。之后 agent 不断:

  • 看代码
  • 查波形
  • 搜索片段
  • 打补丁
  • 编译仿真
  • 再根据结果继续想

每走一步,就形成一个新状态。多个新状态连起来,就是一棵搜索树。目标就是在这棵树里,找到一个能让所有测试通过的状态。

2. 什么叫 stochastic Tree-of-Thoughts

Tree-of-Thoughts 本质上是:不是只走一条推理路径,而是保留多个思路分支,像树一样探索。作者这里加了一个关键改造:不是单纯 BFS 或 DFS,而是随机地、按启发式概率去选择下一个扩展状态。

为什么不直接 BFS/DFS?

  • BFS 太平均,容易在浅层浪费太多时间
  • DFS 太冒进,容易沿着一条错误方向越走越远

作者希望的是一种平衡:

  • 好的状态多给机会继续扩展
  • 但差一些的状态也不是完全放弃
  • 保留探索和利用之间的平衡

3. 启发式函数在干什么

论文第 4 页给了一个 heuristic function,用来给每个状态打分。大意是:

一个状态如果具有这些特点,就更值得继续扩展:

  • 已经通过了更多 testbench
  • agent 获得了更多有用查询信息

而这些情况会被惩罚:

  • 还有编译错误没解决
  • 消耗 token 太多
  • 非法工具调用太多
  • 已经打了太多 patch,说明可能越改越乱

所以这个函数本质是在估计:

从这个状态继续搜下去,成功修好 bug 的希望大不大。

接着作者用 softmax 把分数变成概率。分数越高,被选中继续扩展的概率越大,但不是 100%。这就形成了“随机但有偏好”的搜索策略。

4. 算法过程怎么理解

Algorithm 1 的流程可以这样记:

  • 初始只有一个或少数几个状态
  • 每轮从当前状态集合里,按概率抽一个出来
  • 回到该状态对应的代码版本
  • 让 agent 继续从这个状态往下调试
  • 得到一个新状态
  • 如果测试全过,就停止
  • 否则把新状态加入状态集合,继续搜

作者还提到一个 freshness penalty,就是某个状态刚被扩展过后,会临时降低它的吸引力,避免算法总盯着同一个状态不放。

5. 这部分的本质贡献

这部分最重要的贡献,不是提出了一个特别复杂的公式,而是把 LLM 的随机性从“缺点”变成了“搜索空间中的资源”。

通常大家会说 LLM 不稳定,所以多跑几次试试。作者进一步说:

既然它会随机,那不如把这种随机性组织成一棵有策略的搜索树。

这就是这篇论文最有意思的思想。


六、ADI 是什么,它为什么重要

ADI 全称是 Agent-Debugger Interface。你可以把它理解成:

一个在 LLM 和硬件调试环境之间的翻译层/中间层。

LLM 本身不擅长直接操作 EDA 工具,也不适合处理特别冗长原始输出,所以 ADI 负责做几件事:

  • 帮 agent 获取聚焦后的代码视图和波形视图
  • 帮 agent 搜索相关片段
  • 帮 agent 调用编译、仿真、lint 等工具
  • 把工具输出整理成适合 LLM 理解的文本反馈

这一步很关键,因为如果没有这个中间层,LLM 很容易把大量时间浪费在工具链细节上。作者明确说,他们不想让 LLM 去负责配置编译和仿真,而是希望它专注于“理解 bug 和想修法”。


七、实验是怎么做的

数据集

作者使用的是 RTL-repair dataset,这是一个常见的 RTL 修复基准,包含多种 buggy RTL 设计

对比方法

作者拿自己的方法和四类基线比:

  • RTL-repair:传统符号修复方法
  • SWE-Agent:通用软件 agent
  • MEIC
  • UVLLM:面向 RTL 的 LLM 方法

模型与环境

  • 底层模型用的是 DeepSeek-V3
  • 工具上使用 Verilator 做 lint 和 simulation
  • 还加了基于 Yosys 处理结果的额外 lint 检查

评价指标

一个 case 通过,表示修复后的波形和 golden reference 一致。
他们还用了 pass@k 来衡量可靠性,也就是在给定次数独立重试下,至少成功一次的概率。论文设置里每次重试有时间和 token 预算限制。


八、实验结果说明了什么

1. 总体修复能力很强

论文第 6 页 Table 3 显示,在 32 个 benchmark 中

  • RTL-repair 修好 16 个
  • SWE-Agent 修好 15 个
  • MEIC 修好 12 个
  • UVLLM 修好 20 个
  • R³A 修好 29 个

这是论文最重要的结果。作者据此声称:

  • 相比其他 LLM 方法,多修了很多 bug
  • 相比传统方法,也明显更强

2. 简单 case 大家都还行,难点在复杂 case

作者说前 17 个 benchmark 比较简单,通常只有一个模块一个文件,LLM 很容易理解。
真正拉开差距的是后 15 个复杂案例,它们往往:

  • 多模块
  • 多文件
  • bug 藏得更深
  • 可能要结合 lint、波形和层次结构分析

也就是说,R³A 的优势主要体现在复杂 RTL 设计上,而不是简单教学例子上。

3. 可靠性结果

论文结论部分给出的整体结果是:

  • 90.6% 的 bug 能在给定时间限制内修复
  • 平均 pass@5 = 86.7%
  • 平均 pass@1 = 75.0%

这说明它不是偶尔蒙对一次,而是在多次独立运行下都有较高成功率。


九、消融实验说明了什么

这一部分很值得讲,因为它能证明作者的方法不是“堆模块碰巧有效”。

作者做了五种设置比较:

  • naive:直接让 LLM 修
  • agent:有 agent 流程,但没有 tree-of-thoughts
  • BFS:有树搜索,但用 BFS
  • fix-only:只有补丁生成搜索,没有故障定位
  • full:完整方法

结果

full 最可靠

Figure 4 显示,full setting 的 pass@1 分布最好,说明完整方法最可靠。

stochastic ToT 比 BFS 和普通 agent 更好

作者认为,这证明随机 Tree-of-Thoughts 确实提升了可靠性,因为它比 BFS 更能兼顾探索和利用,也比一直往前冲的普通 agent 更不容易走进死路。

multi-agent fault localization 也有贡献

对比 fix-only 和 full,说明故障定位能提升整体可靠性。不过作者也很诚实,指出在个别 benchmark 上,局部视图有时会带来噪声,反而略微降低 pass@1。

Figure 5 的含义

第 6 页 Figure 5 比较了时间和 token 使用情况:

  • BFS 用时很多,但 token 没充分用起来,说明过度探索浅层
  • 普通 agent 反而容易一条路走太深,消耗更多 token,但缺少探索
  • full setting 介于两者之间,更平衡

所以这部分实验其实是在证明:
作者的方法好,不只是因为“试得更多”,而是因为“试得更聪明”。


十、这篇论文的优点

1. 问题抓得很准

作者抓住了 LLM 做 RTL 修复时最关键的两个现实问题:随机性长上下文。这个问题定义得很清楚。

2. 方法设计有层次

不是直接一句我们用 agent 修 bug”,而是把流程拆成:

  • 缩小上下文
  • 搜索修复路径
  • 中间接口适配工具链

整体结构比较完整。

3. 消融实验比较有说服力

它不仅证明“full 很强”,还解释了为什么比 naive、BFS、普通 agent 更强。

4. 很符合 RTL 调试的实际流程

真实工程里本来也不是“一次看全局然后直接改对”,而是:

  • 看线索
  • 缩小范围
  • 编译仿真
  • 反复试错

R³A 的流程和人类工程师工作方式很接近。


十一、这篇论文的局限和可质疑点

这部分如果老师让你“批判性阅读”,你就可以讲这些。

1. 据集规模不算大

实验 benchmark 总数是 32 个,这对于验证框架可行性够用,但对证明泛化能力还不算特别强。

2. 依赖特定工具链和接口工程

这个方法不是“只靠模型”就能跑起来,它很依赖 ADI、Verilator、Yosys 等工程配套。所以它的成功有相当一部分来自系统工程整合。

3. 启发式函数需要人工设计

状态评分函数不是自动学出来的,而是人工设定的指标和系数。这样做更可控,但也意味着方法效果可能依赖经验调参。

4. 还不能解决所有类型 bug

作者自己也承认,一些算法性错误或者涉及复杂时序/周期内延迟的问题,他们的方法仍然难以修复,比如某些 pairing 和 i2c 相关案例。

5. 对底层模型能力仍有依赖

虽然论文强调 test-time scaling 和框架设计,但底层用的是 DeepSeek-V3。如果底层模型弱很多,框架收益可能会下降


十二、你可以怎么总结这篇论文

你可以用下面这段话概括整篇:

这篇论文提出了一个名为 R³A 的 RTL 自动修复框架,目标是提高 LLM 修复 RTL bug 的可靠性。它的核心做法是:先通过多智能体异常检测对大规模 RTL 代码进行局部分析,得到可疑故障位置;再把补丁生成建模成搜索问题,利用带启发式函数的随机 Tree-of-Thoughts 在多个代码状态和对话状态之间进行探索,从而更稳定地找到可通过测试的补丁。实验表明,该方法在 RTL-repair 基准上显著优于传统方法和其他 LLM 方法。


十三、问“这篇文章最核心的创新是什么”

你可以答:

最核心的创新有两个。第一,它没有把 LLM 的随机性当成纯缺点,而是把随机性组织成一个受控搜索过程,也就是 stochastic Tree-of-Thoughts。第二,它针对 RTL 输入过长的问题,引入多智能体局部分析做 fault localization,从而改善输入质量。


十四、如果问“这篇文章相比已有工作强在哪里”

你可以答:

相比传统 RTL APR,它不受固定模板限制,修复空间更灵活;相比直接用 LLM 或普通 agent,它通过启发式随机搜索提高了可靠性;相比只靠 lint 或 tracing 的方法,它还加入了多智能体局部故障定位,因此在复杂多文件案例里表现更好。


我觉得这篇论文的价值不只是把 LLM 用到了 RTL 修复上,更重要的是它提出了一种“让 LLM 在工程任务里变得更可靠”的思路。它不是单纯追求更强模型,而是通过故障定位、接口设计和搜索策略把模型纳入一个受控框架。这种思路对其他代码修复和自动化调试任务也有借鉴意义。不过它的实验规模还有限,而且较依赖工程接口和人工设计的启发式函数,泛化能力仍需要进一步验证。


十六、最后帮你压成最短背诵版

一句话

这篇论文提出 R³A,通过多智能体故障定位 + 随机 Tree-of-Thoughts 搜索修复提高 LLM 自动修复 RTL bug 的可靠性

三个关键词

可靠性、故障定位搜索式补丁生成

三个贡献

多智能体 fault localization、stochastic ToT patch generation、ADI 调试接口。

实验结论

在 RTL-repair benchmark 上,R³A 修复 29/32 个 bug,整体修复率 90.6%,平均 pass@5 为 86.7%

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐