SystemVerilog 概述及应用领域
SystemVerilog 是用于系统级验证、芯片设计与 FPGA 实现的强大硬件描述语言。它在 Verilog 的基础上扩展了高级语言结构,如类、接口、任务和函数,显著优化了验证流程。本教程将深入讲解其基础概念、结构化编程元素、并发与同步机制,以及现代验证方法学的应用。
SystemVerilog 基础数据类型和结构
基本数据类型
SystemVerilog 提供了丰富且灵活的数据类型,相比传统 HDL 在表达能力上有了显著提升。
- 逻辑类型 (logic):替代了传统的 wire 和 reg,适用于组合逻辑和时序逻辑。
- 整数类型:包括 int、shortint、longint 等,支持有符号和无符号。
- 实数类型:使用 real 和 realtime 表示浮点数,常用于模拟中的时间控制。
- 字符串类型:string 类型方便文本处理,这是 SV 新增的特性之一。
logic [7:0] byte_data;
int number;
real time_period;
time simulation_time;
string message;
逻辑类型可表示 0、1、z(高阻)和 x(未知)。整数采用二进制补码,实数遵循 IEEE 754 标准。
复杂数据类型
除了基本类型,SV 还引入了枚举、数组和结构体等复杂类型。
- 枚举类型 (enum):定义命名常量,提升代码可读性。
- 数组:支持一维或多维,便于操作数据集合。
- 结构体 (struct):将不同类型数据组合成复合类型。
enum {RED, GREEN, BLUE} led_color;
byte[7:0] ram[0:255]; // 256x8-bit RAM
struct {
logic [3:0] red;
logic [3:0] green;
logic [3:0] blue;
} pixel;
数据结构进阶
数组和队列
数组存储固定数量的元素,而队列 (queue) 是动态的,支持随时添加或删除元素。
int my_array[15]; // 固定大小
bit[7:0] my_queue[$]; // 动态大小
结构体和联合体
结构体用于逻辑分组数据项,联合体则允许不同成员共享存储空间以节省内存。
struct {
logic [7:0] address;
logic [31:0] data;
bit we;
} busTransaction;
union {
logic [31:0] data_word;
logic [7:0] data_bytes[4];
} data_storage;
类和对象
类是面向对象编程的基础,通过类和对象,硬件模型可以更加模块化和可重用。
class myClass;
int myInt;
function void myMethod(input int value);
myInt = value;
endfunction
endclass
myClass myObject = new();
myObject.myMethod(10);
类的高级特性
重载与重写
SV 支持函数重载和重写,增加了设计的灵活性。派生类可以覆盖基类的虚函数。
class A;
virtual function void display();
$display("Class A display");
endfunction
endclass
class B extends A;
function void display(int param); // 重载
$display("Class B display with param %0d", param);
endfunction
function void display(); // 重写
$display("Class B display");
endfunction
endclass
B myObject = new();
myObject.display(); // 调用重写的 display
myObject.display(5); // 调用重载的 display

