ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:28.20KB ,
资源ID:3325240      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3325240.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(systemverilog语法和验证相关流程.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、systemverilog语法和验证相关流程.1、 IC 验证环境的基本框图测试平台发生器 Testcase代理记分板检测器覆盖率驱动层断言监测器统计待测设计发生器( generator)用来解释 testcase,其实也就是 把 testcase 翻译成具体的数据包,或者数据码流。代理这个东西就是 把数据分配下去,他与记分板和检测器一起称为功能层。记分板( scoreboard)用来临时存放一些数据,用于数据的比较 。常与检测器合在一起,共同完成数据的比较,查错。 他们要实现的一个与待测设计相同功能的模块,用于自动比较的。其实也就是要设计一个能实现相同功能的模块,一般小的模块这部分设计都是由

2、验证工程师自己完成的,如果是复杂的模块由于验证工程师还要关注其他的模块,这块功能可以由其他地方提供,比如一些现成的 C 语言代码,验证工程师把这个 C 代码嵌入的验证环境中就可以了,这个地方的实现方式比较多,也是验证的一个精华的地方吧。主要的 debug 也就在这个地方实现的。驱动层( driver )顾名思义, 就是用来驱动我们的待测设计( DUT(device under test)。就是把数据包处理成具体的操作激励,也就是那些波形了。监测器( monitor )用来采集待测设计( DUT)的输出波形,然后传回 scoreboard 用于和标准结果比较,验证 DUT 工作是否正确 。断言(

3、 assert)是个好东西,但是如果紧紧依靠验证工程师这个东西是没办法用好的,这个东西非常需要设计人员配合。 Assert 功能很强大,也很容易上手, 能深层次的发掘设计错误, 定位很准确, 也正是由于这些优点,所以验证工程师不能非常容易的使用它, 因为验证工程师一般可以不需要了解太多的设计细节就可以对设计模块进行验证 ,但是 assert 需要比较清楚的了解内部信号 ,才能将内部信号连接到相应的 assert 上 。建议 IC 设计工程师学习哦。对 debug 很有帮助的哦。这个模块在有的验证环境中是不使用。最后说一下 覆盖率 的问题。覆盖率分为 功能覆盖率 ,代码覆盖率 ,1/12.还有人

4、为添加的一些覆盖点的覆盖率 。这个其实就是 用来衡量验证工作进行到什么程度了。 最容易实现 100%的是代码覆盖率,但是如果 verilog 代码中使用了 case的 default 那就很难实现 100%覆盖了。功能覆盖率就是一些函数的功能,还有状态机的状态覆盖率等等。然后还有就是验证工程师添加的覆盖点。一般验证工作完成以后要使用这些东西完成报告的。2、 SystemVerilog 是一种硬件描述和验证语言( HDVL),它基于 IEEE 1364-2001 Verilog 硬件描述语言 (HDL),并对其进行了扩展, 包括扩充了 C 语言数据类型、结构、压缩和非压缩数组、 接口、断言等等,

5、这些都使得 SystemVerilog 在一个更高的抽象层次上提高了设计建模的能力。3、 接口( Interface ): Verilog 模块之间的连接是通过 模块端口 进行的。SystemVerilog 提供了一个新的、 高层抽象的 模块连接 ,这个连接被称为 接口(Interface )。接口在关键字 interface 和 endinterface 之间定义,它独立于模块。在最简单的形式下,一个接口可以认为是一组线网。例如, 可以将 PCI 总线的所有信号绑定在一起组成一个接口。 通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入, 当接口发生变化

6、时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。接口的使用实例 :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

7、= 0;chip_bus a; / 实例接口/将接口连接到模块实例RAM mem(a, clk); CPU cpu(a, clk);endmodule实际上, SystemVerilog 的接口不仅仅可以表示信号的绑定和互连。由于 SystemVerilog 的接口中可以包含参数、 常量、变量、结构、函数、任务、initial2/12.块、always 块以及连续赋值语句, 所以 SystemVerilog 的接口还可以包含内建的协议检查以及被使用该接口的模块所共用的功能。4、 全局声明和语句在 Verilog 中,除了一个模块可以作为 模块实例 引用其他模块外,并不存在一个全局空间。另外,

8、Verilog 允许任意数目的顶层模块,因此会产生毫无关联的层次树。SystemVeriog增加了一个被称为 $root 的隐含的顶级层次。 任何在模块边界之外的声明和语句都 存在于 $root 空间中 。所有的模块, 无论它处于哪一个设计层次,都可以引用 $root 中声明的名字。这样,如果某些变量、函数或其它信息被设计中的所有模块共享,那么我们就可以将它们作为全局声明和语句。全局声明和语句的一个使用实例如下:reg error _flag; / 全局变量function compare (.); / 全局函数always (error_flag) / 全局语句.module test;ch

9、ip1 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? 还是其他。 Ver

10、ilog 的时间单位和精度是作为每一个模块的属性,并使用编译器指令 timescale 来设置。SystemVerilog为了控制时间单位加入了两个重要的增强。 首先,时间值可以显式地指定一个单位。时间单位可以是 s、ms、ns、ps 或 fs。时间单位作为时间值的后缀出现。 例如:forever #5ns clock = clock;其次, SystemVerilog允许使用新的关键字 ( timeunits 和 timeprecision )来指定时间单位和精度。这些声明可以在任何模块中指定,同时也可以在 $root3/12.空间中全局指定。 时间单位和精度必须是 10 的幂,范围可以从

11、s 到 fs。例如:timeunits 1ns ; /时间单位timeprecision 10ps ;/时间精度6、 . 抽象数据类型Verilog 提供了面向底层硬件的 线网、寄存器和变量数据类型 。这些类型代表了 4 态逻辑值 (0,1,x,z),通常用来在底层上对硬件进行建模和验证。 线网数据类型还具有多个强度级别,并且能够为多驱动源的线网提供解析功能。SystemVerilog包括了 C 语言的 char 和 int 数据类型,它允许在 Verilog 模型和验证程序中 直接使用 C 和 C+代码。 Verilog PLI 不再需要集成总线功能模型、算法模型和 C 函数。 System

12、Verilog还为 Verilog 加入了几个新的数据类型,以便能够在更抽象的层次上建模硬件。char :一个两态的有符号变量 ,它与 C 语言中的 char 数据类型 相同,可以是一个 8 位整数( ASCII)或 short int (Unicode);int :一个两态的有符号变量 ,它与 C 语言中的 int 数据类型 相似,但被精确地定义成 32 位;shortint :一个 两态的有符号变量 ,被精确地定义成 16 位;longint :一个 两态的有符号变量 ,它与 C 语言中的 long 数据类型相似,但被精确地定义成 64 位;byte :一个两态的有符号变量 ,被精确地定义

13、成 8 位;bit :一个两态的可以具有 任意向量宽度的无符号数据类型 ,可以用来替代Verilog 的 reg 数据类型;logic :一个四态的可以具有任意向量宽度的无符号数据类型 ,可以用来替代 Verilog 的线网或 reg 数据类型,但具有某些限制 ;shortreal :一个两态的单精度浮点变量 ,与 C 语言的 float 类型相同;void :表示没有值 ,可以定义成一个函数的返回值,与 C 语言中的含义相同。SystemVerilog的 bit 和其他数据类型允许用户使用两态逻辑对设计建模,这种方法对仿真性能更有效率。由于 Verilog 语言没有两态数据类型,因此许多仿真

14、器都通过将这种功能作为仿真器的一个选项提供。 这些选项不能够在所有的仿真器之间移植,而且在需要时用三态或四态逻辑的设计中强制使用两态逻辑还具有副作用。 SystemVerilog的 bit 数据类型能够极大改进仿真器的性能,同时在需要的时候仍然可以使用三态或四态逻辑。 通过使用具有确定行为的数据类型来代替专有的仿真器选项,两态模型能够在所有的 SystemVerilog仿真器间移植。SystemVerilog 的 logic 数据类型 比 Verilog 的线网和寄存器数据类型更加灵活,它使得在任何抽象层次上建模硬件都更加容易 。logic 类型能够以下面的任何一种方法赋值:通过任意数目的 过

15、程赋值语句 赋值,能够替代 Verilog 的 reg 类型;通过单一的 连续赋值语句 赋值,能够有限制地替代 Verilog 的 wire 类型;连接到一个 单一原语 的输出,能够有限制地替代 Verilog 的 wire 类型;由于 logic 数据类型能够被用来替代 Verilog 的 reg 或 wire(具有限制),这就使得能够在一个更高的抽象层次上建模, 并且随着设计的不断深入能够加入一些设计细节而不必改变数据类型的声明。 logic 数据类型不会表示信号的强度也不具有线逻辑的解析功能, 因此 logic 数据类型比 Verilog 的 wire 类型更能有效地仿真和综合。4/12

16、.7、 有符号和无符号限定符缺省情况下, Verilog net 和 reg 数据类型是 无符号类型 , integer 类型是一个有符号类型 。Verilog-2001 标准允许使用 signed 关键字将无符号类型显式地声明成有符号类型。 SystemVerilog 加入了相似的能力,它可以通过 unsigned 关键字将有符号数据类型显式地声明成有无符号数据类型。 例如:int unsigned j;值得注意的是 unsigned 在 Verilog 中是一个保留字,但并没有被 Verilog 标准使用。8、 用户定义的类型Verilog 不允许用户定义新的数据类型。 SystemVer

17、ilog 通过使用 typedef 提供了一种方法来定义新的数据类型,这一点与 C语言类似。 用户定义的类型可以与其它数据类型一样地使用在声明当中。例如:typedef unsigned int uint;uint a, b;一个用户定义的数据类型可以在它的定义之前使用, 只要它首先在空的 typ edef 中说明, 例如:typedef int48; / 空的 typedef ,在其他地方进行 完整定义 int48 c;9、 枚举类型在 Verilog 语言中不存在枚举类型。 标识符必须被显式地声明成一个线网、 变量或参数并被赋值。 SystemVerilog允许使用类似于 C 的语法产生枚

18、举类型 。一个枚举类型具有一组被命名的值。 缺省情况下,值从初始值 0 开始递增,但是我们可以显式地指定初始值。 枚举类型的例子如下:enum red, yellow, green RGB;enum WAIT=2 b01, LOAD, DONE states;我们还可以使用 typedef 为枚举类型指定一个名字, 从而允许这个枚举类型可以在许多地方使用。例如:typedef enum FALSE=1 b0, TRUE boolean;boolean ready;boolean test_complete;10、 结构体和联合体在 Verilog 语言中不存在结构体或联合体, 而结构体或联合体

19、在将几个声明组合在一起的时候非常有用。 SystemVerilog 增加了结构体和联合体,它们的声明语法类似于 C。struct reg 15:0 opcode;reg 23:0 addr; IR;union int I;shortreal f; N;5/12.结构体或联合体中的域可以通过在变量名和域名字之间插入句点( .)来引用:IR.opcode = 1; / 设置 IR 变量中的 opcode 域N.f = 0.0; / 将 N 设置成浮点数的值我们可以使用 typedef 为结构体或联合体的定义指定一个名字。typedef struct reg 7:0 opcode;reg 23:0

20、addr; instruction; / 命名的结构体 instruction IR; / 结构体实例一个结构体可以使用值的级联来完整地赋值,例如:instruction = 5, 200;结构体可以作为一个整体传递到函数或任务,也可以从函数或任务传递过来,也可以作为模块端口进行传递。11、 数组在 Verilog 中可以声明一个数组类型, reg 和线网类型还可以具有一个向量宽度。在一个对象名前面声明的尺寸表示向量的 宽度,在一个对象名后面声明的尺寸表示数组的 深度。 例如:reg 7:0 r1 1:256 ; / 256 个 8 位的变量在 SystemVerilog中我们使用不同的术语表

21、示数组:使用“压缩数组( 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 位字节的压缩数组 的非压缩数

22、组非压缩尺寸在压缩尺寸之前引用, 这就允许将整个压缩数组作为一个单一的元素进行引用。在上面的例子中 ,d1 引用非压缩数组的一个单一元素 ,这个元素是 一个包含 4 个字节的数组 。12 、 在未命名的块中声明Verilog 允许变量在一个命名的 begin-end 或 fork-join 语句组中声明 。相对于语句组来说,这些变量是本地的,但它们可以被层次化地引用。 在 SystemVerilog 中,既可以在命名的块中也可以在未命名的块中声明。 在未命名的块中,不能够使用层次名来访问变量。 所有的变量类型, 包括用户定义的类型、枚举类型、结构体和联合体都可以在 begin-end 或 fo

23、rk-join 语句组中声明。13、 常量在 Verilog 中有三种特性类型的常量: parameter 、specparam 和 localpara m 。而 在 SystemVerilog 中,允许使用 const 关键字声明常量 。例如:6/12.const char colon = “ :;”14 、 可重定义的数据类型SystemVerilog 扩展了 Verilog 的 parameter ,使其可以包含类型 。这个强大的功能使得一个模块中的 数据类型 在模块的 每一个实例 中重新定义。 例如:module foo;#(parameter type VAR_TYPE = shor

24、tint ;) (input logic 7:0 i, output logic 7:0 o);VAR_TYPE j = 0; / 如果不重新定义, j 的数据类型为 shortintendmodulemodule bar;logic 3:0 i, o;foo #(.VAR_TYPE(int) u1 (i, o); / 实例化模块 重新将 VAR_TYPE定义成 int 类型endmodule15 、 模块端口连接在 Verilog 中,可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的 reg、integer 和 time 。而在 SystemVerilog 中则去除了这种限制,

25、任何数据类型都可以通过端口传递,包括实数、数组和结构体。16 、 字母值一个字符串可以赋值成一个字符数组 ,像 C 语言一样加入一个空结束符。如果尺寸不同,它像 C 中一样进行左调整,例如:char foo 0:12 = “ helloworld n”;加入了几个特殊的串字符:v:垂直 TABf:换页a:响铃x02 :用十六进制数来表示一个 ASCII字符数组可以使用类似于 C 初始化的语法赋值成字符值,但它还允许复制操作符。括号的嵌套必须精确地匹配数组的维数 (这一点与 C 不同),例如:int n 1: 2 1:3 = 0, 1, 2, 34 ;int n 行数 列数 = 第一行,第二行

26、17 、 强制类型转换和强制数据宽度转换:Verilog 不能将一个值强制转换成不同的数据类型。 SystemVerilog 通过使用 操作符提供了数据类型的强制转换功能。 这种强制转换可以转换成任意类型,包括用户定义的类型 。例如:int (2.0 * 3.0) / 将结果转换为 int 类型mytype (foo) / 将 foo 转换为 mytype 类型一个值还可以通过在强制转换操作符前指定一个 10 进制数来 转换成不同的向量宽度 ,例如:17(x - 2) / 将结果转换为 17 位宽度也可以将结果转换成有符号值 ,例如:7/12.signed (x) / 将 x 转换为有符号值1

27、8 、 操作符Verilog 没有 C 语言的递增( +)和递减( -)操作符。而 SystemVerilog 加入了几个新的操作符:+和-:递增和递减操作符;+=、-=、*= 、/=、 %=、 &=、=、 |= 、=、=赋值操作符;19 、 唯一性和优先级决定语句在 Verilog 中,如果没有遵循严格的编码风格,它的 if-else 和 case 语句会在RTL仿真和 RTL综合间具有不一致的结果。 如果没有正确使用 full_case 和 parallel_case 综合指令还会引起一些其它的错误。SystemVerilog 能够显式地指明什么时候一条决定语句的分支是唯一的, 或者什么时

28、候需要计算优先级。 我们可以在 if 或 case 关键字之前使用 unique 或 requires 关键字。这些关键字可以向仿真器、综合编译器、以及其它工具指示我们期望的硬件类型。 工具使用这些信息来检查 if 或 case 语句是否正确建模了期望的逻辑。例如, 如果使用 unique限定了一个决定语句,那么在不希望的 case值出现的时候仿真器就能够发布一个警告信息 。bit2:0a;uniqueif (a=0) | (a=1) y = in1;elseif (a=2)y= in2;elseif (a=4)y= in3;/ a 的值 3、 5、 6、7会引起一个警告priorityif

29、(a2: 1=0)y = in1; / a 是 0 或 1elseif (a 2=0)y = in2; / a 是 2 或 3elsey = in3;/如果 a 为其他的值unique case (a)0, 1: y = in1;2:y = in2;4:y = in3;endcase / 值 3、5、6、7 会引起一个警告priority casez (a)2 b00?: y = in1; / a 是 0 或 12 b0?: y = in2; / a 是 2 或 3default : y = in3; /如果 a 为其他的值endcase20 、 底部检测的循环Verilog 包含 for 、

30、while 和 repeat 循环,这几个循环都是在循环的起始处检测循环条件。 SystemVerilog 加入了一个 do-while 循环,这种循环在执行语句的结尾处检测循环条件。21、 跳转语句在语句的执行过程中, C 语言提供了几种方式来跳转到新的语句,包括: return 、 break 、 continue 和 goto 。在 Verilog 中除了通过使用 disable 语句跳8/12.转到语句组的尾部外,没有提供任何其它跳转语句。使用 disable 语句执行中止和继续功能要求加入块的名字,并且会产生不直观的代码。 SystemVeril og 加入了 C 语言的 break 和 continue 关键字,这两个关键字不要求使用块名字。另外, SystemVerilog 还加入了一

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

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