近年来,随着大语言模型的出现,自然语言处理领域见证了范式转变。这些模型在各种语言任务中展示了前所未有的能力。受这一显着进展的启发,硬件设计领域的研究人员开始探索大语言模型在彻底改变硬件开发方法方面的潜力。
在各种应用中,基于生成式模型的寄存器传输级设计自动生成已成为一个特别有前途和广泛研究的方向。这项任务旨在将自然语言中的高级功能描述转换为成熟的硬件描述语言代码,例如 Verilog。
当前的绝大部分工作集中在 prompt 和流程设计上,利用商业大语言模型如 GPT 等生成 verilog 代码。商业大语言模型的使用虽然提供了对强大语言处理能力的即时访问,但本质上限制了特定领域任务(如寄存器传输级生成)的定制和适应程度。
此外,在硬件设计自动化领域,采用开源大语言模型开源解决方案解决了关键的数据隐私问题。
然而,现有的开源模型依赖于数据集质量的简单的预训练和微调方法。这些简单、标准的方法难以高效激发模型的代码生成生成能力。为了解决这些限制,迫切需要探索能够有效利用有限数据资源的更复杂的方法,从而推进开源寄存器传输级生成领域的发展。
基于此,香港城市大学的一支课题组希望针对芯片产业,设计出一个多智能体的大语言系统加速产业的全流程。他们认为,一个能力很强的 Verilog 代码生成的基础大语言模型是其他任务如 debug、代码总结等任务的必要条件。
他们按照目前大语言模型训练的标准流程,即按照领域内 continue pre-training 与 prompt fine-tuning 的步骤来进行初步的实验。他们发现,虽然 continual pre-training 可以很好提升模型的表达能力,但是即使 fine-tuning 往往起到相反的作用。
一开始他们以为是数据集质量和覆盖的问题,于是花了很多时间在润色微调数据集上。然而之后在这些高质量的数据集上,他们进行的各种超参设置下的指令微调实验的效果仍然不好,因此他们觉得问题的关键点可能在 Verilog 语言的特性上。
Verilog 语言作为硬件描述语言,其与软件编程语言最大的不同在于其函数执行是并行的:它旨在描述数字电路的结构和行为,而数字电路本质上是并行运行的。这就导致顺序生成的生成式指令微调很难捕捉到正确的 Verilog 语义,因此他们认为需要用一个相对全局的评价损失函数去指导模型的学习。
自从 InstructGPT 提出以来,强化学习作为对齐模型与人类偏好的一个人重要方法被广泛的研究。强化学习通过奖励函数或模型衡量模型在给定指令下的表现,并指导模型向得分更高的方向前进。
在设计奖励函数时,另一个需要考虑的问题就是函数的功能与代码之间的映射并不唯一。给定一个模块的描述,他们可以设计出相当多的具体代码实现:包括变量名的变化、信号的操作顺序等等。
为了比较同一模块的不同变体,他们提取代码片段的抽象语法树(AST,Abstract Syntax Tree),比较两个数的距离来赋予模型奖励并进行 PPO 训练。
这种方法有效避免了基于文本的对比方法的不灵活,同时可以从全局的角度帮助模型理解 Verilog 代码。使用这种强化学习的策略,他们的 Verilog 生成模型取得了目前的 SOTA 效果。
在应用前景上,语言模型可以根据高级描述或规格说明自动生成 Verilog 代码。这将大大提高硬件设计的效率,尤其是对于一些常见的模块或结构。
设计师只需提供功能描述,AI 就能生成相应的 Verilog 代码。大语言模型也可以帮助识别 Verilog 代码中的潜在错误或设计缺陷,提供智能化的调试建议,加速开发过程。
目前的强化学习的训练过程非常不稳定,他们后续正在研究如何设计更稳定的损失函数以及数据集。