为什么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生成的离谱代码wire [7:0] result = $fft_core(data_in); // 哪来的$fft_core??
这类错误在C语言里很少见,但在Verilog中高频出现——因为HDL允许用户自定义行为级建模,AI就以为可以随便发明函数。
🔹 3. 时序逻辑理解薄弱:AI分不清“什么时候该触发”
这是最致命的一点。
看下面这个经典错误:
always @(posedge clk) beginif (rx == 1'b0 && prev_rx == 1'b1) // 检测下降沿start_flag = 1;prev_rx = rx;end
你以为没问题?错!在这个块里,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协助:
-
先让AI写计数器
-
再写状态机框架
-
最后整合接口
这样既能控制质量,又能方便调试。
✅ 第三步:强制要求“可综合语法”,规避行为级描述
可以在提示词中加入:
“请确保代码符合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的工程师。
更多推荐


所有评论(0)