SystemVerilog总结

发布时间 2023-06-24 10:38:04作者: sasasatori

SystemVerilog总结

过了两个月的时间,把这本《SystemVerilog for Design (Edition 2)》基本上读完了。对SystemVerilog也建立了一些认识。

本书一共十二章,除去第一章是比较笼统的介绍,最后两章主要是设计实例以外,第二章到第十章都是很干货的语法讲解。本书的特色是比较深入的讲了一些SystemVerilog新的语法feature和Verilog(包括Verilog-1995和Verilog-2001两个标准)的对比,语法应用的细节,并给出了大量的实例代码。总体来说感觉是一本不错的SystemVerilog入门书籍。

因为时间有限,我只是对书的内容进行了一些摘抄和整理,没有进行翻译和总结。现在这里对二到十章的Summary进行一下翻译,并把一些重要语法对应的小节标号标记出来,便于后续的查阅。

第二章:

这一章介绍了SystemVerilog的包(package)和$unit声明空间。包提供了一个定义良好的声明空间,其中可以定义用户定义的类型、任务、函数和常量。包中的定义可以导入到任意数量的设计块中。可以导入特定的包项,或者使用通配符导入将包定义添加到设计块的搜索路径中。$unit声明空间提供了一个准全局声明空间。任何未包含在设计块、testbench或包内的定义都会落入$unit编译单元空间。使用$unit时必须小心,以避免文件顺序依赖和单独文件编译与多文件编译之间的差异。本章提供了关于正确使用$unit编译单元空间的编码指南。

SystemVerilog还允许在未命名的begin…end块中定义局部变量。这简化了局部变量的声明,并且也隐藏了块外部的局部变量。未命名块中的局部变量受到保护,不能被不属于该块的代码读取或修改。

SystemVerilog还增强了仿真时间单位和精度的指定方式。这些增强消除了Verilog ‘timescale指令的文件顺序依赖性。

重要语法:

包(packages)—— 2.1

$unit声明空间 —— 2.2

在未命名块中声明局部变量 —— 2.3

仿真时间单位与精度 —— 2.4

第三章:

这一章介绍并讨论了强大的编译单元声明范围。正确使用编译单元范围声明可以更简洁地建模功能。编译单元范围声明的主要用途之一是使用typedef定义新类型。

SystemVerilog增强了赋值的能力,使得更容易分配能够轻松扩展到任何向量大小的值。对‘define文本替换的增强为Verilog模型和testbench中的宏提供了新的功能。

SystemVerilog还向Verilog语言中添加了许多新的2状态变量:bit、byte、shortint、int和longint。这些变量类型使得能够使用2状态值在更高层次的抽象上建模设计。2状态值的语义规则定义良好,因此所有软件工具都将以相同的方式解释和执行使用2状态逻辑的Verilog模型。还添加了一个新的shortreal类型和一个logic类型。变量初始化得到了增强,以减少Verilog标准中存在的歧义。这也有助于确保所有类型的软件工具都以相同的方式解释SystemVerilog模型。SystemVerilog还增强了在各个设计层次中声明静态或自动(动态)变量的能力。这些增强包括在begin…end块和自动任务和函数中声明常量的能力。

重要语法:

增强的赋值方法 —— 3.1

增强的`define —— 3.2

增强的变量类型 —— 3.3,3.4,3.5

增强的signed与unsigned —— 3.6

静态与自动(动态)变量 —— 3.7

增强的变量初始化 —— 3.8

增强的类型映射 —— 3.9

常量(const)—— 3.10

第四章:

类C的typedef定义允许用户在Verilog和SystemVerilog中从预定义类型或其他用户定义的类型中构建新类型。用户定义的类型可以用作模块端口,并传递到任务和函数中。

枚举类型允许声明具有有限有效值集的变量,并使用抽象标签而不是基于硬件的逻辑值来表示这些值。枚举类型允许建模比Verilog更抽象的级别,从而可以使用更少的代码行建模更大的设计。如果需要,可以将硬件实现细节添加到枚举类型声明中,例如将独热编码值分配给表示状态机状态的枚举类型列表。

SystemVerilog还添加了类类型,使面向对象的建模成为可能。类对象和面向对象编程主要用于验证,目前不可综合。有关SystemVerilog类的详细信息和示例,请参见配套书籍《SystemVerilog for Verification》

重要语法:

用户定义类型 —— 4.1

枚举类型 —— 4.2

第五章:

SystemVerilog添加了将复杂数据集合表示为单个实体的能力。结构(struct)允许将变量封装到单个对象中。结构可以作为整体引用。结构内的成员可以通过名称引用。结构可以被打包,允许将结构作为单个向量进行操作。SystemVerilog联合体(union)提供了一种在抽象级别上对单个存储单元进行建模的方法,其中存储的值可以表示为任何变量类型。

SystemVerilog还以多种方式扩展了Verilog数组(array)。使用SystemVerilog,可以将数组作为整体分配值。可以将数组的所有内容或一个维度的切片复制到另一个数组中。基本的Verilog向量声明被扩展为允许多个维度,以打包数组的形式。打包数组本质上是一个可以具有多个子字段的向量。SystemVerilog还提供了许多新的数组查询系统函数,用于确定数组的特征。

重要语法:

结构体(struct) —— 5.1

联合体(union)—— 5.2

数组(array)—— 5.3

foreach数组循环结构 —— 5.5

数组查询系统函数 —— 5.5

$bits系统函数 —— 5.6

第六章:

本章介绍了SystemVerilog添加到Verilog标准中的always_comb、always_latch和always_ff专用过程块。这些专用过程块增加了语义,提高了建模硬件的准确性和可移植性,特别是在可综合的RTL建模层次上。同样重要的是,这些专用过程块使设计人员的意图清晰,以便于确定过程块应该表示什么类型的逻辑。软件工具可以检查过程块的内容,并在过程块内的代码不能使用预期类型的硬件正确实现时发出警告。

SystemVerilog还为Verilog任务和函数添加了许多增强功能。这些增强功能包括简化Verilog语法或语义规则,以及任务和函数使用方式的新功能。这两种类型的更改都允许更快地建模更大更复杂的设计,并减少编码量。

重要语法:

专用过程块 —— 6.2

task和function增强 —— 6.3

第七章:

SystemVerilog的主要目标之一是使建模大型、复杂的设计比使用Verilog更简洁。本章介绍了对Verilog过程语句的增强,这些增强有助于实现这一目标。新的运算符、增强型for循环、底部测试循环和唯一(unique)/优先(priority)决策修饰符都提供了新的方法来使用高效、直观的代码表示设计逻辑。

重要语法:

新运算符 —— 7.1

变量操作增强 —— 7.2

for循环增强 —— 7.3

底部测试循环 —— 7.4

跳跃语法 —— 7.6

增强的模块名 —— 7.7

标签 —— 7.8

增强的case语法 —— 7.9

第八章:

本章介绍了在更抽象的层次上表示硬件行为时的建模技术建议。SystemVerilog提供了几种增强功能,使得能够准确地建模能够正确模拟和综合的设计。这些增强功能有助于确保所有软件工具(包括lint检查器、仿真器、综合编译器、形式验证器和等效性检查器)之间的一致模型行为。

本节介绍了如何使用这些新的抽象建模构造正确地建模有限状态机的几个想法,例如:2状态类型、枚举类型、always_comb过程块和唯一(unique)case语句。

重要语法:

利用枚举类型建模状态机 —— 8.1

第九章:

本章介绍了一些重要的Verilog语言扩展,这些扩展允许对多百万门设计中出现的非常大的网表进行建模。例如,.name和.*端口连接等构造减少了网表中的冗余和冗长。网别名、简化的端口声明、引用端口连接以及对可以通过端口传递的值类型的放宽规则都使得表示复杂的设计层次结构更容易建模和维护。

重要语法:

模块原型 —— 9.1

命名结束语句 —— 9.2

嵌套(本地)模块声明 —— 9.3

简化模块例化的电路网表 —— 9.4

线网别名 —— 9.5

通过模块端口传递值 —— 9.6

引用端口 —— 9.7

端口声明增强 —— 9.8

参数化类型 —— 9.9

第十章:

这一章介绍了Verilog语言中的一个强大的扩展:接口(interface)。接口封装了设计中主要块之间的通信。使用接口,详细和冗余的模块端口和电路网表声明得到了极大的简化。细节被移动到一个建模块中,在那里它们只需要定义一次,而不是在许多不同的模块中定义。接口可以全局定义,因此可以由设计层次结构中任何地方的任何模块使用。接口还可以定义为局部于一个层次结构范围内,以便只有该范围可以使用该接口。

接口不仅提供了一种将信号捆绑在一起的方法。接口modport定义提供了一种简单而强大的方法,用于为连接到它的每个模块自定义接口。在接口中包含方法(任务和函数)和过程代码的能力使得在一个方便的位置上操作和驱动仿真模型成为可能。

重要语法:

接口(interface)声明 —— 10.2

使用接口作为模块端口 —— 10.3

实例化和连接接口 —— 10.4

在接口内引用信号 —— 10.5

接口modport —— 10.6

在接口内使用任务与函数 —— 10.7

可重配置的接口 —— 10.9

总结

正如一开始所说,在使用Verilog开发项目的过程中,Verilog语法中许多低效的点促使我去学习了SystemVerilog,此外也因为我后续需要使用的一些比较新的开源IP也是使用SV进行编写的。尽管就目前来看,Verilog仍然是设计环节最主要的语言,SystemVerilog主要用于验证,但正如siemens调研的trend所示,使用SV进行ASIC设计的比例也在不断提升中,SV取代Verilog成为设计语言的主流或许只是时间问题。

对于SV的优越之处,我认为主要有以下两点,首先是易用性,确实解决了Verilog中一些啰嗦繁琐的部分,降低了代码编写和维护的成本,比如接口(interface)语法。其次是可控性,SV提供了让用户指定设计类型的功能,使得设计更容易贴合设计意图,避免综合工具最终生成的电路与设计意图不符,例如使用always_latch和always_comb取代Verilog使用通用always块描述组合逻辑的方法,可以降低设计中产生latch的概率;使用unique和priority修饰的case块可以更准确地建模普通译码器和优先级译码器。

当然,阅读完这本书只是获得了一些理论性的基础知识,重点还是如何在后续的项目中有效地利用SV进行设计并加深认识。在以后的项目实战中我会积极地使用SV,届时有了新的心得体会再在博客中进行分享。