您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > system_verilog教程
基于断言的验证技术SystemVerilogTutorials下面的手册会帮助你了解一些SystemVerilog中最重要的新特点。手册还提供了一些代码样本和例子使你可以对语言有更好感觉。这些辅导假设你们已经了解了一些Verilog语言。如果没有,你可以先去看看Verilog设计者指南(VerilogDesigner’sGuide)。*Datatypes*RTLdesign*Interfaces*Clocking*Assertion-basedverification*Classes*Testbenchautomationandconstraints*TheDirectProgrammingInterface(DPI)SystemVerilog的数据类型这个手册将描述Systemverilog新引进的数据类型。他们大多数都是可以综合的,并且可以使RTL级描述更易于理解和书写。整型和实型SystemVerilog引进了几种新的数据类型。C语言程序员会熟悉其中的大多数。引进新的数据类型构思是这样的,如果C语言和SystemVerilog有相同的数据类型可以使C语言算法模型更容易的转化为SystemVerilog模型。Verilog的变量类型有四态:既是0,1,X,Z。SystemVerilog引进了新的两态数据类型,每一位只可以是0或是1。当你不需要使用的X和Z值时,譬如在写Testbench和做为for语句的循环变量。使用两态变量的RTL级模型,可以使模拟器更有效率。并且使用得当的话将不会对综合结果产生影响。二态整型类型描述例子Bituser-definedsizebit[3:0]a_nibble;Byte8bits,unsignedbytea,b;Shortint16bits,signedshortintc,d;Int32bits,signedinti,j;Longint64bits,signedlongintlword;注意到和C语言不一样,SystemVerilog指定了一些固定宽度的类型。四态整型类型描述例子Reguser-definedsizereg[7:0]a_byte;Logicidenticaltoregineverywaylogic[7:0]a_byte;Integer32bits,signedintegeri,j,k;logic是一种比reg型更好的类型,他更加的完善。我们将会看到你可以在过去veriloghdl中用reg型或是wire型的地方用logic型来代替。非整数类型类型描述例子Time64-bitunsignedtimenow;ShortreallikefloatinCshortrealf;ReallikedoubleinCdoubleg;Realtimeidenticaltorealrealtimenow;数组在Verilog-1995中,你可以定义标量或是矢量类型的网线和变量。你也可以定义一维数组变量类型的存储器数组。在Verilog-2001中允许多维的网线和变量数组存在,并且取消了一些存储器数组用法的限制。在SystemVerilog中数组有了新的发展,并对数组重新进行了重新定义,从而允许对数组进行更多的操作。在SystemVerilog,中,数组可以具有压缩数组或是非压缩数组的属性,也可以同时具有两种属性。考虑下面的例子:reg[3:0][7:0]register[0:9];压缩数组是[3:0]和[7:0],非压缩数组是[0:9]。(只要你喜欢可以有同样多的压缩数组和非压缩数组)压缩数组*保证将在存储器中产生持续的数据*可以复制到任何其他的压缩对象中*可切片(部分选取)*仅限于bit类型(bit,logic,int等),其中有些(如int)有固定的尺寸相比之下,非压缩数组可以放在模拟器选择的任何地方,可以可靠地复制到另一个相同数据类型的数组中。对于不同数据类型的数组,你必须使用映射(有几个非压缩数组映射到压缩数组的规则)。非压缩数组可以是任何的类型,如实数数组。SystemVerilog允许对完整的非压缩数组和部分选取的非压缩数组进行一些操作。对与此,部分选取的数组必须是相同的数据类型和大小。如非压缩数组必须要有相同的位数和长度。而压缩数组不一样,只要选取的部分有相同数量的位数。允许的操作有*读和写整个数组*读和写部分选取的数组*读和写数组中的位*在数组,部分选取的数组和数组的位有同样的优先级SystemVerilog也支持动态数组(在仿真中数组长度可以改变)和关联数组(数组中的数据非连续排列)。为了支持这些数组类型,SystemVerilog中提供了一些数组查找的函数和方法。如你可以使用$dimensions函数查询一个数组变量的的维数。TypedefSystemVerilog的数据类型系统允许定义复杂的数据类型。为了使代码看起来清晰,引进了别名的方法。别名的方法允许使用者在他们的代码中用自己的名字来定义经常使用的数据类型,当构造复杂的数组时用别名的方法是很方便的。typedefreg[7:0]octet;octetb;和reg[7:0]b;的效果是一致的typedefoctet[3:0];quadOctet;quadOctetqBytes[1:10];和reg[3:0][7:0]qBytes[1:10];的效果是一致的EnumSystemVerilog也引进了枚举类型,例如enum{circle,ellipse,freeform}c;枚举允许您用于声明一组命名的常数。这样的数据类型是适用表示状态值、操作码和其它的非数字或象征性的数据。Typedef和枚举经常一起使用,象这样:typedefenum{circle,ellipse,freeform}ClosedCurve;ClosedCurvec;枚举类型命名值的作用类似于常数。它的默认类型是int。您能复制他们到/从枚举类型的变量,互相比较他们等等。枚举类型的强制类型。您无法复制一个数值到枚举类型变量,除非您使用定义影射。c=2;//ERRORc=ClosedCurve'(2);//Casting–okay然而,当你在一个表达式中使用了枚举类型,你所使用的值等效于分开写的整数;所以例子中的这是一个比较好的枚举变量与整数的比较;而且它也可以在整数表示式中使用枚举值。结构体和共同体同样,SystemVerilog也引进了结构体和共同体,s类似于C.struct{intx,y;}p;结构体成员选择使用.名字的语法。p.x=1;结构体的表达可以使用括号。p={1,2};结构体在使用typedef声明新的结构类型和使用新的类型声明变量时是非常有用的。注意结构体也是可以被封装的。typedefstructpacked{intx,y;}Point;Pointp;共同体在用相同的硬件资源(如寄存器)储存不同类型的值(如整数、浮点)时候是非常有用的。SystemVerilogRTLTutorial这个手册将介绍systemverilog的一些新特点,这样使RTL级设计更加方便,更有效率。新的操作符SystemVerilog增加了一些新的操作符,其中的大部分是从C语言中引进来的。新增加的操作符包括自增(++),自减(--)和指派运算符(+=,-=)。全等运算符(===和!==)作用类似于casex声明,值X和值Z都被认为是无关位。新的循环声明也是从C语言中引进来的,包括do-while循环,break和continue。新的foreach操作符用在数组变量中。而且增强了for循环的功能,下面的做法是正确的,for(inti=15,logicj=0;i0;i--,j=~j)标签在Verilog中,你可以这样标识begin和fork语句:begin:a_label在SystemVerilog语句标签可以在end处重复一遍:end:a_label这对管理代码是非常有用的。在end处的标签必须和在开始处的标签相一致。Modules,tasks和andfunctions也可以在在代码的末尾处重复标签名。moduleMyModule......endmodule:MyModule在SystemVerilog中允许在任何过程声明中添加标签:loop:for(inti=0;...这对for循环特别有用,因为这样的话for循环可以被终止。尽管通过这种方式增强了块的命名,但是至少有一个这样的理由取消他们的使用,那就是在SystemVerilog变量也可以在未命名的块中被使用!!RelaxedAssignmentRules对verilog的初学者来说这也许是最难的(甚至老练的Verilog用户也时常被难住由它时常绊倒)是线网和变量之间的不同点。SystemVerilog包含了太多的混乱史:变量可以通过过程赋值语句,连续赋值语句和通过module例化连接到输出端来赋值。但不幸的是,仍不能连接variable到inout端口,虽然你可以通过使用ref端口来实现。那意味这在SystemVerilog中,你可以在大部分时间里使用logic数据类型,而在verilog中你有时得用reg而有时却得使用wire。实际上reg和logic几乎是相互等同的,但logic是一个更合适的名字。这里还有些限制,不允许使用多于一次的持续赋值语句和输出端口连接的给同一变量赋值。这是因为没有类似于线网的多重驱动变量的定论。因此,假如你通过这些方式给一个变量赋过值,你将不能再用过程赋值语句给变量赋值。PortConnectionShorthand如果你使用Verilog-2001,编写测试环境的模块有如下声明:moduleDesign(inputClock,Reset,input[7:0]Data,output[7:0]Q);在测试环境中,你可以这样声明regs和wires:regClock,Reset;reg[7:0]Data;wire[7:0]Q;你可以这样例化模块:DesignDUT(Clock,Reset,Data,Q);更好的可以这样声明DesignDUT(.Clock(Clock),.Reset(Reset),.Data(Data),.Q(Q));但这样有点过于重复。Systemverilog允许你使用如下的速记符号:DesignDUT(.Clock,.Reset,.Data,.Q);如果先前适当的声明了线网和变量,也可以这样:logicClock,Reset;logic[7:0]Data;logic[7:0]Q;如果还嫌太罗嗦,你也可以这样写:DesignDUT(.*);意思是连接所有端口到和端口相同名字变量或网线。你无须这样连接所有的端口。例如:DesignDUT(.Clock(SysClock),.*);意思是”连接Clock端口到SysClock,然后别的端口变量连接到到和端口相同名字变量或网线”。综合用语Verilog非常广泛的应用在RTL综合,即使它本身不是作为综合语言设计的。可以非常容易的写出仿真正确的Verilog代码,但设计却是不正确的,例如,它总是有意无意地容易推断透明琐存器。SystemVerilog解决一种方式是引进了新的always关键字:always_comb、always_latch和always_ff。always_comb被用于描述组合逻辑。它通过读取进程中的变量和线网自动地产生一张完全敏感列表,象总@*在Verilog-2001中一样:always_combif(sel)f=x;elsef=y;此外,为了自动的产生一个完整的敏感列表,它递归的查看功能单元然后把别的必要的信号插入到敏感列表中。它被定义为在组合逻辑中执行一些规则,它可以作为一个暗示(特别是对综合工具)采用更为严谨的综合风格而且添加了新的语义checks.finally、always_comb:它暗示了敏感列表截至进程的结束,以便它在时间为零时评估一次并因此所有它的输出有占去适当的值在仿真时间开始处理进步之前。这是一次公正评价时间为零,因此所有产出值负起适当时间开始前模拟进度.al
本文标题:system_verilog教程
链接地址:https://www.777doc.com/doc-2851068 .html