1. 数据类型增强

SystemVerilog新增数据类型:

systemverilog

// 二值逻辑类型
bit a;          // 2值,0/1
byte b;         // 8位有符号
shortint c;     // 16位有符号  
int d;          // 32位有符号
longint e;      // 64位有符号

// 四值逻辑类型
logic f;        // 4值,0/1/x/z(reg的增强版)
integer g;      // 32位有符号

// 其他类型
string str;     // 字符串类型
void;           // 空类型

Verilog只有基本类型:

verilog

reg a;          // 4值逻辑
wire b;         // 网络类型
integer c;      // 32位有符号

2. 进程控制语句

SystemVerilog:

systemverilog

// fork-join变体
fork
    begin : thread1
        #10;
    end
    begin : thread2  
        #20;
    end
join           // 等待所有完成
join_any       // 等待任意一个完成
join_none      // 不等待,继续执行

// 高级同步机制
semaphore sem;
mailbox mb;
event e;

Verilog只有基本的:

verilog

fork
    #10;
    #20;
join  // 必须等待所有完成

3. 面向对象编程

SystemVerilog支持OOP:

systemverilog

class Packet;
    bit [31:0] addr;
    function new();
        addr = 0;
    endfunction
    virtual function void display();
        $display("Addr: %h", addr);
    endfunction
endclass

Packet pkt = new();

Verilog没有类概念。

4. 断言和功能覆盖

SystemVerilog:

systemverilog

// 断言
assert property (@(posedge clk) ready |-> valid);

// 功能覆盖
covergroup cg @(posedge clk);
    coverpoint addr {
        bins low = {[0:100]};
        bins mid = {[101:200]};
    }
endgroup

Verilog没有这些功能。

5. 接口和模块

SystemVerilog接口:

systemverilog

interface bus_if (input clk);
    logic [31:0] data;
    logic valid;
    modport master (output data, valid);
    modport slave (input data, valid);
endinterface

module top;
    bus_if bus(.clk(clk));
    master m1(.bus(bus.master));
    slave s1(.bus(bus.slave));
endmodule

Verilog只能使用端口列表:

verilog

module top(clk, data, valid);
    input clk;
    output [31:0] data;
    output valid;
    // ...
endmodule

6. 数组和结构体

SystemVerilog增强:

systemverilog

// 动态数组
int dyn_arr[] = new[10];

// 关联数组
int assoc_arr[string];

// 队列
int q[$] = {1,2,3};

// 结构体
typedef struct {
    bit [7:0] addr;
    bit [31:0] data;
} packet_t;

packet_t pkt;

Verilog只有固定数组:

verilog

reg [31:0] fixed_arr [0:9];

7. 随机化约束

SystemVerilog:

systemverilog

class Transaction;
    rand bit [31:0] addr;
    rand bit [31:0] data;
    constraint valid_range {
        addr inside {[0:100]};
        data > 0;
    }
endclass

Transaction tr = new();
tr.randomize();

Verilog没有随机化功能。

8. 其他重要区别

特性SystemVerilogVerilog
always块always_comb, always_ff, always_latch只有always
包(package)支持不支持
枚举类型支持不支持
参数化更强大的参数化基本参数化
运算符新增 inside, ->, ++ 等基本运算符

总结

SystemVerilog是Verilog的超集,主要增加了:

  • 验证功能:断言、覆盖、随机化

  • 抽象层次:类、接口、包

  • 数据类型:更丰富的数据类型

  • 进程控制:更灵活的并发控制

在实际项目中,SystemVerilog主要用于验证环境构建,而设计部分仍然常用Verilog风格。

更多推荐