前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >适用于所有数字芯片工程师的SystemVerilog增强功能

适用于所有数字芯片工程师的SystemVerilog增强功能

作者头像
AsicWonder
发布2024-05-09 14:31:39
1090
发布2024-05-09 14:31:39
举报

SystemVerilog不是一种新的硬件描述语言。SystemVerilog是现有Verilog HDL的一组丰富的扩展。

诚然,SystemVerilog的主要目标是实现大型复杂设计的建模和验证。然而,SystemVerilog为Verilog提供了每个工程师都可以也应该利用的增强功能。

SystemVerilog使Verilog建模变得更加容易,并有助于确保模型能够正确仿真和综合。

本文简要介绍了SystemVerilog的14项增强功能,这些增强功能将引起所有Verilog用户的兴趣,无论他们正在建模哪种类型的设计。

1.时间单位和精度

在Verilog中,时间被指定为一个数字,没有任何时间单位。例如:

forever #5 clock = ~clock;

Verilog标准没有指定默认单位或时间精度。时间单位和精度是软件工具的属性,由编译器指令'timescale设置然而,编译器指令存在固有的危险,因为它们依赖于代码顺序。这可能会导致不同的仿真产生不同的结果。

SystemVerilog增加了两个增强功能来控制时间的时间单位。首先,时间可以指定一个显式单位。该单位是s、ms、ns、psfs之一代表秒到飞秒。例如:

forever #5ns clock = ~clock;

其次,SystemVerilog允许使用新的关键字、timeunittimeprecision来指定时间单位和时间精度这些声明可以在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数据类型可以声明为数组。regnet类型也可以声明一个向量宽度。数组可以有任意数量的维度。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...elsecase语句按源代码顺序进行评估。在硬件实现中,这需要额外的优先级编码逻辑。如果可以确定决策的所有分支都是相互排斥的(唯一的),那么综合将优化这个额外的逻辑。 Verilog语言不要求决策语句总是执行代码分支。如果发生这种情况,综合将为实现添加latch。 SystemVerilog增加了使用关键字unique和priority来指定决策语句的每个分支何时唯一或需要优先级评估的能力 unique和priority的修饰符指导仿真器、综合工具和其他工具确定要确定的硬件类型。工具可以使用这些信息来检查代码是否正确建模了所需的逻辑。
  • 当指定priority决策修饰符时,所有工具都必须保持源代码的决策顺序。
  • 当指定unique决策修饰符时,工具可以优化决策顺序。然而,如果工具确定两个代码分支可能同时为真,则所有工具都需要报告错误。 12.新的程序块 Verilog使用always过程块来表示时序逻辑、组合逻辑和latch逻辑的RTL模型。综合和其他软件工具必须从过程语句的上下文中推断出always过程块的意图。这种推断可能导致仿真和综合结果的不匹配。 SystemVerilog添加了三个新程序来明确指示逻辑的意图:always_ff、always_combalways_latch。 明确说明意图后,软件工具可以检查过程块功能是否与过程类型相匹配。如果代码与意图不匹配,则可以生成错误或警告。
  • 13.task和function增强 SystemVerilog为Verilog任务和函数结构增加了一些增强功能。本文只提到了其中两个增强功能。 Void functions:Verilog语言要求函数具有返回值,并且函数调用接收返回值。 SystemVerilog添加了一个void数据类型,可以指定为函数的返回类型。空函数和任务的区别在于,函数有几个限制,例如不允许时间控制。这些限制有助于确保函数中的逻辑将正确综合。通过使用空函数而不是任务进行建模,工程师可以更有信心他们的模型将正确综合。 函数输入和输出:Verilog标准要求函数至少有一个输入,并且函数只能有输入。 SystemVerilog删除了这些限制。函数可以有任意数量的输入、输出和输入输出。 14.断言 SystemVerilog将断言添加到Verilog标准中。这些断言结构与PSL断言标准一致,但适应了Verilog语言的语法。 有两种类型的断言,即时和连续。即时断言作为编程语句执行,类似于if...else。这些断言使用简单,甚至可以简化简单模型的验证和调试。 顺序断言与Verilog代码并行执行,并在时钟周期上进行评估。顺序断言被描述为property一个property可以跨越多个时钟周期,这被称为sequenceSystemVerilog类似PSL的断言可以用简短、简洁的序列表达式来描述简单的序列和非常复杂的序列。
  • 结论 SystemVerilog适合每个Verilog工程师! SystemVerilog为Verilog-2001标准提供了一组主要扩展。Verilog的一些扩展对于建模和验证非常大的设计非常有用,并且编码更少。这些扩展使Verilog更易于使用,并且对每个与Verilog合作的工程师都真正有益。
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-07,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 数字芯片实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SystemVerilog不是一种新的硬件描述语言。SystemVerilog是现有Verilog HDL的一组丰富的扩展。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com