为什么AI给我写的Verilog代码很糟?

为什么AI给我写的Verilog代码很糟?

最近我在做FPGA设计时,突发奇想:能不能让AI帮我写一段状态机?

于是我把需求发给了DeepSeek、通义千问、甚至GPT-4o:

“请用Verilog写一个三段式状态机,实现串行数据接收器,波特率9600,8位数据,1位停止位。”

结果……我差点被仿真波形气哭。


一、AI生成的Verilog代码长什么样?

这是我收到的第一版“AI作品”:

module uart_rx( input clk, input rst_n, input rx, output reg [7:0] data_out, output reg valid ); reg [3:0] state; parameter IDLE = 4'd0; parameter START = 4'd1; // ...后面省略了几个状态 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= IDLE; data_out <= 0; valid <= 0; end else begin case (state) IDLE: if (rx == 0) begin state <= START; counter <= 0; end START: begin counter++; if (counter == half_baud_rate) begin // 错误1:变量未定义 state <= DATA_RECV; bit_cnt <= 0; end end DATA_RECV: begin if (counter == baud_rate) begin data_out[bit_cnt] <= rx; // 错误2:这里应该是采样点后的值! bit_cnt++; counter <= 0; if (bit_cnt == 7) state <= STOP; // 错误3:只收7位? end counter++; end endcase end end // 没有对rx信号消抖、没有中点采样、没有同步处理…… endmodule 

这段代码看着像模像样,但根本跑不通。问题比比皆是:

  • baud_rate 和 half_baud_rate 根本没定义;
  • data_out[bit_cnt] <= rx 是在任意时刻赋值,而不是在采样点;
  • 状态跳转逻辑混乱,缺少关键延时控制;
  • 更致命的是:没有跨时钟域处理,没有去抖动,没有边沿检测

这哪是AI写代码?这是在给我挖坑!


二、为什么AI写的HDL代码总是“看起来对,实际不能用”?

这不是你提问方式的问题,而是AI本身不适合生成硬件描述语言(HDL)的根本原因

我们来拆解三个核心痛点:

🔹 1. HDL ≠ 软件语言:AI训练数据严重偏向软件逻辑

目前主流大模型(包括DeepSeek、GPT系列)的训练语料主要来自:

  • GitHub上的Python/C++项目
  • Stack Overflow问答
  • 开源文档和博客

而Verilog/VHDL这类小众、专业、强约束的语言,在训练集中占比极低。更重要的是:

💡 Verilog不是“执行流程”,而是“电路结构”的描述。

但AI习惯了“顺序思维”——比如看到“if判断 → 执行动作”,就会模仿写出类似软件的逻辑分支,却忽略了:

  • 组合逻辑与时序逻辑的区别
  • 并行性(所有always块同时运行)
  • 信号延迟、建立保持时间等物理特性

 结果就是:AI写出的代码像是“软件模拟器”,而非可综合的硬件模块


🔹 2. 缺乏上下文感知能力:AI不懂“设计意图”背后的工程权衡

举个例子:

你要实现一个 FIFO,你会考虑:

  • 同步还是异步?
  • 是否需要满/空标志?
  • 地址指针如何格雷码编码避免亚稳态?

但AI只会根据关键词匹配模板,输出一个“看起来像FIFO”的东西,可能连双端口RAM都没例化。

更可怕的是,它会“自信地编造”不存在的IP核或系统函数:

// AI生成的离谱代码

这类错误在C语言里很少见,但在Verilog中高频出现——因为HDL允许用户自定义行为级建模,AI就以为可以随便发明函数。


🔹 3. 时序逻辑理解薄弱:AI分不清“什么时候该触发”

这是最致命的一点。

看下面这个经典错误:

always @(posedge clk) begin

你以为没问题?错!在这个块里,start_flag会在每个上升沿都被重新判断一次,导致误触发。

正确的做法是引入两级寄存器打拍 + 边沿检测独立模块。

但AI往往不会意识到:输入信号必须先同步再使用,否则会造成亚稳态。

而这恰恰是数字前端工程师的基本功。


三、真实案例对比:人类 vs AI 写的状态机

项目

人类工程师

AI生成

状态转移

明确条件判断,带防漏路径

条件缺失,default缺失

输出逻辑

三段式状态机,分离组合/时序

两段式,易产生毛刺

可综合性

完全可综合,资源优化

包含不可综合结构

异常处理

加入超时恢复机制

完全没有容错

📌 结论:AI能写出“语法正确”的Verilog,但写不出“工程可用”的Verilog。


四、那我们还能不能用AI写Verilog?当然能!关键是——怎么用!

别急着否定AI,我们要做的是把AI从“代码生成器”变成“辅助助手”

以下是我在实践中总结出的高效使用AI写HDL的五步法


✅ 第一步:明确任务边界,不要让AI“自由发挥”

❌ 错误提问:

“帮我写个UART模块。”

✅ 正确提问:

“请用Verilog写一个同步FIFO,深度16,宽度8bit,输入输出共用同一个时钟。要求有full和empty标志位,使用格雷码比较判断满空状态。不要使用IP核,纯逻辑实现。”

越具体,AI越不容易“脑补”。


✅ 第二步:分模块提问,拒绝“一键生成整个系统”

把复杂系统拆成小模块,逐个让AI协助:

  1. 先让AI写计数器
  2. 再写状态机框架
  3. 最后整合接口

这样既能控制质量,又能方便调试。


✅ 第三步:强制要求“可综合语法”,规避行为级描述

可以在提示词中加入:

“请确保代码符合IEEE 1364标准,仅使用可综合的Verilog语法,避免initial块、延迟控制(#1)、系统任务如$display。”

✅ 第四步:人工审查六大关键点(必做!)

每次拿到AI生成代码后,请务必检查:

检查项

常见AI错误

1. 时钟域处理

忽视异步信号同步

2. 复位策略

混合同步/异步复位

3. 状态机编码

使用二进制编码而非one-hot/格雷码

4. 输出锁存

缺少default导致latch推断

5. 信号命名

不规范,无前缀区分

6. 注释与文档

几乎为零

建议搭配工具:Synplify / Vivado 综合查看是否报warning。


✅ 第五步:用AI做“解释者”和“学习伙伴”,而非“代笔者”

与其让它写代码,不如问:

  • “三段式状态机相比两段式有哪些优势?”
  • “如何用格雷码判断异步FIFO的满空状态?”
  • “跨时钟域传输多位信号时为什么要用握手协议?”

你会发现,AI在解释原理方面非常强大,远胜于盲目生成代码。


五、未来展望:AI真的能取代数字IC工程师吗?

短期来看,不可能。

HDL开发的本质是:

将抽象需求转化为物理可实现的电路结构,并在面积、功耗、时序之间做出权衡。

这种能力依赖于:

  • 扎实的数字电路基础
  • 对工艺库和综合工具的理解
  • 长期的项目经验积累

而这些,正是你们现在在学校里应该打牢的地基。

AI可以帮你加速原型验证、生成测试激励、解释复杂概念,但它无法替代你按下“Run Simulation”那一刻的紧张与期待。


写在最后:善用工具,但别交出思考的权利

同学们,我们这一代电子人正站在技术变革的十字路口。

AI不是敌人,也不是救世主。

它是锤子,是尺子,是示波器——但操作仪器的人,必须是你自己。

下次当你想让AI写Verilog时,请先问自己:

“我是否已经清楚地知道这个模块该怎么设计?”

如果答案是否定的,那就先翻开《数字系统设计与Verilog》课本,搞懂原理。

然后再让AI当你的“实习生”,而不是“老板”。


互动话题
你在用AI写Verilog时踩过哪些坑?欢迎留言区分享


参考资料:
[1] 清华大学《基于大模型的硬件设计自动化研究》https://hub.baai.ac.cn/paper/d83d55db-cb94-4d12-a290-0c51394fe9a9
[2] 腾讯新闻《当AI开始写芯片代码》https://news.qq.com/rain/a/20250606A031NP00
[3] Clifford E. Cummings, Simulation and Synthesis Techniques for Asynchronous FIFO Design


✅ 如果你觉得这篇文章有价值,请转发给更多电类同学。我们一起成长,不做AI的提线木偶,而要做驾驭AI的工程师。

Read more

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk