一、需求:当客户说"给我写个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 ──► 形式验证 ──► 综合网表
-
语义提取:识别"CPU类型/总线/外设/参数"
-
LLM编译器:生成Verilog AST(不是文本,避免语法错)
-
语法纠错:自研Verilog-Linter实时反馈
-
形式验证:yosys-smtbmc跑通等价性
-
综合: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
可直接综合 ,零人工修改
九、踩坑与经验
-
生成 latch
解决方法:always块敏感信号检查,自动生成posedge列表
-
多驱动
引入驱动表 AST节点,每信号只允许1个always源
-
位宽不匹配
强制width推导 阶段,端口与reg实时对齐