近期在 FPGA 设计中,尝试利用 AI 生成状态机代码。向多个主流大模型发送了需求:"请用 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
endmodule
这段代码看着像模像样,但根本跑不通。问题比比皆是:
baud_rate和half_baud_rate根本没定义;data_out[bit_cnt] <= rx是在任意时刻赋值,而不是在采样点;- 状态跳转逻辑混乱,缺少关键延时控制;
- 更致命的是:没有跨时钟域处理,没有去抖动,没有边沿检测。
这哪是 AI 写代码?这是在给我挖坑!
二、为什么 AI 写的 HDL 代码总是'看起来对,实际不能用'?
这不是你提问方式的问题,而是 AI 本身不适合生成硬件描述语言(HDL)的根本原因。
我们来拆解三个核心痛点:
1. HDL ≠ 软件语言:AI 训练数据严重偏向软件逻辑
目前主流大模型的训练语料主要来自 GitHub 上的 Python/C++ 项目、Stack Overflow 问答及开源文档。而 Verilog/VHDL 这类小众、专业、强约束的语言,在训练集中占比极低。更重要的是:
Verilog 不是'执行流程',而是'电路结构'的描述。
但 AI 习惯了'顺序思维'——比如看到'if 判断 → 执行动作',就会模仿写出类似软件的逻辑分支,却忽略了:
- 组合逻辑与时序逻辑的区别
- 并行性(所有 always 块同时运行)
- 信号延迟、建立保持时间等物理特性
结果就是:AI 写出的代码像是'软件模拟器',而非可综合的硬件模块。


