根据《Writing Testbenches》整理
很多讲verilog的书把重点放在怎么写可综合的RTL代码,编写验证功能性的测试平台这一方面却讲的比较少,会导致很多人认为设计比验证更加重要,但是实际上这和现实并不相符。
现在的芯片规模越来越大,所使用的ip越来越多,验证的复杂度也是急剧提高的,理想状态下,验证人员数量应该是设计的两倍,但是现实很骨感,很多公司连一比一都做不到。
很多时候项目的进度并不会完全按照标准流程来,甚至设计完成了才开始考虑验证的事情。设计进度一旦受到影响,就会产生很多问题。所以,验证技术的目标就是要让设计与验证能够并行化进行,并且在更高层次去实现。
验证工作可以在更加高的层次进行,例如事务级、总线周期级甚至更高级别,而非在最底层的0,1
这个概念是用来精确解释验证的对象是什么的
这是最重要的问题,搞清楚你的任务
从spec到RTL,RTL的迭代都是一种变换,而验证就是要证明变换的正确性
所有的工程师都需要对spec有自己的理解
如果按照这种方式去验证,就会出现下面的恢复路径。最后验证的目标变成了设计是否符合设计人员对于spec的理解,没有办法检查出设计人员对于spec的错误理解。
只要有人介入,就可能导致不确定性和不可重复性,我们需要通过自动化、放差错技术或者冗余技术去减少错误发生的可能性
自动化从根源上消除了一部分人为因素,但是自动化并不是普适的,例如没有明确定义、要求人智能创造的过程。
将人的参与,简化为简单、安全的步骤,人的介入只是为了获取预期输所需要的特定序列或者步骤。这在全面质量管理中被称为“防差错技术”(Poka-Yoke)。
这一种提高可靠性最简单的方法,但是也是代价最高的方法。冗余会要求对于每次变换都需要一个独立的人去验证,尽管费时费力,但是,在芯片设计中,没有什么是比缺陷更加严重的代价。
下图是使用了冗余方法来避免模棱两可的spec导致的错误时的恢复路径。芯片设计中所谓的变换经是根据spec产生RTL,所以应该由另一个人去负责验证。
END