systemverilog语法和验证相关流程.docx

上传人:b****5 文档编号:3325240 上传时间:2022-11-21 格式:DOCX 页数:18 大小:28.20KB
下载 相关 举报
systemverilog语法和验证相关流程.docx_第1页
第1页 / 共18页
systemverilog语法和验证相关流程.docx_第2页
第2页 / 共18页
systemverilog语法和验证相关流程.docx_第3页
第3页 / 共18页
systemverilog语法和验证相关流程.docx_第4页
第4页 / 共18页
systemverilog语法和验证相关流程.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

systemverilog语法和验证相关流程.docx

《systemverilog语法和验证相关流程.docx》由会员分享,可在线阅读,更多相关《systemverilog语法和验证相关流程.docx(18页珍藏版)》请在冰豆网上搜索。

systemverilog语法和验证相关流程.docx

systemverilog语法和验证相关流程

.

 

1、IC验证环境的基本框图

 

测试平台

 

发生器Testcase

 

代理

记分板

检测器

驱动层

断言

监测器

 

待测设计

 

发生器(generator)用来解释testcase,其实也就是把testcase翻译成具体的数据包,或者数据码流。

代理这个东西就是把数据分配下去,他与记分板和检测器一起称为

功能层。

记分板(scoreboard)用来临时存放一些数据,用于数据的比较。

常与检测器合在一起,共同完成数据的比较,查错。

他们要实现的一个与待测设计相同功能的模块,用于自动比较的。

其实也就是要设计一个能实现相同

功能的模块,一般小的模块这部分设计都是由验证工程师自己完成的,如果是复杂的模块由于验证工程师还要关注其他的模块,这块功能可以由其他地

方提供,比如一些现成的C语言代码,验证工程师把这个C代码嵌入的验证环境中就可以了,这个地方的实现方式比较多,也是验证的一个精华的地方吧。

主要的debug也就在这个地方实现的。

驱动层(driver)顾名思义,就是用来驱动我们的待测设计(DUT

(deviceundertest))。

就是把数据包处理成具体的操作激励,也就是那些波形了。

监测器(monitor)用来采集待测设计(DUT)的输出波形,然后传回scoreboard用于和标准结果比较,验证DUT工作是否正确。

断言(assert)是个好东西,但是如果紧紧依靠验证工程师这个东西是没办法用好的,这个东西非常需要设计人员配合。

Assert功能很强大,也

很容易上手,能深层次的发掘设计错误,定位很准确,也正是由于这些优点,所以验证工程师不能非常容易的使用它,因为验证工程师一般可以不需要了解太多的设计细节就可以对设计模块进行验证,但是assert需要比较清楚的了解内部信号,才能将内部信号连接到相应的assert上。

建议IC设计工程师学习哦。

对debug很有帮助的哦。

这个模块在有的验证环境中是不使用。

最后说一下覆盖率的问题。

覆盖率分为功能覆盖率,代码覆盖率,

 

1/12

.

 

还有人为添加的一些覆盖点的覆盖率。

这个其实就是用来衡量验证工作进行到什么程度了。

最容易实现100%的是代码覆盖率,但是如果verilog代码中使用了case的default那就很难实现100%覆盖了。

功能覆盖率就是一些函数的功能,还有状态机的状态覆盖率等等。

然后还有就是验证工程师添加的覆盖点。

一般验证工作完成以后要使用这些东西完成报告的。

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

3、接口(Interface):

Verilog模块之间的连接是通过模块端口进行的。

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

(Interface)。

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

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

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

通过使用接口,我们在进行一个设计

的时候可以不需要首先建立各个模块间的互连。

随着设计的深入,当接口发

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

每一个模块。

接口的使用实例:

interfacechip_bus;//定义接口

wireread_request,read_grant;

wire[7:

0]address,data;

endinterface:

chip_bus

 

moduleRAM(chip_busio,//使用接口io

inputclk);

//可以使用io.read_request引用接口中的一个信号endmodule

 

moduleCPU(chip_busio,inputclk);

...

endmodule

 

moduletop;

regclk=0;

chip_busa;//实例接口

//将接口连接到模块实例

RAMmem(a,clk);CPUcpu(a,clk);

endmodule

实际上,SystemVerilog的接口不仅仅可以表示信号的绑定和互连。

由于SystemVerilog的接口中可以包含参数、常量、变量、结构、函数、任务、initial

 

2/12

.

 

块、always块以及连续赋值语句,所以SystemVerilog的接口还可以包含内建的协议检查以及被使用该接口的模块所共用的功能。

4、全局声明和语句

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

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

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

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

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

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

句。

全局声明和语句的一个使用实例如下:

regerror_flag;//全局变量

functioncompare(...);//全局函数

always@(error_flag)//全局语句

...

moduletest;

chip1u1(...)

endmodule

 

modulechip1(...);

FSMu2(...);

always@(data)

error_flag=compare(data,expected);endmodule

moduleFSM(...);

...

always@(state)

error_flag=compare(state,expected);endmodule

5、时间单位和精度

在Verilog中,表示时间的值使用一个数来表示,而不带有任何时间单位。

例如:

forever#5clock=~clock;

从这一句中我们无法判断5代表的是5ns?

5ps?

还是其他。

Verilog的时间

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

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

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

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

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

例如:

forever#5nsclock=~clock;

其次,SystemVerilog允许使用新的关键字(timeunits和timeprecision)

来指定时间单位和精度。

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

 

3/12

.

 

空间中全局指定。

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

例如:

timeunits1ns;//时间单位

timeprecision10ps;//时间精度

6、.抽象数据类型

Verilog提供了面向底层硬件的线网、寄存器和变量数据类型。

这些类型

代表了4态逻辑值(0,1,x,z),通常用来在底层上对硬件进行建模和验证。

线网

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

SystemVerilog包括了C语言的char和int数据类型,它允许在Verilog模

型和验证程序中直接使用C和C++代码。

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

SystemVerilog还为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类型更能有效地仿真和综合。

 

4/12

.

 

7、有符号和无符号限定符

缺省情况下,Verilognet和reg数据类型是无符号类型,integer类型是一个有符号类型。

Verilog-2001标准允许使用signed关键字将无符号类型显式地声明成有符号类型。

SystemVerilog加入了相似的能力,它可以通过unsig

ned关键字将有符号数据类型显式地声明成有无符号数据类型。

例如:

intunsignedj;

值得注意的是unsigned在Verilog中是一个保留字,但并没有被Verilog标

准使用。

8、用户定义的类型

Verilog不允许用户定义新的数据类型。

SystemVerilog通过使用typedef提供

了一种方法来定义新的数据类型,这一点与C语言类似。

用户定义的类型可以与其它数据类型一样地使用在声明当中。

例如:

typedefunsignedintuint;

uinta,b;

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

typedefint48;//空的typedef,在其他地方进行完整定义int48c;

9、枚举类型

在Verilog语言中不存在枚举类型。

标识符必须被显式地声明成一个线网、变量或参数并被赋值。

SystemVerilog允许使用类似于C的语法产生枚举类型。

一个枚举类型具有一组被命名的值。

缺省情况下,值从初始值0开始递增,但是我们可以显式地指定初始值。

枚举类型的例子如下:

enum{red,yellow,green}RGB;

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

我们还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使用。

例如:

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

booleanready;

booleantest_complete;

10、结构体和联合体

在Verilog语言中不存在结构体或联合体,而结构体或联合体在将几个声明组合在一起的时候非常有用。

SystemVerilog增加了结构体和联合体,它们的声明语法类似于C。

struct{

reg[15:

0]opcode;

reg[23:

0]addr;

}IR;

union{

intI;

shortrealf;

}N;

 

5/12

.

 

结构体或联合体中的域可以通过在变量名和域名字之间插入句点(.)来引

用:

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

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

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

typedefstruct{

reg[7:

0]opcode;

reg[23:

0]addr;

}instruction;//命名的结构体instructionIR;//结构体实例

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

instruction={5,200};

结构体可以作为一个整体传递到函数或任务,也可以从函数或任务传递过来,也可以作为模块端口进行传递。

11、数组

在Verilog中可以声明一个数组类型,reg和线网类型还可以具有一个向量宽度。

在一个对象名前面声明的尺寸表示向量的宽度,在一个对象名后面声明的尺寸表示数组的深度。

例如:

reg[7:

0]r1[1:

256];//256个8位的变量

在SystemVerilog中我们使用不同的术语表示数组:

使用“压缩数组(packedarray)”这一术语表示在对象名前声明尺寸的数

组;

使用“非压缩数组(unpackedarray)”这一术语表示在对象名后面声明尺

寸的数组。

压缩数组可以由下面的数据类型组成:

bit、logic、reg、wire以及其它的线

网类型。

无论是压缩数组还是非压缩数组都可以声明成多维的尺寸。

bit[7:

0]a;//一个一维的压缩数组

bitb[7:

0];//一个一维的非压缩数组

bit[0:

11][7:

0]c;//一个二维的压缩数组

bit[3:

0][7:

0]d[1:

10];//一个包含10个具有4个8位字节的压缩数组的非压缩数组

 

非压缩尺寸在压缩尺寸之前引用,这就允许将整个压缩数组作为一个单一的

元素进行引用。

在上面的例子中,d[1]引用非压缩数组的一个单一元素,这

个元素是一个包含4个字节的数组。

12、在未命名的块中声明

Verilog允许变量在一个命名的begin-end或fork-join语句组中声明。

相对

于语句组来说,这些变量是本地的,但它们可以被层次化地引用。

在System

Verilog中,既可以在命名的块中也可以在未命名的块中声明。

在未命名的块

中,不能够使用层次名来访问变量。

所有的变量类型,包括用户定义的类型、

枚举类型、结构体和联合体都可以在begin-end或fork-join语句组中声明。

13、常量

在Verilog中有三种特性类型的常量:

parameter、specparam和localparam。

而在SystemVerilog中,允许使用const关键字声明常量。

例如:

 

6/12

.

 

constcharcolon=“:

;”

14、可重定义的数据类型

SystemVerilog扩展了Verilog的parameter,使其可以包含类型。

这个强大的功能使得一个模块中的数据类型在模块的每一个实例中重新定义。

例如:

modulefoo;

#(parametertypeVAR_TYPE=shortint;)(inputlogic[7:

0]i,outputlogic[7:

0]o);

VAR_TYPEj=0;//如果不重新定义,j的数据类型为shortint

 

endmodule

 

modulebar;

logic[3:

0]i,o;

foo#(.VAR_TYPE(int))u1(i,o);//实例化模块重新将VAR_TYPE

定义成int类型

endmodule

15、模块端口连接

在Verilog中,可以连接到模块端口的数据类型被限制为线网类型以及变量类

型中的reg、integer和time。

而在SystemVerilog中则去除了这种限制,任何数据类型都可以通过端口传递,包括实数、数组和结构体。

16、字母值

一个字符串可以赋值成一个字符数组,像C语言一样加入一个空结束符。

如果尺寸不同,它像C中一样进行左调整,例如:

charfoo[0:

12]=“helloworldn”;

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

v:

垂直TAB

f:

换页

a:

响铃

x02:

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

数组可以使用类似于C初始化的语法赋值成字符值,但它还允许复制操作

符。

括号的嵌套必须精确地匹配数组的维数(这一点与C不同),例如:

intn[1:

2][1:

3]={{0,1,2},{3{4}}};

intn[行数][列数]={第一行,第二行}

17、强制类型转换和强制数据宽度转换:

Verilog不能将一个值强制转换成不同的数据类型。

SystemVerilog通过使用’操作符提供了数据类型的强制转换功能。

这种强制转换可以转换成任意类型,包括用户定义的类型。

例如:

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

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

一个值还可以通过在强制转换操作符前指定一个10进制数来转换成不同的

向量宽度,例如:

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

也可以将结果转换成有符号值,例如:

7/12

.

 

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

18、操作符

Verilog没有C语言的递增(++)和递减(--)操作符。

而SystemVerilog加入了几个新的操作符:

++和--:

递增和递减操作符;

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

19、唯一性和优先级决定语句

在Verilog中,如果没有遵循严格的编码风格,它的if-else和case语句会在

RTL仿真和RTL综合间具有不一致的结果。

如果没有正确使用full_case和p

arallel_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;

//a的值3、5、6、7

会引起一个警告

priority

if(a[2:

1]==0)

y=in1;//a是0或1

else

if(a[2]==0)

y=in2;//a是2或3

else

y=in3;

//

如果a为其他的值

 

uniquecase(a)

0,1:

y=in1;

2:

y=in2;

4:

y=in3;

endcase//值3、5、6、7会引起一个警告

 

prioritycasez(a)

2’b00?

:

y=in1;//a是0或1

2’b0?

?

:

y=in2;//a是2或3

default:

y=in3;//如果a为其他的值

endcase

20、底部检测的循环

Verilog包含for、while和repeat循环,这几个循环都是在循环的起始处检测

循环条件。

SystemVerilog加入了一个do-while循环,这种循环在执行语句

的结尾处检测循环条件。

21、跳转语句

在语句的执行过程中,C语言提供了几种方式来跳转到新的语句,包括:

ret

urn、break、continue和goto。

在Verilog中除了通过使用disable语句跳

 

8/12

.

 

转到语句组的尾部外,没有提供任何其它跳转语句。

使用disable语句执行

中止和继续功能要求加入块的名字,并且会产生不直观的代码。

SystemVerilog加入了C语言的break和continue关键字,这两个关键字不要求使用块名字。

另外,SystemVerilog还加入了一

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1