当前位置:文档之家› SystemVerilog

SystemVerilog

SystemVerilog 语言简介 SystemVerilog 是一种硬件描述和验证语言(HDVL),它基于 IEEE 1364-2001 Verilog 硬件描述语言 (HDL) 并对其进行了扩展, , 包括扩充了 C 语言数据类型、结构、压缩和非压缩数组、 接口、断 言等等, 这些都使得 SystemVerilog 在一个更高的抽象层次上提高了 设计建模的能力。

SystemVerilog 由 Accellera 开发,它主要定位在 芯片的实现和验证流程上, 并为系统级的设计流程提供了强大的连接 能力。

下面我们从几个方面对 SystemVerilog 所作的增强进行简要的 介绍, 期望能够通过这个介绍使大家对 SystemVerilog 有一个概括性 的了解。

1. 接口(Interface) Verilog 模块之间的连接是通过模块端口进行的。

为了给组成设 计的各个模块定义端口, 我们必须对期望的硬件设计有一个详细的认 识。

不幸的是,在设计的早期,我们很难把握设计的细节。

而且,一 旦模块的端口定义完成后,我们也很难改变端口的配置。

另外,一个 设计中的许多模块往往具有相同的端口定义,在 Verilog 中,我们必 须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。

SystemVerilog 提供了一个新的、高层抽象的模块连接,这个连 接被称为接口(Interface)。

接口在关键字 interface 和 endinterface 之间定义,它独立于模块。

接口在模块中就像一个单一的端口一样使 用。

在最简单的形式下,一个接口可以认为是一组线网。

例如,可以 将 PCI 总线的所有信号绑定在一起组成一个接口。

通过使用接口, 我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。

随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信 号也会很容易地表示出来。

当接口发生变化时,这些变化也会在使用 该接口的所有模块中反映出来,而无需更改每一个模块。

下面是一个 接口的使用实例: interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus更多免费资料下载请进: 中国最大的免费课件资料库module RAM (chip_bus io, // 使用接口 input clk); // 可以使用 io.read_request 引用接口中的一个信号 endmodule module CPU(chip_bus io, input clk); ... endmodule module top; reg clk = 0; chip_bus a; // 实例接口 // 将接口连接到模块实例 RAM mem(a, clk); CPU cpu(a, clk); endmodule 实际上,SystemVerilog 的接口不仅仅可以表示信号的绑定和互 连。

由于 SystemVerilog 的接口中可以包含参数、 常量、 变量、 结构、 函数、任务、initial 块、always 块以及连续赋值语句,所以 SystemVerilog 的接口还可以包含内建的协议检查以及被使用该接口 的模块所共用的功能。

2. 全局声明和语句 在 Verilog 中, 除了一个模块可以作为模块实例引用其他模块外, 并不存在一个全局空间。

另外,Verilog 允许任意数目的顶层模块, 因此会产生毫无关联的层次树。

SystemVeriog 增加了一个被称为$root 的隐含的顶级层次。

任何 在模块边界之外的声明和语句都存在于$root 空间中。

所有的模块, 无论它处于哪一个设计层次,都可以引用$root 中声明的名字。

这样, 如果某些变量、 函数或其它信息被设计中的所有模块共享,那么我们 就可以将它们作为全局声明和语句。

全局声明和语句的一个使用实例 如下:更多免费资料下载请进: 中国最大的免费课件资料库reg error _flag; // 全局变量 function compare (...); // 全局函数 always @(error_flag) // 全局语句 ... module test; chip1 u1 (...) endmodule module chip1 (...); FSM u2 (...); always @(data) error_flag = compare(data, expected); endmodule module FSM (...); ... always @(state) error_flag = compare(state, expected); endmodule 3. 时间单位和精度 在 Verilog 中,表示时间的值使用一个数来表示,而不带有任何 时间单位。

例如: forever #5 clock = ~clock; 从这一句中我们无法判断 5 代表的是 5ns? 5ps? 还是其他。

Verilog 的时间单位和精度是作为每一个模块的属性,并使用编译器 指令`timescale 来设置。

使用这种方法具有固有的缺陷,因为编译器 指令的执行依赖于源代码的编译顺序, 编译器总是将它遇到的最后一 个`timescale 设置的时间单位和精度作为之后的标准。

那么,假如有 些模块之前没有使用`timescale 设置时间单位和精度,这就有可能出 现同一个源代码的不同仿真会出现不同结果的情况。

SystemVerilog 为了控制时间单位加入了两个重要的增强。

首先, 时间值可以显式地指定一个单位。

时间单位可以是 s、ms、ns、ps 或 fs。

时间单位作为时间值的后缀出现。

例如:更多免费资料下载请进: 中国最大的免费课件资料库forever #5ns clock = ~clock; 其次,SystemVerilog 允许使用新的关键字(timeunits 和 timeprecision)来指定时间单位和精度。

这些声明可以在任何模块中 指定,同时也可以在$root 空间中全局指定。

时间单位和精度必须是 10 的幂,范围可以从 s 到 fs。

例如: timeunits 1ns; timeprecision 10ps; 4. 抽象数据类型 Verilog 提供了面向底层硬件的线网、寄存器和变量数据类型。

这些类型代表了 4 态逻辑值, 通常用来在底层上对硬件进行建模和验 证。

线网数据类型还具有多个强度级别,并且能够为多驱动源的线网 提供解析功能。

SystemVerilog 包括了 C 语言的 char 和 int 数据类型, 它允许在 Verilog 模型和验证程序中直接使用 C 和 C++代码。

Verilog PLI 不再 需要集成总线功能模型、算法模型和 C 函数。

SystemVerilog 还为 Verilog 加入了几个新的数据类型,以便能够在更抽象的层次上建模 硬件。

 char:一个两态的有符号变量,它与 C 语言中的 char 数 据类型相同,可以是一个 8 位整数(ASCII)或 short int (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 标准允许使用 signed 关键字 将无符号类型显式地声明成有符号类型。

SystemVerilog 加入了相似更多免费资料下载请进: 中国最大的免费课件资料库的能力,它可以通过 unsigned 关键字将有符号数据类型显式地声明 成有无符号数据类型。

例如: int unsigned j; 值得注意的是 unsigned 在 Verilog 中是一个保留字,但并没有 被 Verilog 标准使用。

相关主题