主要的验证方法包括:
动态仿真(dynamic simulation);
静态检查(formal check);
虚拟模型(virtual prototype);
硬件加速(hardware acceleration);
电源功耗(power consumption);
性能评估(performance evaluation)。
动态仿真
通过测试序列和激励生成器给入待验设计适当的激励,随着仿真进程的推进,判断输出是否符合预期。简而言之,我们需要仿真器来配合这一项工作,验证人员也需要查看比较结果和仿真波形,最终判定测试用例是否通过。按激励生成方式和检查方式,可以将动态仿真进一步划分为:
定向测试(directed test);
随机测试(random test);
参考模型检查(reference model check);
断言检查(assertion check)。
定向测试(directed test)
定向测试指的是激励内容在仿真之前已经决定下来,测试用例给出的激励序列不会在下一次提交任务时改变。
定向测试最终的数据比较分为两种情况:
通过内置的 C 代码进行数据正确性检查;
通过外置的参考模型或者其他检查器来进行信号一致性检查
随机测试
随机序列通过预先定义的约束,每次随机产生合理的数值,通过激励产生器给出测试序列。
断言检查
需要检查各种可能的行为是否符合预期。断言(assertion)提供了这样的特性,它善于针对某一特定的逻辑或时序进行预设,一旦设计的实际行为不符合断言的描述,则给出检查报告。
应用场景:
集成连接。例如,片上网络多个发起端和目标端之间的访问路径检查,或者系统集成
中各个模块之间的连接关系。
总线协议。针对工业标准总线,有商业验证 IP 可以协助验证设计是否按照总线协议
实施。
仲裁机制。仲裁机制中的各种模式通过检查来保证仲裁执行的合理。
数据一致性。对于存储单元,数据的一致性检查可以通过检查端口读写来预期数据的
一致性。
数据进出。对于队列设计,也可以建立模型来检查断言。
状态机。检查状态机的跳转是否正常。
输入限定。基于假设的输入限定可以通过断言来判断输入是否符合预期,这对错误源
排查也有帮助。
自定义断言。用来检查各个设计的细节,通常这些细节属于设计人员和验证人员关注
的功能焦点。
静态检查
语法检查(syntax check);
语义检查(linting check);
跨时钟域检查(CDC,Cross-clock Domain Check);
形式验证(formal verification)。