




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 IC验证环境的基本框图发生器(generator)用来解释testcase,其实也就是把testcase翻译成具体的数据包,或者数据码流。代理这个东西就是把数据分配下去,他与记分板和检测器一起称为功能层。记分板(scoreboard)用来临时存放一些数据,用于数据的比较。常与检测器合在一起,共同完成数据的比较,查错。他们要实现的一个与待测设计相同功能的模块,用于自动比较的。其实也就是要设计一个能实现相同功能的模块,一般小的模块这部分设计都是由验证工程师自己完成的,如果是复杂的模块由于验证工程师还要关注其他的模块,这块功能可以由其他地方提供,比如一些现成的C语言代码,验证工程师把这个C代码嵌入的验证环境中就可以了,这个地方的实现方式比较多,也是验证的一个精华的地方吧。主要的debug也就在这个地方实现的。驱动层(driver)顾名思义,就是用来驱动我们的待测设计(DUT(device under test)。就是把数据包处理成具体的操作激励,也就是那些波形了。监测器(monitor)用来采集待测设计(DUT)的输出波形,然后传回scoreboard用于和标准结果比较,验证DUT工作是否正确。断言(assert)是个好东西,但是如果紧紧依靠验证工程师这个东西是没办法用好的,这个东西非常需要设计人员配合。Assert功能很强大,也很容易上手,能深层次的发掘设计错误,定位很准确,也正是由于这些优点,所以验证工程师不能非常容易的使用它,因为验证工程师一般可以不需要了解太多的设计细节就可以对设计模块进行验证,但是assert需要比较清楚的了解内部信号,才能将内部信号连接到相应的assert上。建议IC设计工程师学习哦。对debug很有帮助的哦。这个模块在有的验证环境中是不使用。最后说一下覆盖率的问题。覆盖率分为功能覆盖率,代码覆盖率,还有人为添加的一些覆盖点的覆盖率。这个其实就是用来衡量验证工作进行到什么程度了。最容易实现100%的是代码覆盖率,但是如果verilog代码中使用了case的default那就很难实现100%覆盖了。功能覆盖率就是一些函数的功能,还有状态机的状态覆盖率等等。然后还有就是验证工程师添加的覆盖点。一般验证工作完成以后要使用这些东西完成报告的。2、 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。3、 接口(Interface):Verilog模块之间的连接是通过模块端口进行的。SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。接口的使用实例:interface chip_bus; / 定义接口wire read_request, read_grant;wire 7:0 address, data;endinterface: chip_busmodule RAM (chip_bus io, / 使用接口ioinput clk);/ 可以使用io.read_request引用接口中的一个信号endmodulemodule CPU(chip_bus io, input clk);.endmodulemodule top;reg clk = 0;chip_bus a; / 实例接口/ 将接口连接到模块实例RAM mem(a, clk);CPU cpu(a, clk);endmodule实际上,SystemVerilog的接口不仅仅可以表示信号的绑定和互连。由于SystemVerilog的接口中可以包含参数、常量、变量、结构、函数、任务、initial块、always块以及连续赋值语句,所以SystemVerilog的接口还可以包含内建的协议检查以及被使用该接口的模块所共用的功能。4、 全局声明和语句在Verilog中,除了一个模块可以作为模块实例引用其他模块外,并不存在一个全局空间。另外,Verilog允许任意数目的顶层模块,因此会产生毫无关联的层次树。SystemVeriog增加了一个被称为$root的隐含的顶级层次。任何在模块边界之外的声明和语句都存在于$root空间中。所有的模块,无论它处于哪一个设计层次,都可以引用$root中声明的名字。这样,如果某些变量、函数或其它信息被设计中的所有模块共享,那么我们就可以将它们作为全局声明和语句。全局声明和语句的一个使用实例如下:reg error _flag; / 全局变量function compare (.); / 全局函数always (error_flag) / 全局语句.module test;chip1 u1 (.)endmodulemodule chip1 (.);FSM u2 (.);always (data)error_flag = compare(data, expected);endmodulemodule FSM (.);.always (state)error_flag = compare(state, expected);endmodule5、 时间单位和精度在Verilog中,表示时间的值使用一个数来表示,而不带有任何时间单位。例如:forever #5 clock = clock; 从这一句中我们无法判断5代表的是5ns? 5ps? 还是其他。Verilog的时间单位和精度是作为每一个模块的属性,并使用编译器指令timescale来设置。SystemVerilog为了控制时间单位加入了两个重要的增强。首先,时间值可以显式地指定一个单位。时间单位可以是s、ms、ns、ps或fs。时间单位作为时间值的后缀出现。例如:forever #5ns clock = clock; 其次,SystemVerilog允许使用新的关键字(timeunits和timeprecision)来指定时间单位和精度。这些声明可以在任何模块中指定,同时也可以在$root空间中全局指定。时间单位和精度必须是10的幂,范围可以从s到fs。例如:timeunits 1ns; /时间单位timeprecision 10ps;/时间精度6、 . 抽象数据类型Verilog提供了面向底层硬件的线网、寄存器和变量数据类型。这些类型代表了4态逻辑值(0,1,x,z),通常用来在底层上对硬件进行建模和验证。线网数据类型还具有多个强度级别,并且能够为多驱动源的线网提供解析功能。SystemVerilog包括了C语言的char和int数据类型,它允许在Verilog模型和验证程序中直接使用C和C+代码。Verilog PLI不再需要集成总线功能模型、算法模型和C函数。SystemVerilog还为Verilog加入了几个新的数据类型,以便能够在更抽象的层次上建模硬件。lchar:一个两态的有符号变量,它与C语言中的char数据类型相同,可以是一个8位整数(ASCII)或short int(Unicode);lint:一个两态的有符号变量,它与C语言中的int数据类型相似,但被精确地定义成32位;lshortint:一个两态的有符号变量,被精确地定义成16位;llongint:一个两态的有符号变量,它与C语言中的long数据类型相似,但被精确地定义成64位;lbyte:一个两态的有符号变量,被精确地定义成8位;lbit:一个两态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的reg数据类型;llogic:一个四态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的线网或reg数据类型,但具有某些限制;lshortreal:一个两态的单精度浮点变量,与C语言的float类型相同;lvoid:表示没有值,可以定义成一个函数的返回值,与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类型更能有效地仿真和综合。7、 有符号和无符号限定符缺省情况下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。Verilog-2001标准允许使用signed关键字将无符号类型显式地声明成有符号类型。SystemVerilog加入了相似的能力,它可以通过unsigned关键字将有符号数据类型显式地声明成有无符号数据类型。例如:int unsigned j; 值得注意的是unsigned在Verilog中是一个保留字,但并没有被Verilog标准使用。8、 用户定义的类型Verilog不允许用户定义新的数据类型。SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似。用户定义的类型可以与其它数据类型一样地使用在声明当中。例如:typedef unsigned int uint;uint a, b;一个用户定义的数据类型可以在它的定义之前使用,只要它首先在空的typedef中说明,例如:typedef int48; / 空的typedef,在其他地方进行完整定义int48 c;9、 枚举类型在Verilog语言中不存在枚举类型。标识符必须被显式地声明成一个线网、变量或参数并被赋值。SystemVerilog允许使用类似于C的语法产生枚举类型。一个枚举类型具有一组被命名的值。缺省情况下,值从初始值0开始递增,但是我们可以显式地指定初始值。枚举类型的例子如下:enum red, yellow, green RGB;enum WAIT=2b01, LOAD, DONE states;我们还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使用。例如:typedef enum FALSE=1b0, TRUE boolean;boolean ready;boolean test_complete;10、 结构体和联合体在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为结构体或联合体的定义指定一个名字。typedef struct reg 7:0 opcode; reg 23:0 addr; instruction; / 命名的结构体instruction IR; / 结构体实例一个结构体可以使用值的级联来完整地赋值,例如:instruction = 5, 200; 结构体可以作为一个整体传递到函数或任务,也可以从函数或任务传递过来,也可以作为模块端口进行传递。11、 数组在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位字节的压缩数组的非压缩数组非压缩尺寸在压缩尺寸之前引用,这就允许将整个压缩数组作为一个单一的元素进行引用。在上面的例子中,d1引用非压缩数组的一个单一元素,这个元素是一个包含4个字节的数组。12、 在未命名的块中声明Verilog允许变量在一个命名的begin-end或fork-join语句组中声明。相对于语句组来说,这些变量是本地的,但它们可以被层次化地引用。在SystemVerilog中,既可以在命名的块中也可以在未命名的块中声明。在未命名的块中,不能够使用层次名来访问变量。所有的变量类型,包括用户定义的类型、枚举类型、结构体和联合体都可以在begin-end或fork-join语句组中声明。13、 常量在Verilog中有三种特性类型的常量:parameter、specparam和localparam。而在SystemVerilog中,允许使用const关键字声明常量。例如:const char colon = “:”; 14、 可重定义的数据类型SystemVerilog扩展了Verilog的parameter,使其可以包含类型。这个强大的功能使得一个模块中的数据类型在模块的每一个实例中重新定义。例如:module foo; # (parameter type VAR_TYPE = shortint;) (input logic 7:0 i, output logic 7:0 o); VAR_TYPE j = 0; / 如果不重新定义,j的数据类型为shortint endmodulemodule bar; logic 3:0 i, o; foo #(.VAR_TYPE(int) u1 (i, o); / 实例化模块 重新将VAR_TYPE定义成int类型endmodule15、 模块端口连接在Verilog中,可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的reg、integer和time。而在SystemVerilog中则去除了这种限制,任何数据类型都可以通过端口传递,包括实数、数组和结构体。16、 字母值l一个字符串可以赋值成一个字符数组,像C语言一样加入一个空结束符。如果尺寸不同,它像C中一样进行左调整,例如:char foo 0:12 = “hello worldn”; l加入了几个特殊的串字符:v:垂直TABf:换页a:响铃x02:用十六进制数来表示一个ASCII字符l数组可以使用类似于C初始化的语法赋值成字符值,但它还允许复制操作符。括号的嵌套必须精确地匹配数组的维数(这一点与C不同),例如:int n 1: 2 1:3 = 0, 1, 2, 34; int n 行数列数 = 第一行,第二行17、 强制类型转换和强制数据宽度转换:Verilog不能将一个值强制转换成不同的数据类型。SystemVerilog通过使用操作符提供了数据类型的强制转换功能。这种强制转换可以转换成任意类型,包括用户定义的类型。例如:int (2.0 * 3.0) / 将结果转换为int类型mytype (foo) / 将foo转换为mytype类型一个值还可以通过在强制转换操作符前指定一个10进制数来转换成不同的向量宽度,例如:17 (x - 2) / 将结果转换为17位宽度也可以将结果转换成有符号值,例如:signed (x) / 将x转换为有符号值18、 操作符Verilog没有C语言的递增(+)和递减(-)操作符。而SystemVerilog加入了几个新的操作符:l+和-:递增和递减操作符;l+=、-=、*=、/=、%=、&=、=、|=、=、=赋值操作符;19、 唯一性和优先级决定语句在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; / a的值3、5、6、7会引起一个警告priority if (a2:1=0) y = in1; / a是0或1else if (a2=0) y = in2; / a是2或3else 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? : y = in1; / a是0或1 2b0? : y = in2; / a是2或3 default : y = in3; /如果a为其他的值endcase 20、 底部检测的循环Verilog包含for、while和repeat循环,这几个循环都是在循环的起始处检测循环条件。SystemVerilog加入了一个do-while循环,这种循环在执行语句的结尾处检测循环条件。21、 跳转语句在语句的执行过程中,C语言提供了几种方式来跳转到新的语句,包括:return、break、continue和goto。在Verilog中除了通过使用disable语句跳转到语句组的尾部外,没有提供任何其它跳转语句。使用disable语句执行中止和继续功能要求加入块的名字,并且会产生不直观的代码。SystemVerilog加入了C语言的break和continue关键字,这两个关键字不要求使用块名字。另外,SystemVerilog还加入了一个return关键字,它可以用来在任何执行点上退出一个任务或函数。lbreak:终断最近一层循环并跳出本层循环体,与C语言相同;lcontinue:跳转到本次循环的尾部,与C语言相同;lreturn 表达式:退出一个函数;lreturn:退出一个任务或void类型的函数。continue和break语句不能在forkjoin语句中用来控制位于forkjoin块之外的循环。SystemVerilog没有包含C语言中的goto语句。22、 块名字和语句标签在Verilog中,我们可以通过在begin或fork关键字之后指定名字来为begin-end或fork-jion语句指定名字。这个指定的名字代表整个语句块。SystemVerilog还允许在end或jion关键字之后指定一个匹配的块名字。这种机制很容易将end或join与对应的begin或fork联系起来,尤其是在一个长的块或嵌套的块中。块结尾处的名字是可选的,但如果使用的话,它必须与块起始处的名字相同。例如:begin: foo / 在begin之后的块名字 fork: bar / 具有名字的嵌套的块 join: bar / 必须具有相同的名字 end: foo / 必须具有相同的名字SystemVerilog还允许像C语言一样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。例如initial begin test1: read_enable = 0; test2: for (i=0; i=255; i+)end23、 对事件控制的增强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 (memoryaddress)在第一个例子中,是当操作数发生改变的时候还是只有当运算结果发生改变的时候才会触发事件控制?在第二个例子中,是当memory的地址发生变化的时候还是只有当memory的值发生变化的时候才会触发事件控制?当事件控制中包含表达式的时候,IEEE Verilog标准允许仿真器进行不同的优化。这就可能导致在不同的仿真器间有不同的仿真结果,可能还会导致仿真与综合之间的结果不一致。SystemVerilog加入了一个changed关键字,在事件控制列表中它被用作一个修饰符。(changed (表达式)能够显式地定义只有当表达式的结果发生改变的时候才会触发事件控制。例如:always (changed (a * b)always (changed memoryaddress)l事件控制中的赋值Verilog不允许在事件控制中使用赋值。SystemVerilog允许在事件控制中使用赋值表达式。事件控制仅仅敏感于赋值表达式右侧的变化。例如:always (y = a * b)24、 新的过程Verilog使用always过程来表示时序逻辑、组合逻辑和锁存逻辑的RTL模型。综合工具和其它软件工具必须根据过程起始处的事件控制列表以及过程内的语句来推断always过程的意图。这种推断会导致仿真结果和综合结果之间的不一致。SystemVerilog增加了三个新的过程来显式地指示逻辑的意图。lalways_ff:表示时序逻辑的过程;lalways_comb:表示组合逻辑的过程;lalways_latch:表示锁存逻辑的过程。25、 动态过程Verilog通过使用fork-jion提供了一种静态的并发过程。每一个分支都是一个分离的、并行的过程。fork-jion中任何语句的执行必须在组内的每一个过程完成后才会执行。例如:initial begin forksend_packet_task (1, 255, 0);send_packet_task (7, 128, 5);watch_result_task (1, 255, 0);watch_result_task (7, 128, 5); jion / 所有的任务必须完成后才会到达这里endSystemVerilog通过process关键字加入了一个新的、动态的过程。它为一个过程产生分支,然后继续执行而无需等待其他过程完成。过程不会阻塞过程或任务内的语句执行。这种方式能够建模多线程的过程。例如:initial 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 / 所有的过程并行运行,多线程,无需等待26、 任务和函数增强SystemVerilog为Verilog的任务和函数作了几个增强。l静态和自动的存储缺省情况下,在Verilog任务或函数内的所有存储都是静态的。Verilog-2001允许将任务和函数声明成自动的。在SystemVerilog中:(1). 在一个静态任务和函数内的特定数据可以显式地声明成自动的。声明成自动的数据在块中具有完整的生命周期,并且在任务和函数调用的入口处初始化;(2). 在一个自动的任务或函数中的特定数据可以显式地声明成静态的。自动的任务或函数中声明成静态的数据在一个块的本地范围内具有静态的生命周期。l从任何点返回Verilog在一个任务或函数中执行到endtask或endfunction关键字的时候返回。函数的返回值是给函数名赋的最后一个值。SystemVerilog加入了一个return关键字,使用这个关键字,一个任务或函数可以在任何点上返回。l多语句Verilog要求一个任务或函数只具有一个语句或语句块。多条语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床医学技士试题及答案
- 掌握2024年纺织品检验员试题及答案
- 全面了解纺织工程师考试内容试题及答案
- 国际商业美术设计师行业前景展望试题及答案
- 全球市场中的设计策略适应性试题及答案
- 护士类考试试题及答案
- 教师体罚测试题及答案
- 外伤固定考试题及答案
- 电梯管理员试题及答案
- 烟叶种植面试题及答案
- 2024年山东高考化学真题试题(原卷版+含解析)
- 3.1.4 禁止编入列车的机车车辆课件讲解
- 30题仪表工程师岗位常见面试问题含HR问题考察点及参考回答
- 数字贸易学 课件 第5章 数字服务贸易
- DB11∕T 848-2023 压型金属板屋面工程施工质量验收标准
- 2024年江苏交通控股有限公司招聘笔试参考题库附带答案详解
- 孕妇乳母的饮食调理
- 银行理财双录培训课件
- 2025年4月自考00160审计学押题及答案解析
- 了解高中生心理健康问题的常见表现和解决方法
- 小学生反诈知识宣传课件
评论
0/150
提交评论