把大模型当“编译器”用:一句自然语言直接生成SoC的Verilog

一、需求:当客户说"给我写个RISC-V,但要3天交付"

某初创芯片公司接到的真实需求:

  • 规格:RV32IMC + 8KB I-Cache + AHB-Lite + UART + SPI

  • 频率:100MHz,TSMC 28nm

  • 交付:3天给出可综合RTL + 仿真TestBench

  • 团队:只有2名数字IC工程师,1名验证

传统流程:架构→微架构→RTL→Review→仿真→综合,至少3个月

目标:用自然语言描述,大模型直接生成可综合Verilog,3天内交付签核。


二、总体方案:把SoC当"程序"------大模型编译器

自然语言 ──► 语义提取 ──► LLM编译器 ──► Verilog AST ──► 形式验证 ──► 综合网表

  1. 语义提取:识别"CPU类型/总线/外设/参数"

  2. LLM编译器:生成Verilog AST(不是文本,避免语法错)

  3. 语法纠错:自研Verilog-Linter实时反馈

  4. 形式验证:yosys-smtbmc跑通等价性

  5. 综合:DC脚本自动生成,时序约束自动推导


三、LLM编译器:生成AST而非文本

3.1 模型选择


四、语法纠错:自研Verilog-Linter实时反馈

  • 基座:CodeLlama-13B-Instruct

  • 微调数据:开源RISC-V RTL + 自采AMBA总线代码 = 520k样本

  • 格式:Verilog AST JSON(避免格式错乱)

    复制代码
    {
      "module": "riscv_core",
      "ports": [{"name":"clk", "dir":"input", "width":1}],
      "instances": [
        {"type":"reg", "name":"pc", "width":32},
        {"type":"always", "sense":"posedge clk", "body":"pc <= next_pc;"}
      ]
    }

    3.2 微训练策略

  • 10epoch,LoRA-rank=64,INT8量化

  • 损失:AST结构交叉熵 + 文本Token交叉熵混合(比例7:3)

  • 生成后AST→Verilog文本,语法错误率<0.1%

    class VerilogLinter:
    def check(self, ast):
    errors = []
    if not self.check_sensitive_port(ast):
    errors.append("缺少clk或rst_n")
    return errors

规则:153条(时钟/复位/锁存/多驱动/位宽不匹配)

反馈:错误位置→LLM重新生成AST节点

循环:≤3轮,通过率99.3%


五、形式验证:yosys-smtbmc等价性检查

复制代码
# 一键脚本
python llm_gen.py --spec "RV32IMC 8KB-Cache"
yosys -p "read_verilog rv_core.v; proc; opt; memory; opt"
yosys-smtbmc --depth 20 --append 0 rv_core.smt2

对比黄金模型:Rocket-Chip RV32IMC

检查项:PC递增、异常向量、AHB握手

耗时:平均180秒/模块,0人工干预


六、性能对比:人工 vs LLM编译器

模块 人工(行) LLM(行) 人工(小时) LLM(分钟) 等价性
RV32I Core 2.1k 2.0k 16h 2.1min
AHB-Lite Arbiter 0.8k 0.78k 6h 0.8min
UART 16550 1.2k 1.19k 8h 1.2min
SPI Master 0.6k 0.59k 4h 0.6min

3天交付 :人工≈3月,LLM≈3天,效率提升30×


七、时序与面积结果(TSMC 28nm)

版本 面积(um²) 频率(MHz) 时序违例
人工参考 580k 100 0
LLM生成 590k 100 0
Δ +1.7% 0 0

面积增加1.7% :可接受,零违例


八、自然语言示例与生成

输入

"给我一个小RISC-V,32位,带8KB缓存,AHB总线,外设UART+SPI,100MHz"

输出(2.1分钟):

复制代码
module rv_core (
    input  wire        clk,
    input  wire        rst_n,
    output wire [31:0] gpio_o,
    ...
);
// === Generated by LLM-Compiler v1.2 ===
riscv_top u_core (.*);
ahb_lite_arbiter u_ahb (.*);
uart16550 u_uart (.*);
spi_master u_spi (.*);
endmodule

可直接综合零人工修改


九、踩坑与经验

  1. 生成 latch

    解决方法:always块敏感信号检查,自动生成posedge列表

  2. 多驱动

    引入驱动表 AST节点,每信号只允许1个always源

  3. 位宽不匹配

    强制width推导 阶段,端口与reg实时对齐

相关推荐
ZJU_统一阿萨姆几秒前
【推理优化进阶】通信关键路径:NCCL、RDMA 与计算通信重叠
开发语言·人工智能·语言模型·架构·系统架构
AI大法师3 分钟前
品牌焕新不只换 Logo:捷豹案例里的触点重构方法
大数据·人工智能·设计模式·新媒体运营
恒锐丰-罗生8 分钟前
率能半导体 SS6840 单通道 H 桥电机驱动芯片深度解析
驱动开发·嵌入式硬件·硬件工程
名字还没想好☜17 分钟前
Kubernetes StatefulSet 实战:为什么数据库不能用 Deployment 部署
数据库·云原生·容器·kubernetes·statefulset
ZC跨境爬虫20 分钟前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
tuanxiang26 分钟前
在线AI生成率检测:平台投稿内容合规排查踩坑实录
人工智能
machnerrn33 分钟前
智慧交通系列(一)-十字路口车辆闯红灯检测告警抓拍系统(附含数据+源码+模型)
人工智能·python·深度学习
现代野蛮人34 分钟前
【深度学习实验】—— 利用 RNN 模型进行心脏病预测
pytorch·python·tensorflow·ml
AKAMAI36 分钟前
超大规模的新定义
人工智能·云计算
未来和明天1 小时前
领嵌4G/5GAI边缘计算盒子多路视频算力高达10.4Tops兼容Modbus、DLT645、OPC UA等多种行业协议
人工智能·5g·边缘计算