Writing Testbenches:
Functional Verification of HDL Models
Second Edition
By
Janick Bergeron
Qualis Design Corporation
yf.x 译
2010-9-27
序言
如果你调查硬件设计团队,你将发现现在他们的努力中有60%到80%用于验证。不像可综合的编码,没有特别的编码风格也没有指定的语言用于验证。使用任何可以连接到模拟器的语言和这种语言的各种功能的灵活性,不断产生新的技术和广泛的的验证方法。由于对验证缺乏限制和可用的专长及参考,造成没有专门的解决方法。非正式的验证过程可能从一个非功能性的设计要求重复,通过预期功能的一个子集设计,产生延迟发货的后果。
为何这本书很重要
浏览一下目前可以找到的关于Verilog或VHDL的书。你就会发现多数的篇幅都用来描述语言的细节,除此之外,还有几个章节主要用很多范例讲可综合或RTL编码风格。
只有一节或两节会设计验证。通常,主要内容是介绍语言的构成。验证通常以一种很基本的形式出现,利用简单的范例,一掠而过,不涉及高深的技巧。使得在很努力,很实际的设计里枯燥无味。
本书的第一版是第一本专门讲述硬件模块功能验证技术的书。从那时起,出现了其它基本只讲验证的书。现在大型会议都包括验证。大学和工业界合作,在工程学课程提供验证课。现在单纯的EDA验证公司提供新的工具用来提高生产力和整体设计质量。所有这些有助于创建一个设计验证的正式的知识体。这是创建一个验证科学和加快方法论和生产力进步的必不可少的基础。
本书的第2版,我将提供最新的验证技术。已经用来生产功能齐全的第一硅ASICs,SOC,板和整个系统。它建立在第1版的基础之上—事务级自检、测试—来介绍功能验证的一个改革:覆盖驱动约束随机测试台。
这本书是关于什么的
我将首先介绍关于验证的必要的概念和工具,然后,描述一个设计的有效功能验证的计划和执行的过程。也将介绍覆盖模块的概念,它可用在一个覆盖驱动的验证过程中。
书中包含一些VHDL和Verilog语言的语意,这些在教科书中往往被忽视或过于简化,主要描述可综合的子集。这些生疏的语意对于理解怎么很好的执行、强壮测试台、提供必要的控制和监视器功能有重要的作用。一旦熟练掌握这些语意,很容易理解在新的验证语言里的语意。
我将提供用于促进和监视一个设计的响应的技术,通过抽象物理层事务到高层的步骤,使用总线功能模块。测试台的结构建立在这些总线模块上,创建一个抽象层,验证相关功能,最小化开发,保持努力很重要。当然也演示测试台自检的战略。
创建随机测试台包含不论用什么语言实现的随机函数。我将演示如何产生随机激励,在总线模块上构建,可以修改和设计生成期望的激励参数。随机生成器必须容易外部约束,以增加生成一系列有趣的参数的可能性。
本书另一个重要的概念是行为模型。它用啦平行实现和验证设计,执行更有效地的仿真。多数情况下,行为模块类似于可综合或RTL模块。在本书里,术语“behavioral”用来描述任何足够模仿一个设计的功能的模块,通常使用不可综合构造和编码风格。
必须具备的基础知识
本书主要讲述使用VHDL,Verilog或Open Vera的硬件设计的功能验证。我期望读者至少具备基本的VHDL,Verlog或OpenVera的知识。当然,你必须熟悉编写模块和使用仿真器。本书可能不会设计语法细节。手边放本语法书作为参考时个不错的办法。我没有讲述可综合的子集,也没有限制只用其实现验证技术。验证时一项复杂的任务:强大的语言总是功能很丰富。
我也希望读者对数字硬件设计有基本的了解。书中从许多实际应用领域(视频、数据、计算机等等)挑选了几个假定的设计。这些设计是如何实际的指定、构造,实现的,超出了本书的范围。本书主要讲规范、结构和这些范例的验证的实现。
阅读指引
你真应该从头到尾读一遍,但是,如果你时间有限,下面有几条建议:
如果你选择本书作为教材,你应该主要看第4到第6章和附录A。如果你是刚刚参与硬件设计团队的初级工程师,你可以跳过第3章和第7章。在你积累一些经验后,不要忘了阅读这两章。
对于负责限定一个项目的验证策略的高级工程师而言,第3章、第7章和附录A将是很有趣的。如果你是一个经验丰富的设计师,你也许想跳到第3章。如果你是一个经验丰富的Verilog 或VHDL用户,你也许想跳过第4章----但是,无论如如何,读一下,以确定你是否和我说的“经验丰富”一致。
如果你具有软件背景,第4章和附录A也许看起来有些明显。如果你有硬件设计和RTL编码的经历,第4章和第7章可能最适合你。
*****************************************************************
参考书目
1. 对于Verilog ,我推荐The Verilog Hardware Description Language by Thomas & Moorby , 3rd edition or later (Kluwer Academic Publisher).
2. VHDL,我推荐 VHDL Coding styles and Methodologies by Ben Cohen(KluwerAcademic Publisher)
3. Open Vera, the OpenVera Language Reference Mnaual 可在http://Open-Vera.com找到。
4. e,Specman Elite用户可在http://verificationvault.com找到e language Reference Manual.
如果你的职责仅限于管理一个硬件验证项目,你也许会更关注第3,6,7章。
选择一种语言
一个设计团队通常碰到的第一个问题是决定使用哪种语言。作为本书的作者,我也碰到过同样的问题。在许多案例中,不存在选择语言这个问题。因为公司已经选择了一种语言,并从许可,培训和知识产权方面有大量投入来支持这种语言。但对于一些小公司,过渡型的公司或没有一个核心CAD团队的公司,就由决策者自己的知识和个人偏好来决定使用哪种语言。
VHDL vs. Verilog
我认为,VHDL和Verilog都有它们自己的不足,特别是在验证方面。在可综合的描述方面,它们都有相当的短缺。某些情况用一种语言比用其他的更容易实现。对于特定的模块,一种语言比另一种的更好。一种语言具有比建模的功能更好的特性。但是,通用的准则,没有一个总比另一个好。
部分章节只用Verilog。以我的经验,Verilog更像一种滥用的语言。它有比VHDL更易学的名声,就以学习曲线来说,并不陡峭。但是,所有的语言提供类似的概念:连续语句,并行结构,结构构造和错觉并行。
对所有的语言来说,这些概念必须学习。因为它的要求不严,Verilog 使用户产生安全的假象。用户相信自己知道这种语言,因为没有语法错误或仿真的结果看起来也对。久而久之,随着设计的发展,竞争状态和脆弱的代码结构显现出来。每种语言都同样有个学习曲线下的区域。VHDL陡峭一点,但是Verilog延续的更长。本书的部分章节带领读者深入了解Verilog的学习曲线。
硬件验证语言
硬件验证语言(HVLs)是专门用来高效、批量的实现测试台的语言。当我写这本书的时候,已经有好几种可选。商业的解决方案包括Verisity的e,Synopsys的OpenVera和Forte Design的RAVE。开源的解决方案包括Cadence的SystemC验证库(SCV)和Juniper Networks的Jeda。还有基于Perl,SystemC,C++或TCL的自我发展的解决方案。关于Verilog验证的扩展也添加到SystemVerilog。并非所有的都能支持覆盖驱动约束的随机验证策略(查看“基于随机的覆盖验证方法”)。很多都还是更适合直接测试的策略(查看“直接的测试台方法”)。
从Verilog 或VHDL切换到一种HVL并不仅仅是简单的学习新的语法。虽然用HVL可以用类HDL的直接的方式,但使用HVL要求碰到验证的困难和实现测试台时要变换。使用Verilog和VHDL的直接验证的策略是图像捕捉的验证方法。使用具有覆盖驱动随机验证的HVL策略师同步验证的方法。当使用得当,HVLs可惊人的提高生产力。
如果这本书重写,我不会困扰包含Verilog或VHDL范例。因为它们早就存在,并且有助于理解HVLs提供的新概念,我决定保持这些范例。我也利用这次第2版的机会,更新了Verilog-2001里的新加的Verilog的内容。
胜者是谁
我非常了解VHDL,Verilog,C++,e和OpenVera。用它们工作,教学。当被问到我偏好哪种时,通常我会说这是一个错误的问题。正确的问题应该是“哪一种我恨的最少?”答案是“当下我不常用的那个”。当使用一种语言工作是,你不会注意到用它简单的描述或完成。而是注意到挫败和如果只有你在使用其他语言怎么会如此简单。
验证技术超越了使用的语言。VHDL,Verilog,e和OpenVera都只是实现的工具。整本书都有使用,但范例只用一种语言典型的显示。虽然语法略有不同,我相信只懂一种语言的读者也能理解用其他语言实现的范例。在每种语言要求不同的地方,我将单个的提供。但是,我没有努力顾及每种语言的所有属性。这是一本讲方法的书,不是语法书。
我选择用e和OpenVera,因为它们是我最了解的语言。当我在写作时,它们也是对覆盖驱动随机验证支持最好的语言。本书不会写成中庸的比较,去对比每种语言的特性或实现要求的功能要多少行代码。决定使用一种语言比一味的去面面俱到的比较所有的语言的特性和语法要有价值的多。
所有范例的代码的语法,任何提及的语言或工具限制和任何范例或工具输出的讨论或特性在写作的时候都验证无误的。关于VHDL,使用了VHDL-93和ModelSim 5.5e。关于Verilog,使用了VCSi 6.1和ModelSim 5.5e。关于OpenVera,使用了Vera6.0.0。关于e,使用了Specman Elite 4.1。
***************************************************************** 我欢迎通过邮件janick@bergeron.com来指正书中的错误。这些错误将发布在本书网页的勘误表里。
在第一版,我收到的最多的抱怨就是没有提供一个完整的范例。在这一版中,你会发现,代码范例还是以摘要的形式出现。我坚定地相信,这是让读者注意我要表达的重点的最好的方式。我不想使你埋没在枯淡无味的源码里。另外,完整的源码可以在下述网址找到:
http://janick.bergeron.com/wtb
更多的信息
如果你想进一步了解书中提到的相关主题的信息,可以上述网址找到相关的资源。
在资源区,你将发现工具、文档的链接。
致谢
我的夫人Danielle,始终如一的给予鼓励。我的编辑Kyle Smith,。。。
感谢Mentor Graphics提供的许可和支持。。。。