一、SV 语法 简介
SystemVerilog(简称 SV)是硬件描述语言(HDL)Verilog 的扩展,旨在增强语言的表达能力,特别是在硬件设计与验证方面。它包括了许多新特性,既支持硬件描述,又提供了强大的功能来支持硬件验证。SystemVerilog 的语法和 Verilog 类似,但在许多方面提供了更为丰富的特性,比如面向对象编程、随机化、断言、接口等。
以下是 SystemVerilog 中常见的语法概览和关键特性:
1. 模块(Module)定义
在 SystemVerilog 中,模块的定义与 Verilog 类似。模块可以包含端口、内部信号和变量。
module my_module(
input logic clk, // 输入时钟
input logic reset, // 输入复位信号
output logic out // 输出信号
);
// 模块内部逻辑
always_ff @(posedge clk or negedge reset) begin
if (!reset)
out <= 0;
else
out <= ~out;
end
endmodule
2. 接口(Interface)
接口是一种结构化的方式来组织信号,在模块之间传递时,可以减少端口的冗余。
interface bus_if;
logic clk;
logic rst;
logic [7:0] data;
endinterface
module my_module(bus_if bus);
always_ff @(posedge bus.clk or negedge bus.rst) begin
if (!bus.rst)
bus.data <= 8'b0;
else
bus.data <= bus.data + 1;
end
endmodule
3. 数据类型
SystemVerilog 提供了许多扩展的数据类型,以下是一些常见的数据类型:
3.1 逻辑类型
logic
:替代reg
和wire
,支持单比特值,适用于组合和时序逻辑。logic [7:0]
:表示一个 8 位的信号。bit
:与logic
相似,但只支持 0 或 1 的值。
3.2 整数类型
int
:32 位有符号整数。shortint
:16 位有符号整数。longint
:64 位有符号整数。byte
:8 位有符号整数。integer
:默认的 32 位整数类型。
3.3 数组类型
- 定长数组:
logic [7:0] arr[0:3];
表示一个有 4 个元素的数组,每个元素为 8 位宽。 - 动态数组:
logic [7:0] arr[];
数组的大小在运行时动态改变。 - 队列:
logic [7:0] queue[$];
队列是动态的并可以增长或缩小。
3.4 结构体和联合体
-
结构体:允许创建包含不同数据类型的复合数据类型。
typedef struct { logic [7:0] byte_data; logic [15:0] short_data; } data_t;
-
联合体:与结构体类似,但所有成员共享相同的内存空间。
typedef union { logic [7:0] byte_data; logic [15:0] short_data; } data_u;
4. 程序块和流程控制
SystemVerilog 支持各种类型的程序块和流程控制,类似于 C 语言。
4.1 always
块
always @(posedge clk) begin
out <= in;
end
4.2 always_ff
块 (时序逻辑)
用于描述时序逻辑,类似于 always @(posedge clk)
,但具有更严格的检查。
always_ff @(posedge clk or negedge rst) begin
if (!rst)
out <= 0;
else
out <= in;
end
4.3 always_comb
块 (组合逻辑)
用于描述组合逻辑。
always_comb begin
out = a & b;
end
4.4 条件语句
if (condition) begin
// do something
end else begin
// do something else
end
4.5 case
语句
case (sel)
2'b00: out = 0;
2'b01: out = 1;
default: out = 2;
endcase
5. 面向对象编程(OOP)
SystemVerilog 引入了面向对象的特性,包括类、继承、多态和封装。
5.1 类(Class)定义
class MyClass;
// 类成员
int value;
// 构造函数
function new(int val);
value = val;
endfunction
// 成员函数
function void display();
$display("Value: %d", value);
endfunction
endclass
5.2 继承
class DerivedClass extends MyClass;
function new(int val);
super.new(val); // 调用基类构造函数
endfunction
endclass
5.3 虚拟任务
虚拟任务允许在基类中声明方法并在子类中实现它们。
class BaseClass;
virtual task do_something();
$display("Base Class: Doing something");
endtask
endclass
class DerivedClass extends BaseClass;
virtual task do_something();
$display("Derived Class: Doing something different");
endtask
endclass
6. 随机化和约束
SystemVerilog 提供强大的随机化功能,通常用于测试和验证。
6.1 随机变量和约束
class MyRandomClass;
rand bit [3:0] value;
constraint valid_value { value > 2; }
endclass
6.2 随机化方法
MyRandomClass obj = new;
if (!obj.randomize()) begin
$display("Randomization failed");
end
7. 断言(Assertions)
断言是用于验证设计正确性的一个非常重要的工具,SystemVerilog 提供了丰富的断言特性。
7.1 简单断言
assert (a == b) else $fatal("Error: a is not equal to b");
7.2 假设和覆盖
假设用于验证设计在某些条件下的行为,而覆盖则用于记录设计的状态。
assume property (@(posedge clk) a |-> b); // 假设条件
cover property (@(posedge clk) a |-> b); // 覆盖条件
8. 模块实例化
在 SystemVerilog 中,模块可以被实例化来创建具体的硬件描述。
module top;
logic clk;
logic rst;
logic out;
my_module u1 (
.clk(clk),
.rst(rst),
.out(out)
);
endmodule
总结
SystemVerilog 是 Verilog 的扩展语言,提供了更强的功能来支持硬件设计和验证。它包括了多种数据类型、面向对象的编程、随机化、断言、接口、虚拟任务等特性,非常适合复杂的设计与验证环境。希望以上的简要语法概览能帮助你理解 SystemVerilog 的基本结构和常见特性。