SystemVerilog不是一种新的硬件描述语言。SystemVerilog是现有Verilog HDL的一组丰富的扩展。
诚然,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添加了几种新的数据类型,允许在更抽象的层次上建模设计。
- byte是一个2状态有符号的变量,被定义为8位。
- shortint 是一个2状态有符号变量,定义为16位。
- int 是一个2状态有符号变量,类似于C int数据类型,但被定义为32位。
- longint 一个2状态有符号变量,被定义为恰好64位,类似于C long类型。
- bit 任何向量宽度的2状态无符号数据类型,可用于代替Verilog reg数据类型。
- logic是任何向量宽度的4状态无符号数据类型,可以代替reg数据类型。
- shortreal 是 一个与 C 浮点数类型相同的 2 态单精度浮点变量。
- void 表示没有值,可以指定为函数的返回值,与C中相同。
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增加了几个新操作符,包括:
- 和—递增和递减运算符
- =, -=, *=, /=, %=, &=, ^=, |=等赋值运算符这些运算符简化了许多类型操作的编码。例如, 11.unique和priority决策声明 Verilog定义了if...else和case语句按源代码顺序进行评估。在硬件实现中,这需要额外的优先级编码逻辑。如果可以确定决策的所有分支都是相互排斥的(唯一的),那么综合将优化这个额外的逻辑。 Verilog语言不要求决策语句总是执行代码分支。如果发生这种情况,综合将为实现添加latch。 SystemVerilog增加了使用关键字unique和priority来指定决策语句的每个分支何时唯一或需要优先级评估的能力。 unique和priority的修饰符指导仿真器、综合工具和其他工具确定要确定的硬件类型。工具可以使用这些信息来检查代码是否正确建模了所需的逻辑。
- 当指定priority决策修饰符时,所有工具都必须保持源代码的决策顺序。
- 当指定unique决策修饰符时,工具可以优化决策顺序。然而,如果工具确定两个代码分支可能同时为真,则所有工具都需要报告错误。 12.新的程序块 Verilog使用always过程块来表示时序逻辑、组合逻辑和latch逻辑的RTL模型。综合和其他软件工具必须从过程语句的上下文中推断出always过程块的意图。这种推断可能导致仿真和综合结果的不匹配。 SystemVerilog添加了三个新程序来明确指示逻辑的意图:always_ff、always_comb和always_latch。 明确说明意图后,软件工具可以检查过程块功能是否与过程类型相匹配。如果代码与意图不匹配,则可以生成错误或警告。
- 13.task和function增强 SystemVerilog为Verilog任务和函数结构增加了一些增强功能。本文只提到了其中两个增强功能。 Void functions:Verilog语言要求函数具有返回值,并且函数调用接收返回值。 SystemVerilog添加了一个void数据类型,可以指定为函数的返回类型。空函数和任务的区别在于,函数有几个限制,例如不允许时间控制。这些限制有助于确保函数中的逻辑将正确综合。通过使用空函数而不是任务进行建模,工程师可以更有信心他们的模型将正确综合。 函数输入和输出:Verilog标准要求函数至少有一个输入,并且函数只能有输入。 SystemVerilog删除了这些限制。函数可以有任意数量的输入、输出和输入输出。 14.断言 SystemVerilog将断言添加到Verilog标准中。这些断言结构与PSL断言标准一致,但适应了Verilog语言的语法。 有两种类型的断言,即时和连续。即时断言作为编程语句执行,类似于if...else。这些断言使用简单,甚至可以简化简单模型的验证和调试。 顺序断言与Verilog代码并行执行,并在时钟周期上进行评估。顺序断言被描述为property。一个property可以跨越多个时钟周期,这被称为sequence。SystemVerilog类似PSL的断言可以用简短、简洁的序列表达式来描述简单的序列和非常复杂的序列。
- 结论 SystemVerilog适合每个Verilog工程师! SystemVerilog为Verilog-2001标准提供了一组主要扩展。Verilog的一些扩展对于建模和验证非常大的设计非常有用,并且编码更少。这些扩展使Verilog更易于使用,并且对每个与Verilog合作的工程师都真正有益。