VHDL、Verilog 和 SystemVerilog 比较

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. 三者对比

特性VHDLVerilogSystemVerilog
出现时间1980年代1980年代2000年代
风格Ada/PascalCC/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 主语言

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Are you human? Please solve:Captcha