[转]System Verilog的概念以及与verilog的对比

原文地址;算法

    http://blog.csdn.net/gtatcs/article/details/8970489数组

 

SystemVerilog语言简介多线程

 

SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提升了设计建模的能力。SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的链接能力。下面咱们从几个方面对SystemVerilog所做的加强进行简要的介绍,指望可以经过这个介绍使你们对SystemVerilog有一个归纳性的了解。并发

1. 接口(Interface)函数

Verilog模块之间的链接是经过模块端口进行的。为了给组成设计的各个模块定义端口,咱们必须对指望的硬件设计有一个详细的认识。不幸的是,在设计的早期,咱们很难把握设计的细节。并且,一旦模块的端口定义完成后,咱们也很难改变端口的配置。另外,一个设计中的许多模块每每具备相同的端口定义,在Verilog中,咱们必须在每一个模块中进行相同的定义,这为咱们增长了无谓的工做量。工具

SystemVerilog提供了一个新的、高层抽象的模块链接,这个链接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。接口在模块中就像一个单一的端口同样使用。在最简单的形式下,一个接口能够认为是一组线网。例如,能够将PCI总线的全部信号绑定在一块儿组成一个接口。经过使用接口,咱们在进行一个设计的时候能够不须要首先创建各个模块间的互连。随着设计的深刻,各个设计细节也会变得愈来愈清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的全部模块中反映出来,而无需更改每个模块。下面是一个接口的使用实例:性能

interface chip_bus;// 定义接口
 wireread_request, read_grant; wire [7:0]address, data; endinterface: chip_bus module RAM(chip_bus io, // 使用接口
 inputclk); //可使用io.read_request引用接口中的一个信号

endmodule

 

module CPU(chip_busio, input clk); ... endmodule

 

module top; reg clk = 0; chip_busa; // 实例接口 //将接口链接到模块实例
 RAM mem(a,clk); CPU cpu(a,clk); endmodule

 

实际上,SystemVerilog的接口不只仅能够表示信号的绑定和互连。因为SystemVerilog的接口中能够包含参数、常量、变量、结构、函数、任务、initial块、always块以及连续赋值语句,因此SystemVerilog的接口还能够包含内建的协议检查以及被使用该接口的模块所共用的功能。优化

2. 全局声明和语句ui

在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 #5clock= ~clock;

从这一句中咱们没法判断5表明的是5ns? 5ps? 仍是其余。Verilog的时间单位和精度是做为每个模块的属性,并使用编译器指令`timescale来设置。使用这种方法具备固有的缺陷,由于编译器指令的执行依赖于源代码的编译顺序,编译器老是将它遇到的最后一个`timescale设置的时间单位和精度做为以后的标准。那么,假若有些模块以前没有使用`timescale设置时间单位和精度,这就有可能出现同一个源代码的不一样仿真会出现不一样结果的状况。

SystemVerilog为了控制时间单位加入了两个重要的加强。首先,时间值能够显式地指定一个单位。时间单位能够是s、ms、ns、ps或fs。时间单位做为时间值的后缀出现。例如:

forever #5nsclock= ~clock;

其次,SystemVerilog容许使用新的关键字(timeunits和timeprecision)来指定时间单位和精度。这些声明能够在任何模块中指定,同时也能够在$root空间中全局指定。时间单位和精度必须是10的幂,范围能够从s到fs。例如:

timeunits 1ns;

timeprecision 10ps;

4. 抽象数据类型

Verilog提供了面向底层硬件的线网、寄存器和变量数据类型。这些类型表明了4态逻辑值,一般用来在底层上对硬件进行建模和验证。线网数据类型还具备多个强度级别,而且可以为多驱动源的线网提供解析功能。

SystemVerilog包括了C语言的char和int数据类型,它容许在Verilog模型和验证程序中直接使用C和C++代码。VerilogPLI再也不须要集成总线功能模型、算法模型和C函数。SystemVerilog还为Verilog加入了几个新的数据类型,以便可以在更抽象的层次上建模硬件。

l        char:一个两态的有符号变量,它与C语言中的char数据类型相同,能够是一个8位整数(ASCII)或short int(Unicode);

l        int:一个两态的有符号变量,它与C语言中的int数据类型类似,但被精确地定义成32位;

l        shortint:一个两态的有符号变量,被精确地定义成16位;

l        longint:一个两态的有符号变量,它与C语言中的long数据类型类似,但被精确地定义成64位;

l        byte:一个两态的有符号变量,被精确地定义成8位;

l        bit:一个两态的能够具备任意向量宽度的无符号数据类型,能够用来替代Verilog的reg数据类型;

l        logic:一个四态的能够具备任意向量宽度的无符号数据类型,能够用来替代Verilog的线网或reg数据类型,但具备某些限制;

l        shortreal:一个两态的单精度浮点变量,与C语言的float类型相同;

l        void:表示没有值,能够定义成一个函数的返回值,与C语言中的含义相同。

SystemVerilog的bit和其余数据类型容许用户使用两态逻辑对设计建模,这种方法对仿真性能更有效率。因为Verilog语言没有两态数据类型,所以许多仿真器都经过将这种功能做为仿真器的一个选项提供。这些选项不可以在全部的仿真器之间移植,并且在须要时用三态或四态逻辑的设计中强制使用两态逻辑还具备反作用。SystemVerilog的bit数据类型可以极大改进仿真器的性能,同时在须要的时候仍然可使用三态或四态逻辑。经过使用具备肯定行为的数据类型来代替专有的仿真器选项,两态模型可以在全部的SystemVerilog仿真器间移植。

SystemVerilog的logic数据类型比Verilog的线网和寄存器数据类型更加灵活,它使得在任何抽象层次上建模硬件都更加容易。logic类型可以如下面的任何一种方法赋值:

l        经过任意数目的过程赋值语句赋值,可以替代Verilog的reg类型;

l        经过单一的连续赋值语句赋值,可以有限制地替代Verilog的wire类型;

l        链接到一个单一原语的输出,可以有限制地替代Verilog的wire类型;

因为logic数据类型可以被用来替代Verilog的reg或wire(具备限制),这就使得可以在一个更高的抽象层次上建模,而且随着设计的不断深刻可以加入一些设计细节而没必要改变数据类型的声明。logic数据类型不会表示信号的强度也不具备线逻辑的解析功能,所以logic数据类型比Verilog的wire类型更能有效地仿真和综合。

5. 有符号和无符号限定符

缺省状况下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。Verilog-2001标准容许使用signed关键字将无符号类型显式地声明成有符号类型。SystemVerilog加入了类似的能力,它能够经过unsigned关键字将有符号数据类型显式地声明成有无符号数据类型。例如:

intunsigned j;

值得注意的是unsigned在Verilog中是一个保留字,但并无被Verilog标准使用。

6. 用户定义的类型

Verilog不容许用户定义新的数据类型。SystemVerilog经过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言相似。用户定义的类型能够与其它数据类型同样地使用在声明当中。例如:

typedefunsigned int uint;

uint a, b;

一个用户定义的数据类型能够在它的定义以前使用,只要它首先在空的typedef中说明,例如:

typedef int48; // 空的typedef,在其余地方进行完整定义

int48 c;

7. 枚举类型

在Verilog语言中不存在枚举类型。标识符必须被显式地声明成一个线网、变量或参数并被赋值。SystemVerilog容许使用相似于C的语法产生枚举类型。一个枚举类型具备一组被命名的值。缺省状况下,值从初始值0开始递增,可是咱们能够显式地指定初始值。枚举类型的例子以下:

enum {red,yellow, green} RGB;

enum {WAIT=2’b01, LOAD, DONE} states;

咱们还可使用typedef为枚举类型指定一个名字,从而容许这个枚举类型能够在许多地方使用。例如:

typedefenum {FALSE=1’b0, TRUE} boolean;

boolean ready;

booleantest_complete;

8. 结构体和联合体

在Verilog语言中不存在结构体或联合体,而结构体或联合体在将几个声明组合在一块儿的时候很是有用。SystemVerilog增长告终构体和联合体,它们的声明语法相似于C。

struct {

  reg [15:0] opcode;

  reg [23:0] addr;

} IR;

 

union {

  int I;

  shortreal f;

} N;

结构体或联合体中的域能够经过在变量名和域名字之间插入句点(.)来引用:

IR.opcode = 1; // 设置IR变量中的opcode域

N.f = 0.0; // 将N设置成浮点数的值

咱们可使用typedef为结构体或联合体的定义指定一个名字。

typedefstruct{

  reg [7:0] opcode;

  reg [23:0] addr;

} instruction; // 命名的结构体

instruction IR; // 结构体实例

一个结构体可使用值的级联来完整地赋值,例如:

instruction = {5,200};

结构体能够做为一个总体传递到函数或任务,也能够从函数或任务传递过来,也能够做为模块端口进行传递。

9. 数组

在Verilog中能够声明一个数组类型,reg和线网类型还能够具备一个向量宽度。在一个对象名前面声明的尺寸表示向量的宽度,在一个对象名后面声明的尺寸表示数组的深度。例如:

reg [7:0] r1 [1:256]; // 256个8位的变量

在SystemVerilog中咱们使用不一样的术语表示数组:使用“压缩数组(packed array)”这一术语表示在对象名前声明尺寸的数组;使用“非压缩数组(unpacked array)”这一术语表示在对象名后面声明尺寸的数组。压缩数组能够由下面的数据类型组成:bit、logic、reg、wire以及其它的线网类型。不管是压缩数组仍是非压缩数组均可以声明成多维的尺寸。

bit [7:0] a; // 一个一维的压缩数组

bit b [7:0]; //一个一维的非压缩数组

bit [0:11] [7:0] c; //一个二维的压缩数组

bit [3:0] [7:0] d [1:10]; // 一个包含10个具备4个8位字节的压缩数组的非压缩数组

非压缩尺寸在压缩尺寸以前引用,这就容许将整个压缩数组做为一个单一的元素进行引用。在上面的例子中,d[1]引用非压缩数组的一个单一元素,这个元素是一个包含4个字节的数组。

10. 在为命名的块中声明

Verilog容许变量在一个命名的begin-end或fork-join语句组中声明。相对于语句组来讲,这些变量是本地的,但它们能够被层次化地引用。在SystemVerilog中,既能够在命名的块中也能够在未命名的块中声明。在未命名的块中,不可以使用层次名来访问变量。全部的变量类型,包括用户定义的类型、枚举类型、结构体和联合体均可以在begin-end或fork-join语句组中声明。

11. 常量

在Verilog中有三种特性类型的常量:parameter、specparam和localparam。而在SystemVerilog中,容许使用const关键字声明常量。例如:

const charcolon= “:”;

12. 可重定义的数据类型

SystemVerilog扩展了Verilog的parameter,使其能够包含类型。这个强大的功能使得一个模块中的数据类型在模块的每个实例中从新定义。例如:

module foo; # (parameter typeVAR_TYPE = shortint;) (input logic[7:0] i, output logic [7:0] o); VAR_TYPE j = 0; // 若是不从新定义,j的数据类型为shortint
endmodule

 

module bar; logic [3:0] i, o; foo#(.VAR_TYPE(int)) u1 (i, o); // 从新将VAR_TYPE定义成int类型

endmodule

 

13. 模块端口链接

在Verilog中,能够链接到模块端口的数据类型被限制为线网类型以及变量类型中的reg、integer和time。而在SystemVerilog中则去除了这种限制,任何数据类型均可以经过端口传递,包括实数、数组和结构体。

14. 字母值

在Verilog中,当指定或赋值字母值的时候存在一些限制。而SystemVerilog则为字母值如何指定做了下面的加强:

l        一个字母值的全部位都可以使用`0、`一、`z或`x做相同的填充。这就容许填充一个任意宽度的向量,而无需显式地指定向量的宽度,例如:

bit [63:0] data;

data = `1; //将data的全部位设置成1

l        一个字符串能够赋值成一个字符数组,象C语言同样加入一个空结束符。若是尺寸不一样,它象C中同样进行左调整,例如:

char foo[0:12] = “hello worldn”;

l        加入了几个特殊的串字符:

v:垂直TAB

f:换页

a:响铃

x02:用十六进制数来表示一个ASCII字符

l        数组可使用相似于C初始化的语法赋值成字符值,但它还容许复制操做符。括号的嵌套必须精确地匹配数组的维数(这一点与C不一样),例如:

int n[1: 2] [1:3] = {{0, 1, 2}, {3{4}}};

 

15. 强制类型转换

Verilog不能将一个值强制转换成不一样的数据类型。SystemVerilog经过使用<type>’操做符提供了数据类型的强制转换功能。这种强制转换能够转换成任意类型,包括用户定义的类型。例如:

int’ (2.0 *3.0) // 将结果转换为int类型

mytype’ (foo) // 将foo转换为mytype类型

一个值还能够经过在强制转换操做符前指定一个10进制数来转换成不一样的向量宽度,例如:

17’(x- 2) // 将结果转换为17位宽度

也能够将结果转换成有符号值,例如:

signed’(x) // 将x转换为有符号值

16. 操做符

Verilog没有C语言的递增(++)和递减(--)操做符。而SystemVerilog加入了几个新的操做符:

l        ++和--:递增和递减操做符;

l        +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、<<<=和>>>=赋值操做符;

17. 惟一性和优先级决定语句

在Verilog中,若是没有遵循严格的编码风格,它的if-else和case语句会在RTL仿真和RTL综合间具备不一致的结果。若是没有正确使用full_case和parallel_case综合指令还会引发一些其它的错误。

SystemVerilog可以显式地指明何时一条决定语句的分支是惟一的,或者何时须要计算优先级。咱们能够在if或case关键字以前使用unique或requires关键字。这些关键字能够向仿真器、综合编译器、以及其它工具指示咱们指望的硬件类型。工具使用这些信息来检查if或case语句是否正确建模了指望的逻辑。例如,若是使用unique限定了一个决定语句,那么在不但愿的case值出现的时候仿真器就可以发布一个警告信息。

bit [2:0]a; unique if((a==0) || (a==1)) y= in1; else if (a==2) y=in2; else if (a==4) y=in3; // 值三、五、六、7会引发一个警告
 priorityif (a[2:1]==0) y = in1; // a是0或1

else if (a[2]==0) y = in2; // a是2或3

else y = in3; // 若是a为其余的值
 unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase // 值三、五、六、7会引发一个警告
 prioritycasez(a) 2’b00?: y = in1; // a是0或1

  2’b0?? : y = in2; // a是2或3

  default : y = in3; //若是a为其余的值

endcase

 

18. 底部检测的循环

Verilog包含for、while和repeat循环,这几个循环都是在循环的起始处检测循环条件。SystemVerilog加入了一个do-while循环,这种循环在执行语句的结尾处检测循环条件。

19. 跳转语句

在语句的执行过程当中,C语言提供了几种方式来跳转到新的语句,包括:return、break、continue和goto。在Verilog中除了经过使用disable语句跳转到语句组的尾部外,没有提供任何其它跳转语句。使用disable语句执行停止和继续功能要求加入块的名字,而且会产生不直观的代码。SystemVerilog加入了C语言的break和continue关键字,这两个关键字不要求使用块名字。另外,SystemVerilog还加入了一个return关键字,它能够用来在任何执行点上退出一个任务或函数。

l        break:退出一个循环,与C语言相同;

l        continue:跳转到一个循环的尾部,与C语言相同;

l        return 表达式:退出一个函数;

l        return:退出一个任务或void类型的函数。

SystemVerilog没有包含C语言中的goto语句。

20. 块名字和语句标签

在Verilog中,咱们能够经过在begin或fork关键字以后指定名字来为begin-end或fork-jion语句指定名字。这个指定的名字表明整个语句块。SystemVerilog还容许在end或jion关键字以后指定一个匹配的块名字。这种机制很容易将end或jion与对应的begin或fork联系起来,尤为是在一个长的块或嵌套的块中。块结尾处的名字是可选的,但若是使用的话,它必须与块起始处的名字相同。例如:

begin: foo  // 在begin以后的块名字

  …

  fork: bar // 具备名字的嵌套的块

  jion: bar // 必须具备相同的名字

  …

end: foo // 必须具备相同的名字

SystemVerilog还容许像C语言同样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。例如:

initialbegin

  test1: read_enable = 0;

  …

  test2: for (i=0; i<=255; i++)

end

21. 对事件控制的加强

Verilog使用@标记来控制基于特定事件的执行流,SystemVerilog加强了@事件控制。

l        有条件的事件控制

@标记的一个基本应用就是推断一个具备使能输入的锁存器。下面的例子演示了一个锁存器建模的基本风格。

always @(data or en)

  if (en)y<=data;

这种编码风格对仿真来讲是效率低下的,由于即便在使能输入无效的时候,数据输入的每次改变都会触发事件控制。

SystemVerilog在事件控制中加入了一个iff条件。只有iff条件为真的条件下,事件控制才会被触发。经过将使能判断移入到事件控制里面,使得只有在锁存器输出可以改变的时候事件控制才会被触发。例如:

always @(a or en iff en==1)

  y<=a;

l        事件控制中的表达式

Verilog容许在@事件控制列表中使用表达式,例如:

always @((a * b))

always @(memory[address])

在第一个例子中,是当操做数发生改变的时候仍是只有当运算结果发生改变的时候才会触发事件控制?在第二个例子中,是当memory的地址发生变化的时候仍是只有当memory的值发生变化的时候才会触发事件控制?当@事件控制中包含表达式的时候,IEEE Verilog标准容许仿真器进行不一样的优化。这就可能致使在不一样的仿真器间有不一样的仿真结果,可能还会致使仿真与综合之间的结果不一致。SystemVerilog加入了一个changed关键字,在事件控制列表中它被用做一个修饰符。@(changed (表达式))可以显式地定义只有当表达式的结果发生改变的时候才会触发事件控制。例如:

always @(changed (a * b))

always @(changed memory[address])

l        事件控制中的赋值

Verilog不容许在事件控制中使用赋值。SystemVerilog容许在事件控制中使用赋值表达式。事件控制仅仅敏感于赋值表达式右侧的变化。例如:

always @(y = a * b)

22. 新的过程

Verilog使用always过程来表示时序逻辑、组合逻辑和锁存逻辑的RTL模型。综合工具和其它软件工具必须根据过程起始处的事件控制列表以及过程内的语句来推断always过程的意图。这种推断会致使仿真结果和综合结果之间的不一致。SystemVerilog增长了三个新的过程来显式地指示逻辑的意图。

l        always_ff:表示时序逻辑的过程;

l        always_comb:表示组合逻辑的过程;

l        always_latch:表示锁存逻辑的过程。

例如:

always_comb@(aor b or sel) begin

  if (sel) y = a;

  else y = b;

end

软件工具可以检查事件控制敏感列表和过程的内容来保证逻辑的功能匹配过程的类型。例如,工具可以检查一个always_comb过程可以敏感过程内读取的全部外部值,对逻辑的每个分支的相同变量进行赋值,而且检查分支是否覆盖了全部可能的条件。若是任何一个条件没有知足,软件工具均会报告该过程没有正确建模组合逻辑。

23. 动态过程

Verilog经过使用fork-jion提供了一种静态的并发过程。每个分支都是一个分离的、并行的过程。fork-jion中任何语句的执行必须在组内的每个过程完成后才会执行。例如:

initialbegin

  fork

send_packet_task (1,255, 0);

send_packet_task (7,128, 5);

watch_result_task (1,255, 0);

watch_result_task (7,128, 5);

  jion // 全部的任务必须完成后才会到达这里

end

SystemVerilog经过process关键字加入了一个新的、动态的过程。它为一个过程产生分支,而后继续执行而无需等待其余过程完成。过程不会阻塞过程或任务内的语句执行。这种方式可以建模多线程的过程。例如:

initialbegin

  process send_packet_task (1,255, 0);

processsend_packet_task(7, 128, 5);

processwatch_result_task(1, 255, 0);

processwatch_result_task(7, 128, 5);

end //全部的过程并行运行

24. 任务和函数加强

SystemVerilog为Verilog的任务和函数做了几个加强。

l        静态和自动的存储

缺省状况下,在Verilog任务或函数内的全部存储都是静态的。Verilog-2001容许将任务和函数声明成自动的。在SystemVerilog中:(1). 在一个静态任务和函数内的特定数据能够显式地声明成自动的。声明成自动的数据在块中具备完整的生命周期,而且在任务和函数调用的入口处初始化;(2). 在一个自动的任务或函数中的特定数据能够显式地声明成静态的。自动的任务或函数中声明成静态的数据在一个块的本地范围内具备静态的生命周期。

l        从任何点返回

Verilog在一个任务或函数中执行到endtask或endfunction关键字的时候返回。函数的返回值是给函数名赋的最后一个值。SystemVerilog加入了一个return关键字,使用这个关键字,一个任务或函数能够在任何点上返回。

l        多语句

Verilog要求一个任务或函数只具备一个语句或语句块。多条语句必须组合到一个单一的begin-end或fork-jion块中。SystemVerilog去除了这种限制。所以,多条语句能够在一个任务或函数中列出而无需使用的begin-end或fork-jion。每有分组的语句就像在begin-end中同样顺序执行。咱们还能够产生一个没有语句的任务或函数定义。

l        void函数

Verilog要求一个函数具备一个返回值,函数的调用接收这个返回值。SystemVerilog加入了一个void数据类型,这个数据类型能够做为一个函数的返回值类型。void函数能够像Verilog任务同样进行调用,而无需接收一个返回值。void函数和任务的差异在于函数存在几个限制,例如没有时间控制等。

l        函数的输入和输出

Verilog标准要求一个函数至少具备一个输入而且函数只能具备输入。SystemVerilog去除了这些限制。函数能够具备任意数目的输入、输出以及输入输出,也能够什么也没有。

25. 连续赋值的加强

在Verilog中,连续赋值语句的左侧只能是线网类型,例如wire。连续赋值语句被认为是线网的驱动源,而线网能够拥有任意数据的驱动源。SystemVerilog容许除reg类型之外的任何数据类型用于连续赋值语句的左侧。与线网不一样,全部其它数据类型被限制为只能有一个连续赋值语句驱动。为相同的变量混合使用连续赋值语句和过程赋值语句是不被容许的。

26. $bit系统函数

在Verilog中没有相似于C语言中sizeof的函数。SystemVerilog加入一个新的$bit内建函数。这个函数返回保存一个值所需的硬件位的数目(一个四态值要求一个硬件位),这个函数还能够用来肯定一个结构体所表明的硬件位的数目。

27. `define的加强

SystemVerilog加强了`define编译器指令的能力以便支持将字符串做为宏的参数。宏的文本字符串中能够包含一个隔离的引号,它的前面必须具备一个反勾号(`”),这就容许字符串中包含宏参数。宏文本能够在行的尾部包含一个反斜杠(’’)来表示在下一行继续。若是宏文本字符串中包含反斜杠,则反斜杠应该被放在两个反勾号之间,这样它就不会被认为是Verilog转义标识符的开始。宏文本字符串还能够包含双反勾号(``),它容许标识符可以从参数中构建。这些加强使得`define指令更加灵活。例如:`include指令后能够紧跟一个宏名字来替代一个字符串。

`define f1“../project_top/opcode_defines”

`include `f1

28. 状态机建模

SystemVerilog容许在更高的抽象层次上对状态机建模。这些结构包括:

l        枚举类型

l        一个特殊的state数据类型;

l        一个迁移语句

l        一个迁移操做符

29. 断言

SystemVerilog中加入了断言的功能来改善系统的验证过程。

30. 结论

SystemVerilog为Verilog-2001标准提供了一系列的扩展。这些扩展使得大型设计的建模和验证更加容易。

相关文章
相关标签/搜索