定向测试是一种编写定向测试来验证设计中的每个特性的方法。约束随机测试是一种使用约束随机生成器自动生成激励的方法,该生成器根据设计规范生成激励。下表比较了两者的优缺点。推荐的方法是混合使用这两种方法——约束随机覆盖大部分验证空间,然后指导测试覆盖难以到达的边界条件。
定向测试 | 约束随机测试 |
---|---|
针对每个功能点需要编写一个或者多个测试向量 | 使用激励发生器根据功能点,自动生成符合功能规范的测试向量 |
每次测试都能很简单的进行追踪,具有很好的可视化和可预测性 | 测试是自动生成的,因此只能通过收集覆盖率,并观察覆盖率确保功能的验证 |
当设计特征被充分了解后,定向测试的编写会更加简单 | 开发约束随机测试平台更加复杂,也更加需要经验。需要更多的事件来设计验证平台。 |
对于复杂的设计,定向测试的编写会变得非常困难并且事件消耗会很大 | 与大型测试套件相比,约束随机生成器在开发后更容易维护 |
定向测试编写仅限于通过理解设计规范确定的场景 | 约束随机生成器可以结合随机配置来覆盖更多的场景和特性,从而更好地强调设计,并覆盖手动识别可能遗漏的一些场景 |
自检测试是指在测试结束时通过某种方式来检测测试结果的测试。在测试中,可以通过计算某些内存操作的结果或从DUT(如状态寄存器或任何其他信息)收集结果来预测结果。
在覆盖率驱动的验证方法中,验证计划是通过将每个特性或场景映射到一个覆盖率监视器来实现的,该监视器在仿真期间收集覆盖率信息。
设计的功能验证是通过创建定向测试以及对激励进行不同控制的约束随机激励生成器来完成的。
通过设计验证项目,开发一组测试,该测试套件用于验证设计正确性、发现设计中的bug和收集覆盖率等。
测试分级是一个过程,在这个过程中,单个测试根据不同的标准(如功能覆盖率、发现的bug、仿真运行时、维护的容易程度等)对质量进行分级。
这个过程有助于从测试套件中识别出有效的测试,从而为设计验证开发出最有效的测试套件。
基于断言的验证(ABV)是一种用于捕获特定设计意图的方法。这些断言用于仿真、形式验证,以验证设计实现是否正确。ABV方法可以通过断言的优点来补充其他功能验证方法,从而实现有效的验证。
断言的一些好处如下:
SPEC:有两个输入和输出端口A和B,如上所示。每个端口可以接收大小在64到1518字节之间的可变数据包。每个包将有一个4字节的源地址(Source Address)和4字节的目标地址(Destination Address),以及跨包计算的数据和一个4字节的CRC,如下所示。数据包将根据目标地址(Destination Address)被切换到一个输出端口。
对于这类有设计说明的问题,第一步是理解设计说明,并向面试官阐述问题。下一步是确定要验证的场景,并提出验证计划和策略文档。这应该列出要验证的特性/场景,可以使用什么方法来验证(定向/约束随机、覆盖、断言,等等),如何检查正确性等等。此外,还应详细说明如何产生激励以及如何进行检查。
另一个方面是考虑所有的设计特性,并确定需要验证的关键case。现在,让我们试着列出如何验证这个简单的路由器设计
单端口RAM只有一个读和写端口。因此,它只能在任何给定的时间点进行读或写操作。其他需要考虑验证的设计规范包括RAM大小、地址和数据总线的宽度。基于此,以下是一些需要验证的场景:
如果您被进一步要求定义一个验证环境,您可以考虑像上面这样的场景,并定义一个有向或有约束的随机环境是否会更好地工作,以及如何设计激励生成器和检查器。
单个端口RAM只有一个读和写端口。所以它只能在任何给定的时间点进行读或写操作。一个双端口RAM有2个读/写端口,因此允许同时读写。
解释所有需要验证的场景,以确保ALU按照下面的SPEC工作:
以下是需要对这个给定的ALU设计进行验证的场景:
事件驱动仿真器对每个事件进行设计评估,采用每个事件并通过设计传播变化,直到达到稳定状态。事件是设计元素的任何输入激励的更改。由于输入和下游设计的信号反馈的到达时间不同,一个设计可能在一个周期内被评估多次。
例如:考虑在时钟上运行的两个触发器之间的逻辑路径。组合逻辑路径可以有多个门和反馈路径。在时钟变化时,当第一个触发器的输出发生变化时,它将应用于组合逻辑的输入,并进一步应用于组合逻辑中不同阶段输入的任何变化,这会触发要评估的特定设计。在这个值稳定下来并且不再在那个时钟周期中变化之前,可能需要进行几次评估。大多数业界广泛使用的模拟器都是事件驱动的,比如:来自Mentor的Questa、来自Synopsys的VCS或来自Cadence的Incisive模拟器。这是因为事件驱动模拟器提供了准确的模拟环境。
基于循环的模拟器没有时钟周期内的时间概念。它们一次性评估状态元素或端口之间的逻辑。这有助于显著提高仿真速度,因为每个逻辑元素在每个周期中只计算一次。缺点是它不能真正地检测信号中的任何小故障,而且它只在完全同步的逻辑设计上表现正常。由于在仿真期间没有考虑设计的时间安排,因此需要再所有的静态时序分析工具对时序进行单独的验证。基于循环的模拟器在一般设计中不太受欢迎,但在一些开发大型设计(如微处理器)的公司中可以定制和使用。
事务是一组低层信息(如一组信号)的高级抽象。当设计在信号级信息上运行时,testbench需要在信号级与设计接口驱动程序和监视器,而testbench的所有其他方面都可以抽象为事务级。在基于事务的验证方法中,testbench以分层的方式进行架构,其中只有较低层的组件在信号级进行操作,而所有其他组件都基于事务进行操作和通信,如下所示。
这是测试你对不同工具的意识的一个普遍问题。 根据你对各种工具的回答和经验,还可能会询问你在使用这些工具时可能遇到的难易程度/局限性方面的观点。 没有固定的答案,但是常用的模拟器是Mentor Graphics的Questa,Synopsys的VCS和Cadence的Incisive模拟器。 Synopsys的Verdi还是与DVE一起调试的常用工具。 正式工具包括来自Cadence的Jasper和来自Mentor graphics的QuestaFormal。
参考模型通常是符合spec的不可综合模型,通常使用高级编程语言(例如C / SystemVerilog)编写。 有时会实现参考模型,以便以周期级别的精度或更高级别的边界匹配设计规范。 例如:CPU /微处理器的参考模型应该准确地对指令边界处的状态进行建模,而AMBA总线协议的参考模型应该根据该协议具有精确的周期。 参考模型通常用于检查器/记分板中,以生成给定激励的预期响应,以便可以将其与实际结果或从设计获得的输出进行比较。
传统上,总线功能模型(BFM)是用高级编程语言(如C / SystemVerilog)编写的不可综合模型,该模型可对总线接口的功能进行建模,并可连接到用于仿真设计的设计接口。 在BFM的一侧,将是一个在信号级别上实现总线协议的接口,另一侧将具有一个接口,以支持发送或接收事务。 随着时间的流逝,这个定义已经演变,在诸如UVM之类的方法中,没有像BFM这样的实际组件,他的功能是由一系列组件(如驱动程序,监视器和接收器)实现的。
有很多指标用于跟踪针对计划的验证进度。 验证计划根据定向测试或针对详细方案和特殊情况的功能覆盖率监视器,捕获要验证的功能。 该计划还包括了有关验证环境开发的详细信息,其中包括激励产生和检查方法。 通过跟踪环境开发(激励发生器,检查器,监视器等),测试开发和功能覆盖率监视器开发的完整性,可以在项目的早期阶段跟踪进度。 一旦开发了大多数测试和受约束的随机数发生器,通常就可以在服务器场中以回归方式运行测试,然后根据回归通过率,错误率和功能覆盖率来监视进度。
当设计的表现与设计规范相匹配而没有任何错误时,可以将功能验证称为完成。为此,我们需要对设计施加激励,以涵盖所有可能的输入可能,并验证设计是否符合规格要求,并且没有任何错误。但是,随着设计复杂性的不断提高,实际上不可能定义所有可能的输入激励方案。此外,资源和时间的限制也使得这种完整的理想定义不切实际。
因此,在大多数项目中,验证的完整性与通过一组度量和过程获得的信心有关,该度量和过程使设计缺陷的风险降至最低。以下是为实现对验证完整性的高度信任而遵循的一些度量和过程:
GLS是“门级仿真(Gate Level Simulation)”的首字母缩写。 在将RTL代码综合到门级网表之后,运行门级仿真。 GLS构成了验证生命周期的重要组成部分。 除了STA(静态时序分析,Static Timing Analysis)和LEC(逻辑等效性检查,Logical Equivalence Checking)之类的静态验证工具外,它也是必需的,因为STA和LEC不能涵盖/报告所有问题。 GLS主要用于:
功率和性能是成功产品的两个重要设计要点。 尽管大多数设计在理想情况下都希望以尽可能低的功耗获得尽可能高的性能,但实际上并非总是如此。 动态功耗与CV^2f成正比,其中f为频率,V为电压,C为电容。 因此,通常:
因此,为了获得最佳性能和功率目标,设计需要选择正确的电压和频率值。
注意:下一章(验证方法)的“电源和时钟”部分(6.3)中提供了有关电源和时钟的更多问题。
Cracking Digital VLSI Verification Interview 第五章
原文:https://www.cnblogs.com/icparadigm/p/12774123.html