本书共11章,系统论述了基于SystemVerilog的功能验证理论与方法,全书详细阐述了以下三个方面的内容:功能验证在整个FPGA/ASIC设计流程中的作用及主要的验证技术和方法学。SystemVerilog在功能验证上的语法结构和基本原理。如何采用SystemVerilog搭建验证平台。
SystemVerilog技术优势与本书特色
IEEE P1800-2005是下一代硬件设计和验证语言,已被业界广泛采用,成为业界最流行的硬件验证语言。本书内容全面,通俗易懂,深入浅出,实例丰富,结合了业界的实践经验,是一本实用的技术参考手册。
与读者分享以下内容
本书重点介绍了IEEE标准P1800-2005硬件设计描述和验证语言SystemVerilog的基本语法及其在功能验证上的应用。书中以功能验证为主线,讲述基本的验证流程、高级验证技术和验证方法学,结合石头、剪刀、布的应用实例,重点阐述了如何采用SystemVerilog实现随机激励生成、功能覆盖率驱动验证、断言验证等多种高级验证技术;最后,通过业界流行的开放式验证方法学OVM介绍了如何在验证平台中实现可重用性。
同业者隆重推荐
作为IEEE的标准,SystemVerilog 为设计和验证提供了一个统一的平台。本书从SystemVerilog的语法介绍开始,结合验证方法学的理论,提供了丰富的实例和可借鉴的方法,为读者特别是IC验证工程师开阔了视野,提供了宝贵的实践经验,是一本非常实用的参考手册。
—— 赵 立 思科系统研发有限公司 资深硬件工程师
面向对象的设计思想作为软件开发的一部分已经有很多年了,而将其引入到硬件设计验证领域才刚刚流行起来。一方面,硬件验证设计过程和软件设计过程在某种程度上越来越相似,成熟的设计模式对于验证工作效率的提高大有裨益。另一方面,对于习惯于“硬件思维”的验证工程师,快速吸收掌握面向对象的设计思想却成为一大难题。本书从SystemVerilog的语法出发,详细介绍了SystemVerilog在硬件验证领域的强大应用,还有业界领先的验证方法学OVM。书中实例详尽,通俗易懂,是IEEE标准和验证工程实际应用的完美结合。无论对于新手还是高级用户,本书都是一本非常有价值的参考手册。
—— 萧 路 爱立信(中国)通信有限公司 资深硬件工程师
SystemVerilog作为下一代硬件设计和验证语言,已被业界广泛采用。在功能验证领域,SystemVerilog已逐步取代Vera和E,成为业界最流行的验证语言。书中以SystemVerilog的语法特点为基础,介绍如何在验证平台中采用随机激励生成、覆盖率驱动验证、断言验证等高级验证技术;作者结合了多年的项目经验,以石头、剪刀、布仲裁器的验证平台为例,生动展示了SystemVerilog的各种应用。这是一本全面的SystemVerilog技术宝典。
—— EDA联盟专业网站 www.edaunion.com
广东海丰人,曾就职于华为通信技术公司,目前在某EDA公司任亚太区客户支持部门验证产品技术主管。入行以来,参与过TD-SCDMA基带芯片、千兆无源光网芯片、高性能CPU、网络芯片的硬件辅助验证等多个研发项目,在IC设计及验证领域积累了丰富的实践经验;帮助多家公司优化设计流程,采用高级验证技术,缩短项目研发周期;发表有《OVM实现了可重用的验证平台》、《AMBA片上总线在SOC芯片设计中的应用》等多篇学术论文,也是《The Verification Cookbook》一书的中文版译者之一;多年来致力于行业技术和产品的应用和推广,对IC设计与验证有着深刻的体会和思考。
学习一门新型验证语言的第一步是学会读懂代码,本书为每个编程实例提供了详尽的注释,并且可以在仿真平台上运行;第二步是能够将学到的语法应用到自己的项目中,编写自己的程序;第三步是学会调试代码,这是最艰苦和最具挑战性的工作。
本书依托IC设计的专业技术社区——EDA联盟网站(www.edaunion.com),为广大读者提供了一个技术交流的平台;读者可以在论坛中讨论自己学习过程中遇到的问题,分享学习体会;也可与本书作者直接交流。所有例程可以从论坛中下载。
希望本书能够成为对SystemVerilog与功能验证技术感兴趣的读者有益的入门指南!
在读者深入阅读本书之前,我先对本书的主要结构和内容做个简要的介绍,以便不同背景的读者能够有选择地阅读,快速获取自己需要的知识。
本书的结构和内容
本书分为11章,系统论述了基于SystemVerilog的功能验证方法,重点关注以下三个方面的内容。
功能验证在整个FPGA/ASIC设计流程中的作用及主要的验证技术和方法学。
SystemVerilog的语法结构和在功能验证上的应用及基本原理。
如何采用SystemVerilog搭建验证平台。
第1章从FPGA/ASIC整个设计流程的角度介绍功能验证的地位和作用、验证的基本流程、验证的主要技术和方法学,最后引入硬件验证语言SystemVerilog。
第2章介绍SystemVerilog相对于Verilog增加的数据类型、SystemVerilog的编程结构、流程控制和方法(任务/函数)等基本语法。
第3章介绍fork…join结构、并行进程之间的通信方法:mailbox/semaphore/event同步和互斥机制。
第4章介绍面向对象编程语言、类的基本概念、对象的创建、赋值与复制;如何采用类来封装事务处理器等验证组件和搭建验证平台。
第5章介绍虚接口,以及如何通过虚接口实现类的对象和设计模块的连接,实现事务处理器的可重用。
第6章介绍随机激励生成,其中重点讨论基于对象的约束随机激励产生机制、约束定义以及动态控制激励随机生成。
第7章介绍面向对象编程语言中的继承和多态。
第8章介绍覆盖率在验证流程中的作用、SystemVerilog功能覆盖率的语法,包括覆盖组、覆盖点和交叉覆盖点,以及如何实现一个覆盖率驱动验证平台。
第9章介绍断言在验证流程中的作用、断言的采用策略、SystemVerilog断言子集的语法结构以及如何通过bind结构实现断言与设计分离。
第10章介绍验证重用以及OVM验证方法学的核心技术:基于Factory的对象生成机制、动态参数配置、激励生成与验证架构分离以及测试用例在验证架构的顶层。
第11章介绍SystemVerilog和C语言的接口:DPI,重点介绍如何在SystemVerilog层面定义输入方法接口(SystemVerilog调用外部C程序)和输出方法接口(SystemVerilog程序输出供外部C调用),最后介绍DPI在验证中的作用。
从第4~9章,我们以石头、剪刀、布的仲裁器作为实例,并将各章中涉及的SystemVerilog重要语法和验证技术应用到验证平台搭建中,附有大量源代码供读者参考和练习。
如何阅读本书
本书的目标读者是FPGA/ASIC设计工程师和验证工程师、相关专业的在校本科生、研究生和老师。若具有一定的硬件描述语言(Verilog或者VHDL)和面向对象编程语言(如C++)的基础,将有助于对本书的阅读。
想了解验证技术概况和验证方法学的读者,可以直接阅读第1章和第10章;对于普通读者,建议从第1章阅读到第6章;再根据自己的学习和工作需要,学习第7章以后的内容,这部分内容适合验证工程师和有一定验证经验的读者。有Verilog基础的读者,可以粗略浏览一下第2章的新增数据类型,SystemVerilog其他语法结构与Verilog基本类似;没有Verilog基础的读者,这一章需要认真阅读;想了解覆盖率驱动验证、断言或者DPI的读者可以直接阅读对应内容的第8章、第9章和第11章。
学习一门新语言的第一步是学会读懂代码,本书为每个例子提供了详尽的解释,并且每个例子都可以在仿真平台上运行。第二步是能够将学到的语法应用到自己的项目中,编写自己的程序。第三步是学会调试代码,调试代码是最艰苦和最具挑战性的工作。和大多数编程语言一样,SystemVerilog中基于面向对象编程结构的执行一般是不消耗物理时间的,是动态生成和析构的,为此在关键部位嵌入调试代码(如$display)将是最有效的方法。
EDA联盟网站wwwedaunioncom是专业的技术论坛,为广大的工程师和读者提供了一个技术讨论的平台;各位读者可以在验证板块发帖讨论和交流自己学习过程中遇到的问题,分享自己的学习体会。本书的所有例子也可以从论坛中下载,若发现任何错误请告知我们。
希望本书能够为对SystemVerilog和功能验证技术感兴趣的读者提供一个入门的指南。
致谢
本书在编写过程中,充分利用和吸收了业界最前沿的技术和信息,在此对书中参考引用文献和书籍的作者表示衷心的感谢。由于编写时间仓促,本人学识有限,若书中存在纰漏请各位读者给予谅解并指正,我将虚心听取并及时更正,并欢迎进行技术切磋和探讨(联系方式:edaunionbook@gmailcom)。
本书的完成有赖于朋友们的支持,其中赵立、萧路和王国平三位资深工程师审阅了全稿,并给出了很多有建设性的意见。对他们辛勤的工作,致以最高的敬意和最真挚的感谢。
在此,我还要特别感谢重庆邮电大学的邓亚平教授、吴慧莲教授、鲜继清教授和张宗琪教授对我在学业上的帮助和支持;感谢郑建宏教授提供了TD-SCDMA终端芯片项目的研发平台和锻炼机会;感谢入行以来帮助过我的朋友俞洋、钟信潮、王诚、薛小刚、庄永军和傅骏诚;感谢华为海思的宾兵,让我有幸加入了一个伟大的集体,参与了GPON项目;感谢明导电子乐于分享经验和技术的同事。
最后,感谢我敬爱的父母!
钟文枫
2010年7月15日于上海
电子与电气工程
钟文枫 编著:暂无简介
前言
第1章功能验证技术与方法学概要
11功能验证与验证平台
111专用芯片设计流程
112什么是验证
113验证平台可以做些什么
114功能验证流程
12验证技术和验证方法学
121黑盒、白盒与灰盒验证
122验证技术
123验证存在的挑战
124验证方法学
125断言验证
126覆盖率驱动验证
13硬件验证语言
131Open Vera
132e语言
133PSL
134SystemC
135SystemVerilog
第2章数据类型与编程结构
21数据类型
211两态数据类型
212枚举类型和用户自定义类型
213数组与队列
214字符串
215结构体和联合体
216常量
217文本表示
218操作符和表达式
22过程语句
221赋值语句
222控制结构
23函数和任务
231函数和任务的区别
232子程序定义
233子程序参数
234子程序返回
235自动存储
24编程结构
241模块
242接口
243过程块和语句块
244数据对象
245程序块
246简单的验证架构
25数据的生命周期和作用域
26数据类型转换
261静态类型转换
262动态类型转换
第3章并发进程与进程同步
31fork…join
311三种并发方式
312进程与变量
313进程控制
32mailbox
321mailbox的基本操作
322参数化mailbox
323mailbox应用实例
33semaphore
331semaphore的基本操作
332semaphore应用实例
34event
341事件触发
342等待事件
343事件的触发属性
第4章面向对象编程入门
41过程编程语言与面向对象编程语言
42类
421类的基本概念
422构造函数
423静态属性与方法
424this操作符
425对象的赋值与复制
426块外声明
43石头、剪刀、布仲裁器实例(基于类的验证平台)
431验证环境顶层
432验证组件
第5章虚接口
51虚接口的基本概念及应用
511虚接口的基本概念
512虚接口的应用
52端口模式和时钟控制块
521端口模式
522时钟控制块
第6章随机测试
61激励产生
611什么是随机
612潜在问题
62随机生成机制
621随机系统函数
622randcase/randsequence
63基于对象的随机生成
631随机变量
632约束定义
633随机方法
634随机使能控制
635约束的动态修改
64标准随机函数
65随机激励的应用
第7章继承与多态
71继承和多态的基本概念
72继承与子类
721类的继承与重写
722子类对象与父类对象的赋值
723构造函数调用
73虚方法与多态
731虚方法
732多态
74虚类和参数化类
741虚类
742参数化类
75约束重写
76数据的隐藏与封装
第8章功能覆盖率
81覆盖率
811目标覆盖率
812代码覆盖率
813功能覆盖率
82SystemVerilog的功能覆盖率
821覆盖组(covergroup)
822覆盖点(coverpoint)
823交叉覆盖点(cross)
83覆盖率驱动的验证平台
第9章断言
91断言的概念及作用
92SVA
921SVA的语法层次结构
922SVA应用实例
923bind
第10章验证重用与验证方法学
101验证重用中存在的问题
102验证方法学OVM
103OVM的四大核心技术
1031基于Factory的验证平台动态构建
1032动态的配置机制
1033测试用例在验证架构的顶层
1034激励产生与验证架构分离
第11章SystemVerilog与C语言的接口
111什么是DPI
112DPI的应用
1121方法的导入
1122方法的导出
1123DPI的数据类型映射
1124DPI的具体应用
附录A覆盖率内置参数和方法列表
附录B断言重复操作符和序列操作符列表
附录CQuestaSim简要介绍
附录D常用术语中英文对照
参考文献
后记
源代码索引SystemVerilog
源代码21枚举类型实例:enum_examplesv26
源代码22用户自定义类型实例:typedef_examplesv28
源代码23多维数组和压缩数组实例:array_examplesv30
源代码24动态数组实例:dy_array_examplesv31
源代码25关联数组实例:as_array_examplesv33
源代码26队列实例:queue_examplesv35
源代码27结构体实例:struct_examplesv38
源代码28类型参数化实例:para_type_examplesv40
源代码29赋值语句实例:assign_examplesv46
源代码210if条件选择语句实例:if_examplesv47
源代码211case条件选择语句实例:case_examplesv47
源代码212for循环语句实例:for_examplesv48
源代码213while循环语句实例:while_examplesv49
源代码214do…while循环语句实例:dowhile_examplesv49
源代码215repeat循环语句实例:repeat_examplesv50
源代码216forever循环语句实例:forever_examplesv51
源代码217foreach循环语句实例:foreach_examplesv51
源代码218ref引用端口类型实例:ref_examplesv54
源代码219模块实例:module_examplesv58
源代码220接口实例:interface_examplesv59
源代码221静态变量实例:static_auto_examplesv65
源代码31fork…join语句实例:fork_examplesv70
源代码32fork…join_any语句实例:fork_any_examplesv71
源代码33fork…join_none语句实例:fork_none_examplesv71
源代码34disable语句实例:disable_examplesv73
源代码35mailbox应用实例:mailbox_examplesv77
源代码36semaphore应用实例:semaphore_examplesv80
源代码37event应用实例:event_examplesv82
源代码41简单以太包的类实例:ether_packetsv84
源代码42类的构造函数实例:new_construct_examplesv88
源代码43类的静态变量实例:static_var_classsv89
源代码44类的静态方法实例:static_method_classsv90
源代码45this操作符实例:this_class_examplesv91
源代码46类的浅复制实例:shallow_copysv92
源代码47类的自定义深复制实例:deep_copysv93
源代码48仲裁器设计(石头、剪刀、布):rps_dutsv95
源代码49验证环境顶层(石头、剪刀、布):top_class_basedsv96
源代码410时钟复位模块(石头、剪刀、布):rps_clock_resetsv97
源代码411验证环境库文件(石头、剪刀、布)——激励单元片段:rps_env_pkgsv98
源代码412验证环境库文件(石头、剪刀、布)——激励生成器片段:rps_env_pkgsv99
源代码413事务驱动器(石头、剪刀、布):rps_driversv100
源代码414监控器(石头、剪刀、布):rps_monitorsv101
源代码415基于类的验证环境(石头、剪刀、布):rps_envsv102
源代码416验证环境库文件(石头、剪刀、布)——记分板片段:rps_env_pkgsv103
源代码51虚接口例子:virtual_interface_examplesv108
源代码52定义虚接口(石头、剪刀、布):interfacesv109
源代码53基于虚接口的事务驱动器(石头、剪刀、布):rps_driversv110
源代码54基于虚接口的监控器(石头、剪刀、布):rps_monitorsv111
源代码55基于虚接口的验证环境(石头、剪刀、布):rps_envsv111
源代码56基于虚接口的验证顶层(石头、剪刀、布):rps_tb_topsv112
源代码57端口模式实例:interface_modesv113
源代码61randcase实例:randcase_examplesv121
源代码62randsequence实例:randsequence_examplesv122
源代码63基于类的随机变量实例:class_random_examplesv123
源代码64随机约束块实例:constraint_examplesv125
源代码65inside操作实例:inside_examplesv125
源代码66dist操作实例:dist_examplesv126
源代码67foreach操作实例:foreach_random_examplesv128
源代码68solve…before操作实例:solve_before_examplesv129
源代码69随机变量使能模式实例:rand_mode_examplesv132
源代码610随机约束使能模式实例:constraint_mode_examplesv133
源代码611标准随机函数实例:std_randomize_examplesv135
源代码612基于类的随机激励实例(石头、剪刀、布):rps_env_pkgsv135
源代码71类的继承实例:class_extend_examplesv139
源代码72类的重写实例1:class_override_examplesv139
源代码73基类与派生类实例:base_derived_examplesv141
源代码74super操作实例:super_examplesv142
源代码75构造函数链实例:new_chain_examplesv143
源代码76类的重写实例2:base_override_examplesv144
源代码77虚方法与多态实例:virtual_poly_examplesv145
源代码78参数化类实例:parameterized_classsv149
源代码79约束块重写实例:constraint_override_examplesv150
源代码81功能覆盖组实例:covergroup_examplesv156
源代码82功能覆盖点实例:coverpoint_examplesv156
源代码83功能分组柜实例:bin_examplesv158
源代码84功能交叉覆盖点实例:cross_examplesv159
源代码85功能覆盖模块(石头、剪刀、布):rps_coveragesv162
源代码86基于功能覆盖率验证环境(石头、剪刀、布):rps_envsv165
源代码91断言序列实例:sequence_examplesv171
源代码92断言属性实例:property_examplesv172
源代码93断言模块(石头、剪刀、布):rps_svasv173
源代码94基于断言的验证顶层(石头、剪刀、布):rps_tb_topsv174
源代码95bind操作实例:bind_examplesv175
源代码111外部Hello程序1(基于C):example 1/hello_cc190
源代码112DPI导入方法实例:example 1/hellov190
源代码113外部Hello程序2(基于C):example 2/hello_cc191
源代码114DPI导出方法实例:example 2/hellov191