把大模型当“编译器”用:一句自然语言直接生成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实时对齐

相关推荐
s1hiyu2 小时前
使用Python控制Arduino或树莓派
jvm·数据库·python
ALINX技术博客2 小时前
ALINX 携手 Electra lC 亮相卡塔尔 DIMDEX,共拓 FPGA 全球市场
fpga开发·fpga
子夜江寒2 小时前
基于 OpenCV 的身份证号码识别系统详解
python·opencv·计算机视觉
Gogo8162 小时前
深度解析 GitHub Copilot Agent Skills:如何打造可跨项目的 AI 专属“工具箱”
人工智能·github·copilot
Chef_Chen2 小时前
数据科学每日总结--Day50--机器学习
人工智能·机器学习·支持向量机
火山引擎开发者社区2 小时前
来火山引擎部署Moltbot,9.9元打造私人AI助手
人工智能·火山引擎
twcc_come2 小时前
渗透第二次作业
数据库·oracle
AllData公司负责人3 小时前
【亲测好用】云原生数据平台能力演示
数据库·云原生·开源
一休哥助手4 小时前
2026年1月29日人工智能早间新闻
人工智能