一个能生成Verilog代码的大模型

关注、星标公众号,精彩内容每日送达
来源:网络素材

来源:内容编译自techxplore。

纽约大学坦登工程学院的研究人员创建了 VeriGen,这是第一个成功训练生成 Verilog 代码的专用人工智能模型,Verilog 代码是一种描述芯片电路如何运作的编程语言。

该研究刚刚获得了 ACM 电子系统设计自动化学报 2024 年度最佳论文奖,肯定了它在自动化创建传统上需要深厚技术专业知识的硬件描述语言方面的重大进步。

“通用人工智能模型不太擅长生成 Verilog 代码,因为互联网上可供训练的 Verilog 代码非常少,”该研究的主要作者、纽约大学坦顿分校电气与计算机工程系 (ECE) 教授 Siddharth Garg 表示。Garg 教授同时还在纽约大学无线项目和纽约大学网络安全中心 (CCS) 任教。“这些模型在 GitHub 上表现良好的编程语言(例如 C 和 Python)上往往表现良好,但在 Verilog 等表现较差的语言上表现往往要差得多。”

与Garg一起,由纽约大学坦顿分校博士生、博士后研究员以及教员Ramesh Karri和Brendan Dolan-Gavitt组成的团队通过创建并发布迄今为止规模最大的Verilog代码AI训练数据集,成功应对了这一挑战。他们从GitHub公共存储库中收集了约5万个Verilog文件,并补充了70本Verilog教科书的内容。这一数据收集过程需要仔细筛选和去重,以创建高质量的训练语料库。

为了获得最强大的模型,研究人员随后对 Salesforce 的开源 CodeGen-16B 语言模型进行了微调,该模型包含 160 亿个参数,最初针对自然语言和编程代码进行了预训练。

计算需求巨大。训练需要三块 NVIDIA A100 GPU 并行工作,仅模型参数就消耗了 30 GB 内存,而整个训练过程则需要大约 250 GB 的 GPU 内存。

这个经过微调的模型在测试中表现出色,在规模缩小一个数量级且完全开源的情况下,其性能超越了目前市面上最先进的商业模型。在评估中,经过微调的 CodeGen-16B 实现了 41.9% 的功能正确率,而商用 Code-davinci-002 模型的功能正确率仅为 35.4%——微调后准确率仅从 1.09% 提升至 27%,充分展现了领域特定训练的显著优势。

“我们已经证明,通过针对你关注的特定任务对模型进行微调,你可以将模型规模大幅缩减,”Garg 指出,并强调了他们的方法如何提高准确性和效率。较小的规模使得模型能够在标准笔记本电脑上运行,而无需专门的硬件。

该团队评估了 VeriGen 在一系列日益复杂的硬件设计任务中的能力,从基础的数字组件到先进的有限状态机。尽管 VeriGen 仍不完美——尤其是在应对最复杂的挑战时——但它相比通用模型表现出了显著的改进,尤其是在生成语法正确的代码方面。

此项工作的意义已得到业界的认可,NVIDIA 随后在 2025 年开展的研究将 VeriGen 评为基于 LLM 的 Verilog 生成最早、最重要的基准之一,有助于为 AI 辅助硬件设计的快速发展奠定基础。

该项目的开源特性已经引发了该领域的极大兴趣。虽然 VeriGen 是该团队在 ACM 论文中提出的第一个模型,但他们后来开发了一个名为“CL Verilog”的改进模型系列,其性能更加出色。

这些较新的模型已提供给高通和恩智浦等硬件公司,用于评估其潜在的商业应用。这项工作以纽约大学坦顿分校早期的研究成果为基础,包括2020年的DAVE(从英语自动导出Verilog语言)项目,该项目通过对语言模型进行大规模微调,创建了更全面的解决方案,从而推动了该领域的发展。

VeriGen 是对纽约大学坦顿分校其他旨在实现硬件民主化的人工智能辅助芯片设计计划的补充:他们的Chip Chat 项目创造了第一个通过与 GPT-4 的自然语言对话设计的功能性微芯片;由美国国家科学基金会 (NSF) 研究培训计划支持的 Chips4All,为不同的 STEM 研究生提供芯片设计培训;由 NSF 的新兴和新技术体验式学习计划资助的 BASICS,向非 STEM 专业人士教授芯片设计。

参考链接

https://techxplore.com/news/2025-06-ai-specialized-chip-language.html

(全文完)

声明:我们尊重原创,也注重分享;文字、图片版权归原作者所有。转载目的在于分享更多信息,不代表本号立场,如有侵犯您的权益请及时联系,我们将第一时间删除,谢谢!

图片

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

以下是一个基于Verilog的SD卡模型的示例代码,包括了模拟SD卡的读写操作,可以通过仿真验证其他模块与SD卡模型的交互是否正确: ```verilog module sd_card( input clk, // 时钟信号 input rst, // 复位信号 input [7:0] cmd, // SD卡指令信号 input [31:0] data_in, // SD卡数据输入信号 output reg [31:0] data_out, // SD卡数据输出信号 output reg busy, // SD卡忙信号 output reg error // SD卡错误信号 ); // 状态定义 parameter IDLE_STATE = 2'b00; parameter COMMAND_STATE = 2'b01; parameter RESPONSE_STATE = 2'b10; // SD卡指令定义 parameter GO_IDLE_STATE = 8'h40; parameter SEND_OP_COND = 8'h41; parameter SEND_IF_COND = 8'h48; parameter SEND_CSD = 8'h49; parameter SEND_CID = 8'h4a; parameter SEND_STATUS = 8'h4d; parameter READ_BLOCK = 8'h51; parameter WRITE_BLOCK = 8'h58; parameter APP_CMD = 8'h77; parameter READ_OCR = 8'h7a; // 内部寄存器定义 reg [7:0] state; reg [7:0] sd_cmd; reg [31:0] sd_data_in; reg [31:0] sd_data_out; reg [31:0] crc; // 初始化状态 initial begin state <= IDLE_STATE; sd_cmd <= 0; sd_data_in <= 0; sd_data_out <= 0; crc <= 0; busy <= 0; error <= 0; end // 状态机 always @(posedge clk) begin case (state) // 空闲状态 IDLE_STATE: begin if (cmd == GO_IDLE_STATE) begin busy <= 1; state <= COMMAND_STATE; end end // 发送指令状态 COMMAND_STATE: begin // 发送SD卡指令 // ... sd_cmd <= cmd; sd_data_in <= data_in; busy <= 1; state <= RESPONSE_STATE; end // 等待响应状态 RESPONSE_STATE: begin // 等待SD卡响应 // ... if (sd_cmd == READ_BLOCK) begin // 读取数据块 // ... sd_data_out <= data_out; end else if (sd_cmd == WRITE_BLOCK) begin // 写入数据块 // ... sd_data_out <= 0; end busy <= 0; state <= IDLE_STATE; end endcase end endmodule ``` 此代码实现了一个简单的SD卡模型,可以模拟SD卡的读写操作,验证其他模块与SD卡模型的交互是否正确。需要注意的是,实际使用时还需要根据SD卡的具体规范进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值