《SystemVerilog语言知识介绍.pdf》由会员分享,可在线阅读,更多相关《SystemVerilog语言知识介绍.pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、SystemVerilog 语言知识介绍 SystemVerilog 是一种硬件描述与验证语言(HDVL),它基于 IEEE 1364-2001 Verilog 硬件描述语言(HDL),并对其进行了扩展,包含扩充了 C 语言数据类型、结构、压缩与非压缩数组、接口、断言等等,这些都使得 SystemVerilog 在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog 由 Accellera 开发,它要紧定位在芯片的实现与验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对 SystemVerilog 所作的增强进行简要的介绍,期望能够通过这个介绍使大家对
2、SystemVerilog 有一个概括性的熟悉。1.接口(Interface)Verilog 模块之间的连接是通过模块端口进行的。为了给构成设计的各个模块定义端口,我们务必对期望的硬件设计有一个全面的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在 Verilog 中,我们务必在每个模块中进行相同的定义,这为我们增加了无谓的工作量。SystemVerilog 提供了一个新的、高层抽象的模块连接,这个连接被称之接口(Interface)。接口在关键字 interface 与 end
3、interface 之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下,一个接口能够认为是一组线网。比如,能够将 PCI 总线的所有信号绑定在一起构成一个接口。通过使用接口,我们在进行一个设计的时候能够不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更换每一个模块。下面是一个接口的使用实例:interface chip_bus;/定义接口 wire read_request,read_grant;wire 7:0 address
4、,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 的
5、接口中能够包含参数、常量、变量、结构、函数、任务、initial 块、always 块与连续赋值语句,因此 SystemVerilog 的接口还能够包含内建的协议检查与被使用该接口的模块所共用的功能。2.全局声明与语句 在 Verilog 中,除了一个模块能够作为模块实例引用其他模块外,并不存在一个全局空间。另外,Verilog 同意任意数目的顶层模块,因此会产生毫无关联的层次树。SystemVeriog 增加了一个被称之$root 的隐含的顶级层次。任何在模块边界之外的声明与语句都存在于$root 空间中。所有的模块,不管它处于哪一个设计层次,都能够引用$root 中声明的名字。这样,假如某
6、些变量、函数或者其它信息被设计中的所有模块共享,那么我们就能够将它们作为全局声明与语句。全局声明与语句的一个使用实比如下: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
7、,expected);endmodule 3.时间单位与精度 在 Verilog 中,表示时间的值使用一个数来表示,而不带有任何时间单位。比如:forever#5 clock=clock;从这一句中我们无法推断5代表的是5ns?5ps?还是其他。Verilog 的时间单位与精度是作为每一个模块的属性,并使用编译器指令timescale 来设置。使用这种方法具有固有的缺陷,由于编译器指令的执行依靠于源代码的编译顺序,编译器总是将它遇到的最后一个timescale 设置的时间单位与精度作为之后的标准。那么,假如有些模块之前没有使用timescale 设置时间单位与精度,这就有可能出现同一个源代码的
8、不一致仿真会出现不一致结果的情况。SystemVerilog 为了操纵时间单位加入了两个重要的增强。首先,时间值能够显式地指定一个单位。时间单位能够是 s、ms、ns、ps 或者 fs。时间单位作为时间值的后缀出现。比如:forever#5ns clock=clock;其次,SystemVerilog 同意使用新的关键字(timeunits与 timeprecision)来指定时间单位与精度。这些声明能够在任何模块中指定,同时也能够在$root 空间中全局指定。时间单位与精度务必是 10 的幂,范围能够从 s 到 fs。比如:timeunits 1ns;timeprecision 10ps;4
9、.抽象数据类型 Verilog 提供了面向底层硬件的线网、寄存器与变量数据类型。这些类型代表了 4 态逻辑值,通常用来在底层上对硬件进行建模与验证。线网数据类型还具有多个强度级别,同时能够为多驱动源的线网提供解析功能。SystemVerilog 包含了 C 语言的 char 与 int 数据类型,它同意在Verilog 模型与验证程序中直接使用C 与C+代码。Verilog PLI 不再需要集成总线功能模型、算法模型与 C 函数。SystemVerilog 还为 Verilog 加入了几个新的数据类型,以便能够在更抽象的层次上建模硬件。char:一个两态的有符号变量,它与 C 语言中的 cha
10、r 数据类型相同,能够是一个 8 位整数(ASCII)或者 short int(Unicode);int:一个两态的有符号变量,它与 C 语言中的 int数据类型相似,但被精确地定义成 32 位;shortint:一个两态的有符号变量,被精确地定义成 16 位;longint:一个两态的有符号变量,它与 C 语言中的long 数据类型相似,但被精确地定义成 64 位;byte:一个两态的有符号变量,被精确地定义成 8位;bit:一个两态的能够具有任意向量宽度的无符号数据类型,能够用来替代 Verilog 的 reg 数据类型;logic:一个四态的能够具有任意向量宽度的无符号数据类型,能够用来
11、替代 Verilog 的线网或者 reg数据类型,但具有某些限制;shortreal:一个两态的单精度浮点变量,与 C 语言的 float 类型相同;void:表示没有值,能够定义成一个函数的返回值,与 C 语言中的含义相同。SystemVerilog的bit与其他数据类型同意用户使用两态逻辑对设计建模,这种方法对仿真性能更有效率。由于 Verilog 语言没有两态数据类型,因此许多仿真器都通过将这种功能作为仿真器的一个选项提供。这些选项不能够在所有的仿真器之间移植,而且在需要时用三态或者四态逻辑的设计中强制使用两态逻辑还具有副作用。SystemVerilog 的 bit数据类型能够极大改进仿
12、真器的性能,同时在需要的时候仍然能够使用三态或者四态逻辑。通过使用具有确定行为的数据类型来代替专有的仿真器选项,两态模型能够在所有的 SystemVerilog 仿真器间移植。SystemVerilog的logic数据类型比Verilog的线网与寄存器数据类型更加灵活,它使得在任何抽象层次上建模硬件都更加容易。logic 类型能够下列面的任何一种方法赋值:通过任意数目的过程赋值语句赋值,能够替代 Verilog 的 reg 类型;通过单一的连续赋值语句赋值,能够有限制地替代Verilog 的 wire 类型;连接到一个单一原语的输出,能够有限制地替代 Verilog 的 wire 类型;由于l
13、ogic数据类型能够被用来替代Verilog的reg或者wire(具有限制),这就使得能够在一个更高的抽象层次上建模,同时随着设计的不断深入能够加入一些设计细节而不必改变数据类型的声明。logic 数据类型不可能表示信号的强度也不具有线逻辑的解析功能,因此 logic 数据类型比 Verilog的 wire 类型更能有效地仿真与综合。5.有符号与无符号限定符 缺省情况下,Verilog net 与 reg 数据类型是无符号类型,integer 类型是一个有符号类型。Verilog-2001 标准同意使用 signed 关键字将无符号类型显式地声明成有符号类型。SystemVerilog 加入了
14、相似的能力,它能够通过 unsigned 关键字将有符号数据类型显式地声明成有无符号数据类型。比如:int unsigned j;值得注意的是 unsigned 在 Verilog 中是一个保留字,但并没有被 Verilog 标准使用。6.用户定义的类型 Verilog 不同意用户定义新的数据类型。SystemVerilog 通过使用 typedef 提供了一种方法来定义新的数据类型,这一点与 C 语言类似。用户定义的类型能够与其它数据类型一样地使用在声明当中。比如:typedef unsigned int uint;uint a,b;一个用户定义的数据类型能够在它的定义之前使用,只要它首先在
15、空的 typedef 中说明,比如:typedef int48;/空的 typedef,在其他地方进行完整定义 int48 c;7.枚举类型 在 Verilog 语言中不存在枚举类型。标识符务必被显式地声明成一个线网、变量或者参数并被赋值。SystemVerilog 同意使用类似于 C 的语法产生枚举类型。一个枚举类型具有一组被命名的值。缺省情况下,值从初始值 0 开始递增,但是我们能够显式地指定初始值。枚举类型的例子如下:enum red,yellow,green RGB;enum WAIT=2b01,LOAD,DONE states;我们还能够使用 typedef 为枚举类型指定一个名字,
16、从而同意这个枚举类型能够在许多地方使用。比如:typedef enum FALSE=1b0,TRUE boolean;boolean ready;boolean test_complete;8.结构体与联合体 在 Verilog 语言中不存在结构体或者联合体,而结构体或者联合体在将几个声明组合在一起的时候非常有用。SystemVerilog 增加了结构体与联合体,它们的声明语法类似于C。struct reg 15:0 opcode;reg 23:0 addr;IR;union int I;shortreal f;N;结构体或者联合体中的域能够通过在变量名与域名字之间插入句点(.)来引用:IR.
17、opcode=1;/设置 IR 变量中的 opcode 域 N.f=0.0;/将 N 设置成浮点数的值 我们能够使用 typedef 为结构体或者联合体的定义指定一个名字。typedef struct reg 7:0 opcode;reg 23:0 addr;instruction;/命名的结构体 instruction IR;/结构体实例 一个结构体能够使用值的级联来完整地赋值,比如:instruction=5,200;结构体能够作为一个整体传递到函数或者任务,也能够从函数或者任务传递过来,也能够作为模块端口进行传递。9.数组 在 Verilog 中能够声明一个数组类型,reg 与线网类型还
18、能够具有一个向量宽度。在一个对象名前面声明的尺寸表示向量的宽度,在一个对象名后面声明的尺寸表示数组的深度。比如:reg 7:0 r1 1:256;/256 个 8 位的变量 在 SystemVerilog 中我们使用不一致的术语表示数组:使用“压缩数组(packed array)”这一术语表示在对象名前声明尺寸的数组;使用“非压缩数组(unpacked array)”这一术语表示在对象名后面声明尺寸的数组。压缩数组能够由下面的数据类型构成:bit、logic、reg、wire 与其它的线网类型。不管是压缩数组还是非压缩数组都能够声明成多维的尺寸。bit 7:0 a;/一个一维的压缩数组 bit
19、 b 7:0;/一个一维的非压缩数组 bit 0:11 7:0 c;/一个二维的压缩数组 bit 3:0 7:0 d 1:10;/一个包含 10 个具有 4 个 8 位字节的压缩数组的非压缩数组 非压缩尺寸在压缩尺寸之前引用,这就同意将整个压缩数组作为一个单一的元素进行引用。在上面的例子中,d1引用非压缩数组的一个单一元素,这个元素是一个包含 4 个字节的数组。10.在为命名的块中声明 Verilog 同意变量在一个命名的 begin-end 或者 fork-join 语句组中声明。相关于语句组来说,这些变量是本地的,但它们能够被层次化地引用。在 SystemVerilog 中,既能够在命名的
20、块中也能够在未命名的块中声明。在未命名的块中,不能够使用层次名来访问变量。所有的变量类型,包含用户定义的类型、枚举类型、结构体与联合体都能够在 begin-end 或者 fork-join 语句组中声明。11.常量 在 Verilog 中有三种特性类型的常量:parameter、specparam 与 localparam。而在 SystemVerilog 中,同意使用const 关键字声明常量。比如:const char colon=“:”;12.可重定义的数据类型 SystemVerilog 扩展了 Verilog 的 parameter,使其能够包含类型。这个强大的功能使得一个模块中的数
21、据类型在模块的每一个实例中重新定义。比如:module foo;#(parameter type VAR_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、i
22、nteger 与 time。而在 SystemVerilog 中则去除了这种限制,任何数据类型都能够通过端口传递,包含实数、数组与结构体。14.字母值 在 Verilog 中,当指定或者赋值字母值的时候存在一些限制。而 SystemVerilog 则为字母值如何指定作了下面的增强:一个字母值的所有位均能够使用0、1、z 或者x 作相同的填充。这就同意填充一个任意宽度的向量,而无需显式地指定向量的宽度,比如:bit 63:0 data;data=1;/将 data 的所有位设置成 1 一个字符串能够赋值成一个字符数组,象 C 语言一样加入一个空结束符。假如尺寸不一致,它象 C 中一样进行左调整,
23、比如:char foo 0:12=“hello worldn”;加入了几个特殊的串字符:v:垂直 TAB f:换页 a:响铃 x02:用十六进制数来表示一个 ASCII 字符 数组能够使用类似于 C 初始化的语法赋值成字符值,但它还同意复制操作符。括号的嵌套务必精确地匹配数组的维数(这一点与 C 不一致),比如:int n 1:2 1:3=0,1,2,34;15.强制类型转换 Verilog 不能将一个值强制转换成不一致的数据类型。SystemVerilog 通过使用操作符提供了数据类型的强制转换功能。这种强制转换能够转换成任意类型,包含用户定义的类型。比如:int(2.0*3.0)/将结果转
24、换为 int 类型 mytype(foo)/将 foo 转换为 mytype 类型 一个值还能够通过在强制转换操作符前指定一个 10 进制数来转换成不一致的向量宽度,比如:17(x-2)/将结果转换为 17 位宽度 也能够将结果转换成有符号值,比如:signed(x)/将 x 转换为有符号值 16.操作符 Verilog 没有 C 语言的递增(+)与递减(-)操作符。而 SystemVerilog 加入了几个新的操作符:+与-:递增与递减操作符;+=、-=、*=、/=、%=、&=、=、|=、=、=赋值操作符;17.唯一性与优先级决定语句 在 Verilog 中,假如没有遵循严格的编码风格,它的
25、 if-else 与 case 语句会在 RTL 仿真与 RTL 综合间具有不一致的结果。假如没有正确使用 full_case 与 parallel_case 综合指令还会引起一些其它的错误。SystemVerilog 能够显式地指明什么时候一条决定语句的分支是唯一的,或者者什么时候需要计算优先级。我们能够在 if 或者 case 关键字之前使用 unique 或者 requires 关键字。这些关键字能够向仿真器、综合编译器、与其它工具指示我们期望的硬件类型。工具使用这些信息来检查 if 或者case 语句是否正确建模了期望的逻辑。比如,假如使用 unique 限定了一个决定语句,那么在不希
26、望的 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;/值 3、5、6、7 会引起一个警告 priority if(a2:1=0)y=in1;/a 是 0 或者 1 else if(a2=0)y=in2;/a 是 2 或者 3 else y=in3;/假如 a 为其他的值 unique case(a)0,1:y=in1;2:y=in2;4:y=in3;endcase/值 3、5、6、7 会引起一个警告 priority casez(a)2b00?:
27、y=in1;/a 是 0 或者 1 2b0?: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 语句跳转到语句组的尾部外
28、,没有提供任何其它跳转语句。使用 disable 语句执行中止与继续功能要求加入块的名字,同时会产生不直观的代码。SystemVerilog 加入了 C 语言的 break 与 continue 关键字,这两个关键字不要求使用块名字。另外,SystemVerilog 还加入了一个 return 关键字,它能够用来在任何执行点上退出一个任务或者函数。break:退出一个循环,与 C 语言相同;continue:跳转到一个循环的尾部,与 C 语言相同;return 表达式:退出一个函数;return:退出一个任务或者 void 类型的函数。SystemVerilog 没有包含 C 语言中的 got
29、o 语句。20.块名字与语句标签 在 Verilog 中,我们能够通过在 begin 或者 fork 关键字之后指定名字来为 begin-end 或者 fork-jion 语句指定名字。这个指定的名字代表整个语句块。SystemVerilog 还同意在end 或者 jion 关键字之后指定一个匹配的块名字。这种机制很容易将 end 或者 jion 与对应的 begin 或者 fork 联系起来,特别是在一个长的块或者嵌套的块中。块结尾处的名字是可选的,但假如使用的话,它务必与块起始处的名字相同。比如:begin:foo /在 begin 之后的块名字 fork:bar/具有名字的嵌套的块 ji
30、on:bar/务必具有相同的名字 end:foo/务必具有相同的名字 SystemVerilog 还同意像 C 语言一样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。比如:initial begin test1:read_enable=0;test2:for(i=0;i=255;i+)end 21.对事件操纵的增强 Verilog 使用标记来操纵基于特定事件的执行流,SystemVerilog 增强了事件操纵。有条件的事件操纵 标记的一个基本应用就是推断一个具有使能输入的锁存器。下面的例子演示了一个锁存器建模的基本风格。always(data or en)if(en)y=da
31、ta;这种编码风格对仿真来说是效率低下的,由于即使在使能输入无效的时候,数据输入的每次改变都会触发事件操纵。SystemVerilog 在事件操纵中加入了一个 iff 条件。只有 iff 条件为确实条件下,事件操纵才会被触发。通过将使能推断移入到事件操纵里面,使得只有在锁存器输出能够改变的时候事件操纵才会被触发。比如:always(a or en iff en=1)y=a;事件操纵中的表达式 Verilog 同意在事件操纵列表中使用表达式,比如:always(a*b)always(memoryaddress)在第一个例子中,是当操作数发生改变的时候还是只有当运算结果发生改变的时候才会触发事件操
32、纵?在第二个例子中,是当 memory 的地址发生变化的时候还是只有当 memory 的值发生变化的时候才会触发事件操纵?当事件操纵中包含表达式的时候,IEEE Verilog 标准同意仿真器进行不一致的优化。这就可能导致在不一致的仿真器间有不一致的仿真结果,可能还会导致仿真与综合之间的结果不一致。SystemVerilog 加入了一个 changed 关键字,在事件操纵列表中它被用作一个修饰符。(changed(表达式)能够显式地定义只有当表达式的结果发生改变的时候才会触发事件操纵。比如:always(changed(a*b)always(changed memoryaddress)事件操纵
33、中的赋值 Verilog 不同意在事件操纵中使用赋值。SystemVerilog 同意在事件操纵中使用赋值表达式。事件操纵仅仅敏感于赋值表达式右侧的变化。比如:always(y=a*b)22.新的过程 Verilog 使用 always 过程来表示时序逻辑、组合逻辑与锁存逻辑的 RTL 模型。综合工具与其它软件工具务必根据过程起始处的事件操纵列表与过程内的语句来推断 always 过程的意图。这种推断会导致仿真结果与综合结果之间的不一致。SystemVerilog 增加了三个新的过程来显式地指示逻辑的意图。always_ff:表示时序逻辑的过程;always_comb:表示组合逻辑的过程;al
34、ways_latch:表示锁存逻辑的过程。比如:always_comb(a or b or sel)begin if(sel)y=a;else y=b;end 软件工具能够检查事件操纵敏感列表与过程的内容来保证逻辑的功能匹配过程的类型。比如,工具能够检查一个always_comb 过程能够敏感过程内读取的所有外部值,对逻辑的每一个分支的相同变量进行赋值,同时检查分支是否覆盖了所有可能的条件。假如任何一个条件没有满足,软件工具均会报告该过程没有正确建模组合逻辑。23.动态过程 Verilog通过使用fork-jion提供了一种静态的并发过程。每一个分支都是一个分离的、并行的过程。fork-jio
35、n 中任何语句的执行务必在组内的每一个过程完成后才会执行。比如:initial begin 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 关键字加入了一个新的、动态的过程。它为一个过程产生分支,然后继续执行而无需等待其他过程完成。过程不可能堵塞过程或者任务内的语句执行。这种方式能够建模多线程的过程。比如:initial
36、begin process send_packet_task(1,255,0);process send_packet_task(7,128,5);process watch_result_task(1,255,0);process watch_result_task(7,128,5);end/所有的过程并行运行 24.任务与函数增强 SystemVerilog为Verilog的任务与函数作了几个增强。静态与自动的存储 缺省情况下,在 Verilog 任务或者函数内的所有存储都是静态的。Verilog-2001 同意将任务与函数声明成自动的。在 SystemVerilog 中:(1).在一个静
37、态任务与函数内的特定数据能够显式地声明成自动的。声明成自动的数据在块中具有完整的生命周期,同时在任务与函数调用的入口处初始化;(2).在一个自动的任务或者函数中的特定数据能够显式地声明成静态的。自动的任务或者函数中声明成静态的数据在一个块的本地范围内具有静态的生命周期。从任何点返回 Verilog 在一个任务或者函数中执行到 endtask 或者 endfunction 关键字的时候返回。函数的返回值是给函数名赋的最后一个值。SystemVerilog 加入了一个 return 关键字,使用这个关键字,一个任务或者函数能够在任何点上返回。多语句 Verilog 要求一个任务或者函数只具有一个语
38、句或者语句块。多条语句务必组合到一个单一的 begin-end 或者 fork-jion 块中。SystemVerilog 去除了这种限制。因此,多条语句能够在一个任务或者函数中列出而无需使用的 begin-end或者 fork-jion。每有分组的语句就像在 begin-end 中一样顺序执行。我们还能够产生一个没有语句的任务或者函数定义。void 函数 Verilog 要求一个函数具有一个返回值,函数的调用接收这个返回值。SystemVerilog 加入了一个 void 数据类型,这个数据类型能够作为一个函数的返回值类型。void 函数能够像 Verilog 任务一样进行调用,而无需接收一
39、个返回值。void 函数与任务的差别在于函数存在几个限制,比如没有的时候间操纵等。函数的输入与输出 Verilog 标准要求一个函数至少具有一个输入同时函数只能具有输入。SystemVerilog 去除了这些限制。函数能够具有任意数目的输入、输出与输入输出,也能够什么也没有。25.连续赋值的增强 在 Verilog 中,连续赋值语句的左侧只能是线网类型,比如 wire。连续赋值语句被认为是线网的驱动源,而线网能够拥有任意数据的驱动源。SystemVerilog 同意除 reg 类型以外的任何数据类型用于连续赋值语句的左侧。与线网不一致,所有其它数据类型被限制为只能有一个连续赋值语句驱动。为相同
40、的变量混合使用连续赋值语句与过程赋值语句是不被同意的。26.$bit 系统函数 在 Verilog 中没有类似于 C 语言中 sizeof 的函数。SystemVerilog 加入一个新的$bit 内建函数。这个函数返回储存一个值所需的硬件位的数目(一个四态值要求一个硬件位),这个函数还能够用来确定一个结构体所代表的硬件位的数目。27.define 的增强 SystemVerilog 增强了define 编译器指令的能力以便支持将字符串作为宏的参数。宏的文本字符串中能够包含一个隔离的引号,它的前面务必具有一个反勾号(”),这就同意字符串中包含宏参数。宏文本能够在行的尾部包含一个反斜杠()来表示
41、在下一行继续。假如宏文本字符串中包含反斜杠,则反斜杠应该被放在两个反勾号之间,这样它就不可能被认为是 Verilog 转义标识符的开始。宏文本字符串还能够包含双反勾号(),它同意标识符能够从参数中构建。这些增强使得define 指令更加灵活。比如:include 指令后能够紧跟一个宏名字来替代一个字符串。define f1“./project_top/opcode_defines”include f1 28.状态机建模 SystemVerilog 同意在更高的抽象层次上对状态机建模。这些结构包含:枚举类型 一个特殊的 state 数据类型;一个迁移语句 一个迁移操作符 29.断言 SystemVerilog 中加入了断言的功能来改善系统的验证过程。30.结论 SystemVerilog为Verilog-2001标准提供了一系列的扩展。这些扩展使得大型设计的建模与验证更加容易。