VHDL、Verilog 和 SystemVerilog 都属于硬件描述语言(HDL, Hardware Description Language),主要用来描述数字电路,例如 FPGA、ASIC 中的寄存器、状态机、流水线、接口控制器、图像处理模块等。
它们表面上像“编程语言”,但本质上不是在描述“CPU 按顺序执行什么指令”,而是在描述:
电路由什么组成、信号之间是什么关系、这些电路如何并行工作。
对于 FPGA 实时图像处理项目,其暗场/增益校正、坏点处理、图像拼接、滤波、JTAG 控制等模块,都可以使用这三种语言实现。
1. VHDL
VHDL 全称:
VHSIC Hardware Description Language
其中 VHSIC 是:
Very High Speed Integrated Circuit
VHDL 最早由美国国防部推动发展,后来成为 IEEE 标准。
它最大的特点是:
语法严谨、类型检查严格、代码比较冗长。
例如一个简单的 AND 门:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity and_gate is
Port (
a : in STD_LOGIC;
b : in STD_LOGIC;
y : out STD_LOGIC
);
end and_gate;
architecture Behavioral of and_gate is
begin
y <= a and b;
end Behavioral;
这里可以看到,VHDL 会明确区分:
- entity:模块接口
- architecture:模块内部实现
- 输入输出方向
- 信号类型
因此它有一点像 Ada,甚至有一些 Pascal 的感觉。
VHDL 的优点
最大的优点是严谨。
比如不同位宽、不同数据类型之间不能随意运算。这在大型 FPGA、航空航天、军工、工业控制项目中反而是优点,因为编译器可以较早发现很多潜在错误。
例如:
signal a : std_logic_vector(7 downto 0);
signal b : unsigned(7 downto 0);
这两个虽然都是 8 bit,但类型不同,很多操作需要显式转换。
这种“麻烦”实际上提高了工程安全性。
缺点
代码相对长。
同样一个模块,VHDL 可能需要写 30 行,而 Verilog 可能 15 行就完成了。
所以目前新项目中,尤其商业 ASIC 和大量 FPGA 项目,VHDL 的占比总体低于 Verilog/SystemVerilog。
不过在欧洲、航空航天、军工以及一些传统 FPGA 团队里,VHDL 仍然非常常见。
2. Verilog
Verilog 是目前最经典、最常见的 HDL 之一。
它最早由 Gateway Design Automation 开发,后来成为 IEEE 标准。
如果说 VHDL 类似:
Ada / Pascal
那么 Verilog 的风格更接近:
C 语言
同样一个 AND 门:
module and_gate (
input wire a,
input wire b,
output wire y
);
assign y = a & b;
endmodule
明显比 VHDL 简洁。
Verilog 最大的优势就是:
简单、直观、容易上手。
因此在 FPGA 和 ASIC 行业中非常流行。
3. Verilog 描述的不是软件流程
例如:
assign y = a & b;
assign z = c | d;
不要理解成:
先算 y
再算 z
实际上综合以后会变成两个独立电路:
a ─┐
AND ─── y
b ─┘
c ─┐
OR ──── z
d ─┘
它们是:
同时运行的。
这是学习 FPGA 时非常重要的思维转变。
软件通常是:
指令1
↓
指令2
↓
指令3
FPGA HDL 描述的是:
电路A ──┐
电路B ──┼── 同时工作
电路C ──┘
4. Verilog 中最重要的两种描述方式
例如组合逻辑:
assign y = a & b;
或者:
always @(*) begin
y = a & b;
end
而时序逻辑,例如寄存器:
always @(posedge clk) begin
q <= d;
end
综合以后基本就是:
┌───────┐
D ───────►│ D Q │────── Q
│ DFF │
CLK ─────►│ > │
└───────┘
所以:
always @(posedge clk)
基本可以理解为:
“在 FPGA 里面生成由时钟驱动的时序电路。”
5. SystemVerilog
SystemVerilog 可以理解成:
Verilog 的大幅增强版。
实际上今天进行新的 FPGA / ASIC 项目时,如果工具链支持,通常更推荐直接使用 SystemVerilog,而不是老的 Verilog。
关系大致是:
Verilog
│
│ 大幅扩展
▼
SystemVerilog
SystemVerilog 不仅增加了很多 RTL 设计功能,还增加了一整套芯片验证语言功能。
所以它实际上同时承担两个角色:
SystemVerilog
│
├── RTL设计
│
└── 芯片验证
6. SystemVerilog 比 Verilog 强在哪里?
例如 Verilog 中:
reg [7:0] data;
wire ready;
SystemVerilog 引入了非常实用的:
logic [7:0] data;
logic ready;
很多场景下不再需要纠结:
reg
还是
wire
直接使用:
logic
即可。
always_comb
Verilog:
always @(*) begin
y = a & b;
end
SystemVerilog:
always_comb begin
y = a & b;
end
后者语义更清晰:
这是组合逻辑。
always_ff
Verilog:
always @(posedge clk) begin
q <= d;
end
SystemVerilog:
always_ff @(posedge clk) begin
q <= d;
end
明确告诉工具:
这是触发器逻辑。
因此更容易发现设计错误。
7. SystemVerilog 对状态机特别友好
例如传统 Verilog 状态机可能写成:
parameter IDLE = 2'b00;
parameter RUN = 2'b01;
parameter DONE = 2'b10;
reg [1:0] state;
SystemVerilog 可以:
typedef enum logic [1:0] {
IDLE,
RUN,
DONE
} state_t;
state_t state;
明显更接近现代编程语言。
而 FPGA 设计中,状态机极其常见,例如:
IDLE
↓
WAIT_TRIGGER
↓
CAPTURE
↓
PROCESS
↓
TRANSFER
↓
DONE
X 光探测器的采集控制器就很可能存在这样的状态机。
8. SystemVerilog 的 struct
SystemVerilog 还支持结构体。
例如描述像素:
typedef struct packed {
logic [15:0] pixel;
logic valid;
logic bad_pixel;
} pixel_t;
然后:
pixel_t pixel_data;
相比传统 Verilog 分别定义:
reg [15:0] pixel;
reg valid;
reg bad_pixel;
大型工程中结构会清晰很多。
9. SystemVerilog 的 Interface
这是 SystemVerilog 很强的功能。
例如 FPGA 模块之间可能有:
data
valid
ready
last
clk
reset
传统 Verilog 每个模块都需要写:
input [15:0] data;
input valid;
output ready;
...
SystemVerilog 可以定义一个接口:
interface pixel_if;
logic [15:0] data;
logic valid;
logic ready;
endinterface
然后多个模块直接使用这个 interface。
对于大型 FPGA 图像流水线:
ADC
↓
Dark Correction
↓
Gain Correction
↓
Bad Pixel
↓
Filter
↓
Stitch
↓
DDR / PCIe
这种方式尤其好用。
10. SystemVerilog 还有非常强的验证能力
SystemVerilog 不仅能设计 FPGA/ASIC,还可以写 Testbench。
例如:
initial begin
a = 0;
b = 0;
#10;
a = 1;
b = 1;
end
还支持:
class
randomize
constraint
assertion
coverage
interface
mailbox
这些功能已经远远超出了传统 HDL。
因此现代 ASIC 验证体系:
SystemVerilog
+
UVM
几乎已经成为行业事实标准之一。
11. 三者关系
可以简单理解为:
Hardware Description Language
HDL
│
┌────────────┴────────────┐
│ │
VHDL Verilog
│
│ 扩展
▼
SystemVerilog
SystemVerilog 基本向下兼容 Verilog。
因此很多 .v 文件可以比较容易迁移到:
.sv
SystemVerilog 项目中。
12. 三者对比
| 特性 | VHDL | Verilog | SystemVerilog |
|---|---|---|---|
| 出现时间 | 1980年代 | 1980年代 | 2000年代 |
| 风格 | Ada/Pascal | C | C/C++ |
| 代码量 | 较大 | 小 | 小 |
| 类型检查 | 很严格 | 较弱 | 较强 |
| 学习难度 | 较高 | 较低 | 中等 |
| RTL设计 | 强 | 强 | 很强 |
| Testbench | 可以 | 可以 | 非常强 |
| 面向对象 | 否 | 否 | 是 |
| Assertion | 有限 | 有限 | 强 |
| UVM | 不适用 | 不适用 | 标准语言 |
| FPGA | 常见 | 很常见 | 越来越常见 |
| ASIC | 较少 | 很常见 | 主流 |
13. 今天应该学哪个?
如果是现在开始 FPGA 开发,我比较建议:
优先学习 SystemVerilog。
学习顺序可以是:
数字电路基础
↓
SystemVerilog RTL
↓
组合逻辑
↓
时序逻辑
↓
FSM
↓
FIFO / RAM
↓
流水线
↓
AXI / Avalon
↓
Testbench
但有一点值得注意。
很多 FPGA 厂商官方示例以及历史代码仍然大量使用:
Verilog
所以实际上学习 SystemVerilog 时,也就顺便掌握了绝大部分 Verilog。
因此推荐:
SystemVerilog
↓
自然兼容 Verilog 阅读能力
而不是:
先花很久学 Verilog
再重新学 SystemVerilog
14. 那 VHDL 要不要学?
如果你所在公司已有大量:
.vhd
代码,当然应该学。
否则对于一个新启动的 FPGA 项目,我通常不会优先推荐 VHDL。
但至少应该达到:
能阅读 VHDL。
因为 FPGA IP、第三方 IP、老项目里经常会遇到:
Verilog
SystemVerilog
VHDL
混合工程。
Vivado、Quartus 等工具都支持这种 mixed-language design。
15. 总结
可以用一句话概括三者:
VHDL:严谨的传统工程派;Verilog:简洁经典的 HDL;SystemVerilog:现代 Verilog + 强大的设计与验证能力。
如果是 2026 年新建一个 FPGA 项目,特别是你这个涉及实时采集、图像流水线、DDR 和高速接口的 X 光探测器项目,我会优先选择 SystemVerilog 作为 RTL 主语言。