预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共26页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

SystemVerilog语言简介SystemVerilog是一种硬件描述和验证语言(HDVL)它基于IEEE1364-2001Verilog硬件描述语言(HDL)并对其进行了扩展包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Accellera开发它主要定位在芯片的实现和验证流程上并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。1.接口(Interface)Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口我们必须对期望的硬件设计有一个详细的认识。不幸的是在设计的早期我们很难把握设计的细节。而且一旦模块的端口定义完成后我们也很难改变端口的配置。另外一个设计中的许多模块往往具有相同的端口定义在Verilog中我们必须在每个模块中进行相同的定义这为我们增加了无谓的工作量。SystemVerilog提供了一个新的、高层抽象的模块连接这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下一个接口可以认为是一组线网。例如可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入各个设计细节也会变得越来越清晰而接口内的信号也会很容易地表示出来。当接口发生变化时这些变化也会在使用该接口的所有模块中反映出来而无需更改每一个模块。下面是一个接口的使用实例:interfacechip_bus;//定义接口wireread_requestread_grant;wire[7:0]addressdata;endinterface:chip_busmoduleRAM(chip_busio//使用接口inputclk);//可以使用io.read_request引用接口中的一个信号endmodulemoduleCPU(chip_busioinputclk);...endmodulemoduletop;regclk=0;chip_busa;//实例接口//将接口连接到模块实例RAMmem(aclk);CPUcpu(aclk);endmodule实际上SystemVerilog的接口不仅仅可以表示信号的绑定和互连。由于SystemVerilog的接口中可以包含参数、常量、变量、结构、函数、任务、initial块、always块以及连续赋值语句所以SystemVerilog的接口还可以包含内建的协议检查以及被使用该接口的模块所共用的功能。2.全局声明和语句在Verilog中除了一个模块可以作为模块实例引用其他模块外并不存在一个全局空间。另外Verilog允许任意数目的顶层模块因此会产生毫无关联的层次树。SystemVeriog增加了一个被称为$root的隐含的顶级层次。任何在模块边界之外的声明和语句都存在于$root空间中。所有的模块无论它处于哪一个设计层次都可以引用$root中声明的名字。这样如果某些变量、函数或其它信息被设计中的所有模块共享那么我们就可以将它们作为全局声明和语句。全局声明和语句的一个使用实例如下:regerror_flag;//全局变量functioncompare(...);//全局函数always@(error_flag)//全局语句...moduletest;chip1u1(...)endmodulemodulechip1(...);FSMu2(...);always@(data)error_flag=compare(dataexpected);endmodulemoduleFSM(...);...always@(state)error_flag=compare(stateexpected);endmodule3.时间单位和精度在Verilog中表示时间的值使用一个数来表示而不带有任何时间单位。例如:forever#5clock=~clock;从这一句中我们无法判断5代表的是5ns?5ps?还是其他。Verilog的时间单位和精度是作为每一个模块的属性并使用编译器指令`timescale来设置。使用这种方法具有固有的缺陷因为编译器指令的执行依赖于源代码的编译顺序编译器总是将它遇到的最后一个`timescal