想了半个月,决定还是写一些关于硬件验证的文章,也算是我前4个月实习工作的总结。内容比较多,我慢慢写,也就当连载了。
本文大部分由我的工作报告翻译整理而来,有些地方翻译得可能不尽完美,我已将关键的英文原词给出。
在硬件验证方面,我也是个初学者,但是看过了国内某论坛对于硬件验证的讨论,觉得现在国内实在对硬件验证理解得太单纯。
什么是硬件验证?
硬件验证(或者说“芯片验证”),真正的英文是Pre-silicon Verification,就是流片前验证。硬件验证实际上是对设计模型(RTL)的功能性验证,同时尽量发现潜在的隐患。也就是说,硬件验证的首要任务是保证设计模型能完成所有预先设计的功能,其次才是发现设计漏洞(bug)。所以,硬件验证并不是单纯的调试(debug)。
为什么要硬件验证?
硬件和软件不一样。如果软件出现漏洞(bug),进行相应的升级(update)或者修补(patch)就可以了。但是硬件就不同了。如果硬件出现故障(malfunction),唯一的解决方法就是替换(replacement),这将耗费大量的人力和财力。同时,芯片厂同批产品全部需要销毁,这对于芯片制造企业来讲,也是一个很大的损失。所以,现在的芯片制造企业大多都成立了专门的硬件验证部门,其目的就是防患于未然。
硬件验证是硬件生产中非常关键的一步,以至于现在的硬件厂商用二倍于设计的时间来进行验证。[1] 通过验证,不仅可以找出缺失的功能和错误的响应,也可以测试硬件的性能和发现隐藏的问题。在硬件验证过后,虽然不能保证硬件100%稳定运行,但是可以确认在绝大多数情况下硬件能正常工作。
怎样进行硬件验证?
最早的硬件验证使用确定性验证法(Deterministic Verification,我觉得翻译成“针对性验证法”更恰当些),也就是手工生成激励输入(stimulus),然后人工比对输出响应(response),如果响应与设计相吻合,则内部电路正确。这种方法的好处就是针对性非常强,我们可以针对某一个信号或者某一个引脚的动作(behaviour)进行测试。但是这种方法的弊端也很明显,如果对每一个引脚都做确定性验证,那将消耗大量的时间和精力。尤其是现在的芯片规模越来越大,功能越来越复杂,如果做完整的确定性验证,花费的时间可能达到数百年。
现在比较通用的方法是随机验证法(Randomization),就是由程序随机生成输入激励,然后将输出响应和预测值进行比对,从而判断设计是否工作正常。这里就需要引入一个“参考模型(Reference Model)”的概念。
由于输入是随机的,不确定的,那么如何得出相对应的输出就是一个很棘手的问题。如果用人工计算的方法,那就和前面提到的确定性验证法一样了。为了避免大量的人力劳动,预测的过程将由程序来替代。而这个通过输入预测输出的模型就叫做参考模型。在实际操作中,参考模型和设计模型由不同的人员编写,以保证对设计理解的一致性。换句话说,就是避免同一个人犯同样的错误。
事实上,现在的硬件验证已经将针对性和随意性两种验证方法相结合,发挥两者的优势,达到验证开销的最小化。整体随机验证法是硬件验证的终极方案,即所有的输入激励均由程序随机产生。这种方法的好处就是保证了输入的多样性,同时能检测出只有在特定状态下才会引发的错误(Corner Cases)。但是这种方法对于参考模型的要求非常高,一般到验证后期、待参考模型完善才会使用。
既然自动验证需要程序预测,那么相应的编程语言也就由此而生。通常,在设计上,工程师们使用硬件设计语言(HDL,Hardware Design Language或者Hardware Description Language),但是,在验证方面,硬件设计语言无法胜任大部分要求(比如说,遇错报警,随机产生激励等等)。这时候,硬件验证语言(HVL,Hardware Verification Language)出现了。目前用得比较广泛的硬件验证语言是Synopsys的Vera和Cadence的
e语言。有人说SystemVerilog和SystemC是更高级的硬件验证语言,没错,但是我只接触过Vera,对Vera最熟悉,所以下面对硬件验证的讨论我将使用Vera语言。
Vera语言
Synopsys公司很有意思,他们说OpenVera是一个语言而Vera是一个编译器。这种混淆视听的言论没必要再追究了,既然绝大多数工程师都说Vera语言,那么我也顺着一起称Vera为语言。在此我不想介绍Vera的历史,但是要提一点,听说Vera是一个中国团队开发的,开发这个语言的人都很厉害,在硬件方面都是大师级水平。暂且不论这个道听途说是否正确,首先这些大师能研究出能被工业界广泛应用的高级工具就让人佩服。
Vera语言是一个面向对象(OO,Object Oriented)的语言,其核心概念就是对象和继承,这一点相信学过Java的人都很熟悉。Vera程序能够很好地和Verilog程序交互,这也是使Vera成功的重要一点。Vera的语法跟Java、C和Verilog都很相似,这样一来可以缩短学习Vera语言的时间。最后要提一点,Verilog+Vera+OVA的功能升级后就是SystemVerilog。所以,要掌握SystemVerilog的概念,Vera必不可少。
这一部分就先讲这么多,下一部分开始讲测试平台(testbench)。
[1] 参见《编写测试平台(第二版)》