诚然,SystemVerilog的主要目标是实现大型复杂设计的建模和验证。然而,SystemVerilog为Verilog提供了每个工程师都可以也应该利用的增强功能。
SystemVerilog使Verilog建模变得更加容易,并有助于确保模型能够正确仿真和综合。
本文简要介绍了SystemVerilog的14项增强功能,这些增强功能将引起所有Verilog用户的兴趣,无论他们正在建模哪种类型的设计。
1.时间单位和精度
在Verilog中,时间被指定为一个数字,没有任何时间单位。例如:
forever #5 clock = ~clock;
Verilog标准没有指定默认单位或时间精度。时间单位和精度是软件工具的属性,由编译器指令'timescale设置。然而,编译器指令存在固有的危险,因为它们依赖于代码顺序。这可能会导致不同的仿真产生不同的结果。
SystemVerilog增加了两个增强功能来控制时间的时间单位。首先,时间可以指定一个显式单位。该单位是s、ms、ns、ps或fs之一,代表秒到飞秒。例如:
forever #5ns clock = ~clock;
其次,SystemVerilog允许使用新的关键字、timeunit和timeprecision来指定时间单位和时间精度。这些声明可以在module中指定,从而使时间单位和精度成为模型的一部分,而不是对软件工具的命令。
timeunits 1ns; timeprecision 10ps;
2.填充矢量
使用Verilog,很容易用所有零、所有Z或所有X填充任何宽度的矢量。然而,Verilog没有一个简单的方法来用所有矢量填充任何宽度的矢量。
SystemVerilog添加了一个方便的快捷方式,用相同值填充向量的所有位。简单的语法是'0, '1, 'z或'x。这允许填充任何大小的矢量,而无需明确指定矢量大小。
bit [63:0] data; data = '1; //set all bits of data to 1
3.抽象数据类型
Verilog提供以硬件为中心的net和变量数据类型。这些类型代表4状态逻辑值,用于建模和验证硬件行为。Verilog的net数据类型还具有多个强度级别适用于net的多个驱动。
SystemVerilog为Verilog添加了几种新的数据类型,允许在更抽象的层次上建模设计。
SystemVerilog 2状态数据类型允许在更自然的层面上进行建模设计。大多数数字逻辑只适用于0和1。Z的特殊值只需要表示三态逻辑,这在大多数设计中是罕见的。X表示未知条件的仿真值。
SystemVerilog logic数据类型是Verilog reg数据类型的同义词。它解决了自RTL 综合开始以来困扰新Verilog用户的术语问题。reg关键字似乎意味着“寄存器”,这似乎意味着每个地方都使用reg数据类型,需要硬件寄存器。
凭借经验,Verilog用户了解到这种暗示是错误的。reg数据类型只是一个编程变量。使用变量的上下文决定了是否需要硬件寄存器。logic数据类型与reg类型相同,但没有误导性名称。
4.放宽变量规则
使用Verilog,变量只能在过程赋值的左侧使用。在连续赋值的左侧使用变量是非法的。这些上下文需要net数据类型,例如wire。
这种对变量的限制往往是编译错误的来源。在创建module时,设计者必须首先确定信号将如何接收其值,以便知道要使用什么数据类型。如果设计功能的建模方式发生变化,通常需要更改数据类型声明。
SystemVerilog放宽了变量使用规则。变量可以是:
这些宽松的规则简化了Verilog模型的创建。几乎所有信号都可以声明为变量,而不考虑变量将如何接收其值。唯一需要net数据类型的时候是当信号将有多个驱动时,例如在双向端口上。
变量的SystemVerilog规则要求变量只能有一个单一来源。例如,如果在连续赋值的左侧使用变量,并且同一变量无意中连接到模块的输入端口,则会报告错误。Verilog在这种情况下需要net类型,这将允许多驱动逻辑。
5.用户定义的类型
Verilog不允许用户定义新的数据类型。SystemVerilog提供了一种使用typedef定义新数据类型的方法,类似于C。然后,用户定义的类型可以像任何数据类型一样用于声明。
typedef int unsigned uint; uint a,b;
6.枚举类型
在Verilog中,所有信号必须是net、变量或参数数据类型。这些数据类型的信号可以在其合法范围内具有任何价值。Verilog语言没有提供限制变量合法值的方法。
SystemVerilog允许用户使用类似C的语法定义枚举类型。枚举类型具有一组命名值。这些命名值是该枚举变量的合法值。
enum {WAIT, LOAD, DONE} states;
枚举类型可以用作用户定义的数据类型,允许该类型在许多地方使用。
typedef enum {FALSE, TRUE} boolean;
boolean ready; boolean test_complete;
7.Structures和unions
SystemVerilog为Verilog语言添加了结构体。结构体允许将多个变量以一个通用名称分组在一起。然后,这些变量可以像任何变量一样独立分配,或者整个组可以在单个语句中分配。声明语法类似于C。
结构体定义可以使用typedef命名。结构体的单个成员使用变量名和字段名之间的句点来引用。
IR.opcode = 1;
结构的所有成员也可以作为一个整体分配,使用值列表,如C。
stack = {5, 200};
结构体可以分配给结构体,简化将一组变量转移到另一组变量。
IR = stack;
结构也可以传递给函数或任务,也可以传递给module端口。
8.数组
Verilog数据类型可以声明为数组。reg和net类型也可以声明一个向量宽度。数组可以有任意数量的维度。Verilog将对数组元素的访问限制为一次只有一个元素。
SystemVerilog将Verilog数组称为unpacked array。可以同时引用unpacked array的任何数量的维度。这允许将数组的全部或部分复制到另一个数组。
r2 = r1; // 复制整个数组
SystemVerilog还允许通过一次分配unpacked array的所有元素初始化为默认值。
r1 = {default: 8'hFF}; // 初始化数组
9.模块端口连接
Verilog限制了可以连接到模块端口的数据类型。只有net类型和变量reg、int或time才能通过模块端口。
SystemVerilog删除了对模块端口连接的所有限制。任何数据类型都可以通过端口传递,包括reals, arrays和structures。
10。操作符
Verilog没有C语言++和--赋值运算符。
SystemVerilog增加了几个新操作符,包括: