SystemVerilog语言简介(doc 26页)SystemVerilog语言简介SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。
SystemVerilog由Accellera 开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。
下面我们从几个方面对SystemV erilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。
1. 接口(Interface)Verilog模块之间的连接是通过模块端口进行的。
为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。
不幸的是,在设计的早期,我们很难把握设计的细节。
而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。
另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。
SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。
接口在关键字interface和e ndinterface之间定义,它独立于模块。
接口在模块中就像一个单一的端口一样使用。
在最简单的形式下,一个接口可以认为是一组线网。
例如,可以将PCI总线的所有信号绑定在一起组成一个接口。
通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。
随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。
当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。
下面是一个接口的使用实例:3. 时间单位和精度在Verilog中,表示时间的值使用一个数来表示,而不带有任何时间单位。
例如:从这一句中我们无法判断5代表的是5ns? 5ps? 还是其他。
Verilog的时间单位和精度是作为每一个模块的属性,并使用编译器指令`timescale来设置。
使用这种方法具有固有的缺陷,因为编译器指令的执行依赖于源代码的编译顺序,编译器总是将它遇到的最后一个`timescale设置的时间单位和精度作为之后的标准。
那么,假如有些模块之前没有使用`timescale设置时间单位和精度,这就有可能出现同一个源代码的不同仿真会出现不同结果的情况。
SystemVerilog为了控制时间单位加入了两个重要的增强。
首先,时间值可以显式地指定一个单位。
时间单位可以是s、ms、ns、ps或fs。
时间单位作为时间值的后缀出现。
例如:其次,SystemVerilog允许使用新的关键字(timeunits和timeprecision)来指定时间单位和精度。
这些声明可以在任何模块中指定,同时也可以在$root空间中全局指定。
时间单位和精度必须是10的幂,范围可以从s到fs。
例如:4. 抽象数据类型Verilog提供了面向底层硬件的线网、寄存器和变量数据类型。
这些类型代表了4态逻辑值,通常用来在底层上对硬件进行建模和验证。
线网数据类型还具有多个强度级别,并且能够为多驱动源的线网提供解析功能。
SystemVerilog包括了C语言的char和int数据类型,它允许在Verilog模型和验证程序中直接使用C和C++代码。
Veri log PLI不再需要集成总线功能模型、算法模型和C函数。
Syst emVerilog还为Verilog加入了几个新的数据类型,以便能够在更抽象的层次上建模硬件。
●char:一个两态的有符号变量,它与C语言中的char数据类型相同,可以是一个8位整数(ASCII)或shortint(Unicode);●int:一个两态的有符号变量,它与C语言中的int数据类型相似,但被精确地定义成32位;●shortint:一个两态的有符号变量,被精确地定义成16位;●longint:一个两态的有符号变量,它与C语言中的long数据类型相似,但被精确地定义成64位;●byte:一个两态的有符号变量,被精确地定义成8位;●bit:一个两态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的reg数据类型;●logic:一个四态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的线网或reg数据类型,但具有某些限制;●shortreal:一个两态的单精度浮点变量,与C语言的float类型相同;●void:表示没有值,可以定义成一个函数的返回值,与C语言中的含义相同。
SystemVerilog的bit和其他数据类型允许用户使用两态逻辑对设计建模,这种方法对仿真性能更有效率。
由于Verilog语言没有两态数据类型,因此许多仿真器都通过将这种功能作为仿真器的一个选项提供。
这些选项不能够在所有的仿真器之间移植,而且在需要时用三态或四态逻辑的设计中强制使用两态逻辑还具有副作用。
SystemVerilog的bit数据类型能够极大改进仿真器的性能,同时在需要的时候仍然可以使用三态或四态逻辑。
通过使用具有确定行为的数据类型来代替专有的仿真器选项,两态模型能够在所有的SystemVerilog仿真器间移植。
SystemVerilog的logic数据类型比Verilog的线网和寄存器数据类型更加灵活,它使得在任何抽象层次上建模硬件都更加容易。
logic类型能够以下面的任何一种方法赋值:●通过任意数目的过程赋值语句赋值,能够替代Verilog的reg类型;●通过单一的连续赋值语句赋值,能够有限制地替代Verilog的wire类型;●连接到一个单一原语的输出,能够有限制地替代Verilog的wire类型;由于logic数据类型能够被用来替代Verilog的reg或wire(具有限制),这就使得能够在一个更高的抽象层次上建模,并且随着设计的不断深入能够加入一些设计细节而不必改变数据类型的声明。
logic数据类型不会表示信号的强度也不具有线逻辑的解析功能,因此logic数据类型比Verilog的wire类型更能有效地仿真和综合。
5. 有符号和无符号限定符缺省情况下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。
Verilog-2001标准允许使用s igned关键字将无符号类型显式地声明成有符号类型。
SystemV erilog加入了相似的能力,它可以通过unsigned关键字将有符号数据类型显式地声明成有无符号数据类型。
例如:值得注意的是unsigned在Verilog中是一个保留字,但并没有被Verilog标准使用。
6. 用户定义的类型Verilog不允许用户定义新的数据类型。
SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似。
用户定义的类型可以与其它数据类型一样地使用在声明当中。
例如:一个用户定义的数据类型可以在它的定义之前使用,只要它首先在空的typedef中说明,例如:7. 枚举类型在Verilog语言中不存在枚举类型。
标识符必须被显式地声明成一个线网、变量或参数并被赋值。
SystemVerilog允许使用类似于C的语法产生枚举类型。
一个枚举类型具有一组被命名的值。
缺省情况下,值从初始值0开始递增,但是我们可以显式地指定初始值。
枚举类型的例子如下:我们还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使用。
例如:8. 结构体和联合体在Verilog语言中不存在结构体或联合体,而结构体或联合体在将几个声明组合在一起的时候非常有用。
SystemVerilog增加了结构体和联合体,它们的声明语法类似于C。
结构体或联合体中的域可以通过在变量名和域名字之间插入句点(.)来引用:我们可以使用typedef为结构体或联合体的定义指定一个名字。
一个结构体可以使用值的级联来完整地赋值,例如:结构体可以作为一个整体传递到函数或任务,也可以从函数或任务传递过来,也可以作为模块端口进行传递。
9. 数组在Verilog中可以声明一个数组类型,reg和线网类型还可以具有一个向量宽度。
在一个对象名前面声明的尺寸表示向量的宽度,在一个对象名后面声明的尺寸表示数组的深度。
例如:在SystemVerilog中我们使用不同的术语表示数组:使用“压缩数组(packed array)”这一术语表示在对象名前声明尺寸的数组;使用“非压缩数组(unpacked array)”这一术语表示在对象名后面声明尺寸的数组。
压缩数组可以由下面的数据类型组成:bit、logic、reg、wire以及其它的线网类型。
无论是压缩数组还是非压缩数组都可以声明成多维的尺寸。
非压缩尺寸在压缩尺寸之前引用,这就允许将整个压缩数组作为一个单一的元素进行引用。
在上面的例子中,d[1]引用非压缩数组的一个单一元素,这个元素是一个包含4个字节的数组。
10. 在为命名的块中声明Verilog允许变量在一个命名的begin-end或fork-join语句组中声明。
相对于语句组来说,这些变量是本地的,但它们可以被层次化地引用。
在SystemVerilog中,既可以在命名的块中也可以在未命名的块中声明。
在未命名的块中,不能够使用层次名来访问变量。
所有的变量类型,包括用户定义的类型、枚举类型、结构体和联合体都可以在begin-end或fork-join语句组中声明。
11. 常量在Verilog中有三种特性类型的常量:parameter、specp aram和localparam。
而在SystemVerilog中,允许使用cons t关键字声明常量。
例如:12. 可重定义的数据类型SystemVerilog扩展了Verilog的parameter,使其可以包含类型。
这个强大的功能使得一个模块中的数据类型在模块的每一个实例中重新定义。
例如:13. 模块端口连接在Verilog中,可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的reg、integer和time。
而在SystemV erilog中则去除了这种限制,任何数据类型都可以通过端口传递,包括实数、数组和结构体。
14. 字母值在Verilog中,当指定或赋值字母值的时候存在一些限制。
而SystemVerilog则为字母值如何指定作了下面的增强:●一个字母值的所有位均可以使用`0、`1、`z或`x作相同的填充。
这就允许填充一个任意宽度的向量,而无需显式地指定向量的宽度,例如:●一个字符串可以赋值成一个字符数组,象C语言一样加入一个空结束符。