CPPL:一种电路提示编程语言
摘要
CPPL是一个编译器中介框架,通过使用Python领域特定语言和基于JSON的中间表示,连接大语言模型与硬件设计,从而实现可静态检查、可优化的RTL生成。
暂无内容
查看缓存全文
缓存时间: 2026/05/25 18:48
# CPPL:一种电路提示编程语言 来源:https://arxiv.org/html/2605.17892 Shuo Yin¹, Yihe Wang², Lancheng Zou¹, Xufeng Yao¹, Tinghuan Chen², Chen Bai³,†, Zhengrong Wang¹, Tsung\-Yi Ho¹, Bei Yu¹,†, ¹香港中文大学 ²香港中文大学(深圳) ³复旦大学 ###### 摘要 大语言模型 (LLMs) 在寄存器传输级 (RTL) 设计自动化方面显示出潜力,但直接生成 RTL 难以验证、优化及与基于编译器的硬件设计流程集成。CIRCT 等硬件编译器基础设施提供了类型化中间表示、合法性检查和优化流程,然而当前的大语言模型由于 MLIR 语法、SSA 规范、方言特定操作和严格的位宽约束,难以直接生成原始的编译器 IR。本文提出**CPPL**,一个编译器介导的设计框架,将 LLM 辅助的硬件生成转变为可静态检查的前端问题,而非不受约束的 RTL 文本生成任务。CPPL 结合了一个用于声明模块接口和层次结构的 Python 前端 DSL,以及 CPPL IR——一种基于 JSON 的电路 IR,旨在暴露编译器可见的结构,同时保持对 LLM 的易用性。编译器从声明的模块端口推断操作位宽,验证生成的 IR,检查层次结构和端口绑定,并将结果确定性地降级到 CIRCT,以生成可综合的 Verilog。在 RTLLM 基准测试上,CPPL 相比直接生成 Verilog 和直接生成 CIRCT IR 提高了功能正确性,而 CIRCT 优化减少了综合后的 AIG 节点数。这些结果表明,编译器介导的接口可以使 LLM 辅助的硬件设计更可靠、更可分析且更利于后端优化。CPPL 可在 https://github.com/SawyDust1228/CPPL 获取。 ## I 引言 大语言模型 (LLMs) [1 (https://arxiv.org/html/2605.17892#bib.bib1), 2 (https://arxiv.org/html/2605.17892#bib.bib2), 3 (https://arxiv.org/html/2605.17892#bib.bib3)] 越来越多地用于寄存器传输级 (RTL) 设计自动化,包括 Verilog 生成、修复和面向验证的编码 [4 (https://arxiv.org/html/2605.17892#bib.bib4), 5 (https://arxiv.org/html/2605.17892#bib.bib5), 6 (https://arxiv.org/html/2605.17892#bib.bib6), 7 (https://arxiv.org/html/2605.17892#bib.bib7), 8 (https://arxiv.org/html/2605.17892#bib.bib8)]。这些系统通过将自然语言规范转换为可执行的硬件描述,降低了硬件设计的门槛。然而,大多数现有的 LLM4RTL 流程遵循端到端的生成范式:模型输出最终的 RTL 文本,然后由模拟器或综合工具检查。这种范式很方便,但从设计自动化的角度来看,它留下了三个反复出现的问题。首先,生成的 RTL 可能在语法上无效或与下游工具不兼容。其次,语法有效的 RTL 常常无法通过功能测试,因为模型必须同时推理行为、结构、位宽和边界情况。第三,端到端的 RTL 生成很少向硬件编译器基础设施暴露中间结构,而这些基础设施已经提供了类型化表示、合法性检查、规范化和优化。 CIRCT [9 (https://arxiv.org/html/2605.17892#bib.bib9)] 等硬件编译器基础设施为解决这些问题提供了自然途径。CIRCT 在基于 MLIR 的方言中表示电路,可以在应用标准编译器变换的同时将良好的中间表示降级为可综合的 Verilog。原则上,LLM 可以直接生成 CIRCT IR,从而受益于编译器验证和优化。在实践中,这很困难。CIRCT IR 暴露了 MLIR 语法、SSA 命名、方言特定操作约束和严格的类型要求。我们在第 II 节 (https://arxiv.org/html/2605.17892#S2) 中的性能分析结果显示,即使是强大的商业模型,在生成 CIRCT IR 时的正确性也远低于生成 Verilog,尽管提供了特定格式的提示。这一差距表明,基于编译器的 LLM 硬件生成需要一个比自然语言或原始 RTL 更结构化、但比低级编译器 IR 更易让 LLM 生成的前端接口。 图 1:CPPL 结合了基于 LLM 的生成与编译器介导的电路构建和优化。 本文提出 **CPPL**,一个用于 LLM 辅助硬件生成的编译器介导框架。CPPL 引入了一个基于 Python 的前端 DSL,明确捕获模块接口和结构层次,同时将实现意图保留在 LLM 友好的形式中。前端在 LLM 生成之前具体化固定端口、模块实例和连接结构,防止模型自由发明不兼容的接口或层次结构。对于模型生成的部分,CPPL 使用 **CPPL IR**,一种基于 JSON 的中间表示,以规整的模式编码电路操作。CPPL IR 旨在保留编译器可见的电路结构,同时避免原始的 MLIR 语法;编译器执行语法验证、宽度推断、结构检查以及向 CIRCT IR 的确定性降级。生成的 CIRCT 程序随后被编译和优化为 Verilog。通过这种方式,CPPL 将 LLM 生成从非结构化的 RTL 或原始的 CIRCT IR,转向一个类型化、结构受限的前端,该前端可以在后端代码生成之前进行检查。图 1 (https://arxiv.org/html/2605.17892#S1.F1) 总结了这一转变。与之前依赖自然语言提示和直接模型推理来生成 RTL 的 LLM4RTL 流程不同,CPPL 要求用户通过编程语言前端来描述硬件,并将 RTL 构建任务委托给编译器后端。这种分离使得接口和层次结构信息在 LLM 生成之前保持显式,并将合法性检查、细化和优化移入编译路径。 我们在 RTLLM 基准测试 [5 (https://arxiv.org/html/2605.17892#bib.bib5)] 上的评估显示,直接生成 Verilog 虽然实现了较高的语法正确性,但仍存在显著的功能性差距,而直接生成 CIRCT IR 的可靠性则低得多。CPPL 通过将接口构建、层次具体化、合法性检查和类型恢复分配给编译器,同时让模型生成受约束的电路表示,从而缩小了这一差距。在评估的模型中,CPPL 相比直接生成 Verilog 和直接生成 CIRCT IR 均提高了功能正确性。我们还使用 post\-aigmap 节点数评估了综合质量,并展示了 CIRCT 优化流程可以减少综合后的电路规模。 本文做出以下贡献: - • 我们识别了 LLM 生成能力与原始 CIRCT IR 生成之间的不匹配,表明编译器 IR 语法和语义对当前 LLM 仍然困难。 - • 我们提出了 **CPPL**,一个开源的编译器介导硬件生成框架,结合了 Python 前端 DSL、基于 JSON 的电路 IR、静态检查和基于 CIRCT 的降级。 - • 我们形式化了 CPPL 使用的结构保留和宽度推断原则,以在生成过程中保持模块层次结构、端口绑定和操作类型的一致性。 - • 我们在 RTLLM 上评估了 CPPL,并展示了与直接生成基线相比,功能正确性和综合级紧凑性的提升。 ## II 背景与动机 ### II\-A 相关 LLM4RTL 工作 最近的大语言模型在从高层次描述生成 RTL 代码方面显示出令人鼓舞的能力,引起了研究界的广泛关注。已有几种方法被提出以改进基于 LLM 的 RTL 生成:[8 (https://arxiv.org/html/2605.17892#bib.bib8), 10 (https://arxiv.org/html/2605.17892#bib.bib10)] 探索了 LLM 微调和图嵌入技术以提升生成性能,而 [6 (https://arxiv.org/html/2605.17892#bib.bib6), 7 (https://arxiv.org/html/2605.17892#bib.bib7)] 引入了代码到代码的对齐方法以提高生成 RTL 代码的质量。[11 (https://arxiv.org/html/2605.17892#bib.bib11), 12 (https://arxiv.org/html/2605.17892#bib.bib12)] 利用代理系统将复杂的硬件生成任务分解为可管理的子任务,提高了 RTL 生成的准确性。除了代码生成,LLM 在其他 RTL 相关任务中也扮演着关键角色。[13 (https://arxiv.org/html/2605.17892#bib.bib13), 14 (https://arxiv.org/html/2605.17892#bib.bib14), 15 (https://arxiv.org/html/2605.17892#bib.bib15)] 使用 LLM 和符号推理技术优化生成的 RTL 代码,而 [16 (https://arxiv.org/html/2605.17892#bib.bib16), 17 (https://arxiv.org/html/2605.17892#bib.bib17), 18 (https://arxiv.org/html/2605.17892#bib.bib18)] 将 LLM 用于 RTL 调试和验证。这些工作展示了 LLM 在 RTL 生成、优化、调试和验证方面的潜力。它们主要将 RTL 作为生成目标,而 CPPL 研究了一个补充性问题:如何在不需要模型直接生成低级 CIRCT IR 的情况下,向 LLM 暴露编译器级别的硬件设计流程。 ### II\-B 电路 IR 编译器与工具 电路 IR 编译器与工具 (CIRCT) [9 (https://arxiv.org/html/2605.17892#bib.bib9)] 是一个基于多级中间表示 (MLIR) [19 (https://arxiv.org/html/2605.17892#bib.bib19)] 构建的编译器基础设施,用于硬件设计 [20 (https://arxiv.org/html/2605.17892#bib.bib20), 21 (https://arxiv.org/html/2605.17892#bib.bib21), 22 (https://arxiv.org/html/2605.17892#bib.bib22), 23 (https://arxiv.org/html/2605.17892#bib.bib23)]、优化 [24 (https://arxiv.org/html/2605.17892#bib.bib24), 25 (https://arxiv.org/html/2605.17892#bib.bib25)] 和仿真 [26 (https://arxiv.org/html/2605.17892#bib.bib26), 27 (https://arxiv.org/html/2605.17892#bib.bib27)]。CIRCT 提供了核心方言来在统一的抽象层次上表示电路,包括: - • `hw` 方言提供类似函数的语义来表示模块信息和数据类型。例如,`hw.module` 处理模块的细节,而 `hw.instance` 表示这些模块的实例化。 - • `comb` 方言表示 RTL 中的组合组件。例如,`comb.add` 对组合逻辑中的多输入加法器进行建模。 - • `seq` 方言表示时序逻辑。`seq.compreg` 对 CIRCT 中的寄存器进行建模,包含流水值和重置作为输入。`seq` 方言还包括描述存储器行为的存储器类型。 - • `sv` 方言表示 SystemVerilog 的语义。例如,`sv.always` 表示一个 always 块,常用于定义时序逻辑。 CIRCT 的核心方言有效地支持灵活的变换和优化,同时针对不同的后端进行 Verilog 生成、仿真和验证。 ### II\-C CPPL 的动机 第 II\-A 节 (https://arxiv.org/html/2605.17892#S2.SS1) 中讨论的先前关于 LLM 用于 RTL 生成的工作主要遵循端到端范式,即 LLM 直接生成最终的 RTL 代码。这种方法很方便,但作为设计方法论使用时暴露了几个局限性: 1. 生成的 RTL 可能包含语法或工具兼容性错误,这些错误只有在下游编译后才会被发现。 2. 功能行为、位宽一致性和结构层次结构纠缠在一个单一的文本生成任务中,使得故障难以定位。 3. 编译器分析和变换仅在 RTL 生成后应用,因此生成过程很少从类型化 IR、合法性检查和规范编译器优化中受益。 基于编译器的硬件设计流程通过在后端代码生成之前使结构、合法性和类型显式化,解决了许多这些问题。例如,CIRCT 可以将良好的电路 IR 降级为可综合的 Verilog,用于后端 EDA 工具。它还提供了标准的优化流程,包括**常量折叠** (CF)、**死代码消除** (DCE) 和**公共子表达式消除** (CSE),以改进生成的设计。此外,CIRCT IR 遵循源自 LLVM/MLIR 生态系统 [28 (https://arxiv.org/html/2605.17892#bib.bib28)] 的严格类型规范,从而在最终 RTL 生成之前实现早期验证。 基于上述讨论,我们提出了一种编译器介导的生成范式,结合了 LLM 的自然语言和代码生成能力以及 CIRCT 提供的类型化编译流程。我们将此范式称为 **CPPL**(电路提示编程语言),一个在模型生成和 CIRCT 降级之间插入 LLM 友好、可静态检查的电路 IR 的硬件生成框架。CPPL 在后端代码生成之前暴露结构和类型约束,同时仍然允许设计者以高层次表达实现意图。 ### II\-D 在 CPPL 中利用 CIRCT IR 的挑战 尽管 CIRCT 提供了所需的编译器支持,但直接将 CIRCT IR 作为 LLM 输出目标面临几个挑战: 1. 公开可用的 CIRCT IR 示例数据集有限,这使得训练 LLM 理解和生成这种中间表示的代码变得困难。 2. CIRCT 是一个积极开发的项目,其 IR 语法和方言定义不断演变。这使得 LLM 难以保持与特定编译器版本的兼容性。 3. 如 [29 (https://arxiv.org/html/2605.17892#bib.bib29)] 所述,CIRCT IR 使用的静态单赋值 (SSA) 形式可能难以让 LLM 理解和生成。 我们进行了一项性能分析实验,评估 LLM 在端到端生成 Verilog 代码与 CIRCT IR 方面的性能。在此实验中,我们使用系统提示来指示 LLM 生成与我们在第 IV\-A 节 (https://arxiv.org/html/2605.17892#S4.SS1) 中的实验设置兼容的 CIRCT IR。我们使用 RTLLM 基准测试 [5 (https://arxiv.org/html/2605.17892#bib.bib5)] 来评估一组近期商业 LLM(配置细节见第 IV\-A 节 (https://arxiv.org/html/2605.17892#S4.SS1))的 `pass@1` 指标。如图 2 (https://arxiv.org/html/2605.17892#S2.F2) 所示,所有评估的模型在生成 Verilog 代码和 CIRCT IR 之间都表现出明显的性能差距,CIRCT IR 生成的 `pass@1` 得分显著较低。这一结果表明,直接的编译器 IR 路径还不是 LLM 辅助硬件设计的可靠前端。 图 2:Verilog 和 CIRCT IR 在语法正确性上的 `pass@1` 分数差距。 图 3:在 RTLLM 基准测试上,所有评估模型的 CIRCT IR 生成的几何平均错误类型细分。 我们进一步评估了生成 CIRCT IR 中的详细错误类型,并将其分为三个主要类别:违反 MLIR 格式语义(MLIR 语法错误)、使用不支持或不正确的 CIRCT 操作(CIRCT 操作错误)、以及类型系统不匹配(类型错误)。如图 3 (https://arxiv.org/html/2605.17892#S2.F3) 所示,最大的错误类别是 CIRCT 操作错误,表明 LLM 常常无法满足方言特定的操作约束。MLIR 语法错误和类型错误也导致了总体错误率,证实了具体的 IR 格式和编译器类型系统都是具有挑战性的生成目标。 这些挑战促使我们需要一种中间表示,既能保留 CIRCT 所需的编译器可见结构和类型信息,又能以对 LLM 更易生成、对编译器更易验证的形式呈现。 ## III CPPL 框架 图 4:CPPL 框架概览。 在本节中,我们介绍 CPPL 框架。
相似文章
🚀 提示逻辑门(PLG):提示正在成为系统吗?
提示逻辑门(PLG)是一个可视化提示工程实验,它使用语义逻辑门(AND、OR、NOT、提问)来组织提示,以管理类似系统的复杂提示,旨在提高可维护性和一致性。
剪枝、解释与评估:一种基于特征归因的跨层转码器原生高效电路发现框架
研究人员推出了 PIE,这是一种面向跨层转码器(CLT)的原生框架,通过基于特征归因的剪枝技术实现高效的电路发现。该方法在特征选择上实现了约 40 倍的压缩,同时成功保持了 IOI 和 Doc-String 任务的行为保真度。
让LLM上下文组装变得可编程
RAMPART是一个Python库,它使LLM上下文组装变得可编程,允许开发者注册命名的上下文块,并将其放置在模型第一个token之前。通过块聚类和工具访问控制,它在多种模型上将性能提升了数十个百分点。
Nanopass Framework: 简洁编译器构建语言
Nanopass Framework 是一种嵌入在 Scheme 中的领域特定语言,用于通过小的遍历和中间表示来创建编译器,减少样板代码并提高可维护性。
为什么代码有可视化编程,而提示词却没有?
文章提出使用可视化的节点和逻辑门将AI提示视为可执行逻辑,类似于可视化编程语言,并介绍了一个名为Prompt Logic Gates(PLG)的原型。