编辑推荐

适读人群:具有一定Verilog编程基础的电路工程技术人员,高等院校电子类、自动化类、计算机类的学生
  《systemverilog验证》可以作为学习SystemVerilog验证语言的初级阶段读物。书中描述了语言的工作原理并且包含了很多例子,这些例子演示了如何使用面向对象编程(OOP)的方法建立一个基本的、由覆盖率驱动并且受约束的随机分层测试平台。《systemverilog验证》在创建测试平台方面有很多引导性的建议,能够帮你弄清楚为什么要使用类、随机化和功能覆盖率的概念。一旦你掌握了这门语言,就可以通过参考文献中所列举的方法学方面的书籍来学习关于建立测试平台的更多信息。

内容简介

《systemverilog验证》讲解了SystemVerilog语言的工作原理。介绍了类、随机化和功能覆盖率等测试手段和概念,并且在创建测试平台方而提供了很多引导性的建议。《systemverilog验证》借助大量的实例说明SystemVerilog的各种验证方法,以及如何根据实际的应用情况选择优的方法达到尽可能高的覆盖率。而且,重点演示了如何使用面向对象编程(OOP)的方法建立由覆盖率驱动并且受约束的基本的随机分层测试平台,此外,还论述了SystemVerilog与C语言的接口技术。

目录

目录
第1章验证导论1
1.1验证流程2
1.1.1不同层次上的测试2
1.1.2验证计划3
1.2验证方法学3
1.3基本测试平台的功能4
1.4定向测试4
1.5方法学基础5
1.6受约束的随机激励6
1.7你的随机化对象是什么7
1.7.1设备和环境配置7
1.7.2输入数据8
1.7.3协议异常、错误和违例8
1.7.4时延和同步9
1.7.5并行的随机测试9
1.8功能覆盖率9
1.8.1从功能覆盖率到激励的反馈10
1.9测试平台的构件11
1.10分层的测试平台11
1.10.1不分层的测试平台12
1.10.2信号和命令层13
1.10.3功能层14
1.10.4场景层14
1.10.5测试的层次和功能覆盖率15
1.11建立一个分层的测试平台16
1.11.1创建一个简单的驱动器16
1.12仿真环境的阶段16
1.13最大限度的代码重用17
1.14测试平台的性能17
1.15结束语18
第2章数据类型19
2.1内建数据类型19
2.1.1逻辑(logic)类型19
2.1.2双状态数据类型20
2.2定宽数组21
2.2.1定宽数组的声明和初始化21
2.2.2常量数组22
2.2.3基本的数组操作——for和foreach22
2.2.4基本的数组操作——复制和比较24
2.2.5同时使用位下标和数组下标25
2.2.6合并数组25
2.2.7合并数组的例子26
2.2.8合并数组和非合并数组的选择27
2.3动态数组27
2.4队列28
2.5关联数组30
2.6链表32
2.7数组的方法32
2.7.1数组缩减方法33
2.7.2数组定位方法34
2.7.3数组的排序36
2.7.4使用数组定位方法建立记分板36
2.8选择存储类型37
2.8.1灵活性37
2.8.2存储器用量37
2.8.3速度38
2.8.4排序38
2.8.5选择最优的数据结构39
2.9使用typedef创建新的类型39
2.10创建用户自定义结构40
2.10.1使用struct创建新类型41
2.10.2对结构进行初始化41
2.10.3创建可容纳不同类型的联合41
2.10.4合并结构42
2.10.5在合并结构和非合并结构之间进行选择42
2.11类型转换42
2.11.1静态转换43
2.11.2动态转换43
2.11.3流操作符43
2.12枚举类型45
2.12.1定义枚举值46
2.12.2枚举类型的子程序46
2.12.3枚举类型的转换47
2.13常量48
2.14字符串48
2.15表达式的位宽49
2.16结束语50
第3章过程语句和子程序51
3.1过程语句51
3.2任务、函数以及void函数52
3.3任务和函数概述53
3.3.1在子程序中去掉beginend53
3.4子程序参数53
3.4.1C语言风格的子程序参数53
3.4.2参数的方向54
3.4.3高级的参数类型54
3.4.4参数的缺省值56
3.4.5采用名字进行参数传递57
3.4.6常见的代码错误57
3.5子程序的返回58
3.5.1返回(return)语句58
3.5.2从函数中返回一个数组59
3.6局部数据存储60
3.6.1自动存储60
3.6.2变量的初始化60
3.7时间值61
3.7.1时间单位和精度61
3.7.2时间参数62
3.7.3时间和变量62
3.7.4$time与$realtime的对比63
3.8结束语63
第4章连接设计和测试平台65
4.1将测试平台和设计分开65
4.1.1测试平台和DUT之间的通信66
4.1.2与端口的通信66
4.2接口68
4.2.1使用接口来简化连接68
4.2.2连接接口和端口70
4.2.3使用modport将接口中的信号分组70
4.2.4在总线设计中使用modport71
4.2.5创建接口监视模块71
4.2.6接口的优缺点72
4.2.7更多例子和信息73
4.3激励时序73
4.3.1使用时钟块控制同步信号的时序73
4.3.2接口中的logic和wire对比74
4.3.3Verilog的时序问题75
4.3.4测试平台—设计间的竞争状态76
4.4.4程序块(ProgramBlock)和时序区域(TimingRegion)76
4.3.6仿真的结束78
4.3.7指定设计和测试平台之间的延时78
4.4接口的驱动和采样79
4.4.1接口同步79
4.4.2接口信号采样79
4.4.3接口信号驱动80
4.4.4通过时钟块驱动接口信号81
4.4.5接口中的双向信号82
4.4.6为什么在程序(program)中不允许使用always块83
4.4.7时钟发生器83
4.5将这些模块都连接起来84
4.5.1端口列表中的接口必须连接85
4.6顶层作用域85
4.7程序——模块交互87
4.8SystemVerilog断言88
4.8.1立即断言(ImmediateAssertion)88
4.8.2定制断言行为88
4.8.3并发断言89
4.8.4断言的进一步探讨90
4.9四端口的ATM路由器90
4.9.1使用端口的ATM路由器90
4.9.2使用端口的ATM顶层网单91
4.9.3使用接口简化连接94
4.9.4ATM接口94
4.9.5使用接口的ATM路由器模型95
4.9.6使用接口的ATM顶层网单95
4.9.7使用接口的ATM测试平台96
4.10ref端口的方向97
4.11仿真的结束97
4.12LC3取指模块的定向测试(directedtest)97
4.13结论102
第5章面向对象编程基础103
5.1概述103
5.2考虑名词,而非动词103
5.3编写第一个类(Class)104
5.4在哪里定义类105
5.5OOP术语105
5.6创建新对象106
5.6.1没有消息就是好消息106
5.6.2定制构造函数(Constructor)106
5.6.3将声明和创建分开108
5.6.4new()和new[]的区别108
5.6.5为对象创建一个句柄108
5.7对象的解除分配(deallocation)109
5.8使用对象110
5.9静态变量和全局变量111
5.9.1简单的静态变量111
5.9.2通过类名访问静态变量112
5.9.3静态变量的初始化112
5.9.4静态方法112
5.10类的方法114
5.11在类之外定义方法115
5.12作用域规则116
5.12.1this是什么118
5.13在一个类内使用另一个类119
5.13.1我的类该做成多大120
5.13.2编译顺序的问题121
5.14理解动态对象121
5.14.1将对象传递给方法121
5.14.2在任务中修改句柄123
5.14.3在程序中修改对象123
5.14.4句柄数组124
5.15对象的复制125
5.15.1使用new操作符复制一个对象125
5.15.2编写自己的简单复制函数126
5.15.3编写自己的深层复制函数127
5.15.4使用流操作符从数组到打包对象,或者从打包对象到数组128
5.16公有和私有130
5.17题外话130
5.18建立一个测试平台131
5.19结论132
第6章随机化133
6.1介绍133
6.2什么需要随机化133
6.2.1器件配置134
6.2.2环境配置134
6.2.3原始输入数据135
6.2.4封装后的输入数据135
6.2.5协议异常、错误(error)和违规(violation)135
6.2.6延时135
6.3SystemVerilog中的随机化135
6.3.1带有随机变量的简单类136
6.3.2检查随机化(randomize)的结果137
6.3.3约束求解137
6.3.4什么可以被随机化137
6.4约束137
6.4.1什么是约束138
6.4.2简单表达式139
6.4.3等效表达式139
6.4.4权重分布140
6.4.5集合(set)成员和inside运算符141
6.4.6在集合里使用数组142
6.4.7条件约束145
6.4.8双向约束145
6.4.9使用合适的数学运算来提高效率146
6.5解的概率147
6.5.1没有约束的类147
6.5.2关系操作147
6.5.3关系操作和双向约束148
6.5.4使用solvebefore约束引导概率分布148
6.6控制多个约束块149
6.7有效性约束150
6.8内嵌约束151
6.9pre_randomize和post_randomize函数152
6.9.1构造浴缸型分布152
6.9.2关于void函数153
6.10随机数函数153
6.11约束的技巧和技术154
6.11.1使用变量的约束154
6.11.2使用非随机值155
6.11.3用约束检查值的有效性156
6.11.4随机化个别变量156
6.11.5打开或关闭约束156
6.11.6在测试过程中使用内嵌约束158
6.11.7在测试过程中使用外部约束158
6.11.8扩展类159
6.12随机化的常见错误159
6.12.1小心使用有符号变量

精彩书摘

  第1章 验证导论
  “有些人相信,我们缺乏能够描述这个完美世界的编程语言……”
  ——《黑客帝国》,1999
  设想一下,你被委任去为别人建一幢房子。你该从哪里开始呢?是不是一开始就考虑如何选择门窗、涂料和地毯的颜色,或者浴室的用料?当然不是!首先你必须考虑房的主人将如何使用房子内部的空间,这样才能确定应该建造什么类型的房子。你应该考虑的问题是他们是喜欢烹饪并且需要一个高端的厨房,还是喜欢在家里边看电影边吃外卖比萨?他们是需要一间书房或者额外的卧室,还是受预算所限要求更简朴一些?
  在开始学习有关SystemVerilog语言的细节之前,你需要理解如何制订计划来验证你的设计,以及这个验证计划对测试平台结构的影响。如同所有房子都有厨房、卧室和浴室一样,所有测试平台也都需要共享一些用于产生激励和检验激励响应的结构。本章将就测试平台的构建和设计给出一些引导性的建议和编码风格方面的参考,以满足个性化的需要。这些技术使用了Bergeron等人2006年所著《SystemVerilog验证方法学》书中的一些概念,但不包括基本类。
  作为一个验证工程师,你能学到的最重要的原则是“程序漏洞利大于弊”。不要因为害羞而不敢去找下一个漏洞,每次找到漏洞都应该果断报警并记录下来。整个项目的验证团队假定设计中存在漏洞,所以在流片之前每发现一个漏洞就意味着最终到客户手里少一个漏洞。你应该尽可能细致深入地去检验设计,并提取出所有可能的漏洞,尽管这些漏洞可能很容易修复。不要让设计者拿走了所有的荣誉——没有你的耐心细致、花样翻新的验证,设计有可能无法正常工作!

前言/序言

  SystemVerilog语言的出现只有短短几年的时间,目前市面上关于systemVerilog语言的中文书籍并不多见,而且大多都是介绍systemVerilog语言的设计特性。实际上,SystemVerilog语言除了具有设计特性外,还具有验证及其他诸多方面的特性。“验证”经常被认为是简单的仿真,这当然是一种误解,《systemverilog验证》将告诉你其中缘由。
  《systemverilog验证》主要介绍SystemVerllog语言的验证技术,尤其侧重阐述如何使用受约束的随机测试来达到令人满意的覆盖率。原著作者克里斯·斯皮尔(chrisSpear)是一名资深的数字电路工程师,在软件编程方面有很丰富的经验,书中的很多观点和例子就来自于作者平时工作的积累。《systemverilog验证》没有深奥的理论,叙述上深入浅出。而且由于作者同时也精通c++、Verilog和Vera等编程语言,所以书中对于systemVerilog与这些语言之间的差别以及易混淆的地方交代得十分清楚,特别适合systemerilog的初学者阅读。
  《systemverilog验证》的翻译过程颇为波折,前后总共持续了一年多的时间。当我们在2008年初开始着手翻译工作时,使用的还是《systemverilog验证》的第一版。但翻译工作进行到将近一半时。获悉《systemverilog验证》的第二版即将发行,于是转为等待翻译第二版。第二版除了章节内容上有所增补以外,原有章节的很多字句也有所改动,只得重新翻译、校对。
  《systemverilog验证》的翻译具体分工如下:第6、11章的翻译由张春负责;前言和第1、2、3、7、9章的翻译由麦宋平负责;第4、5、8、10、12章的翻译由赵益新负责;《systemverilog验证》的审校和最终定稿由张春负责。
  衷心感谢清华大学微电子学研究所的王志华教授,他在《systemverilog验证》翻译之初就提出了很多具有指导性的意见,并且为翻译工作提供了很多支持。
  衷心感谢科学出版社的支持,正是出版社各位编辑的鼓励和督促,以及他们勤勤恳恳的工作,才使得《systemverilog验证》的中译本得以如期与读者见面。
  由于《systemverilog验证》的翻译稿出现第一版和第二版交叉,新词汇又比较多。圃于译者的经验和水平,虽然经过多次仔细的斟酌和校对。仍难免存在不准确和纰漏的地方,请读者不吝批评指正!

其他推荐