数字电路入门生
先别慌,这种复杂模块的覆盖计划确实让人头大,但拆解开来就有路可走。我的经验是,别一上来就想搞个大而全的模型,那肯定无从下手。
第一步,抓住核心。AI加速器的本质是执行指令、处理数据。所以,你的功能覆盖率模型必须紧紧围绕它的架构说明书和指令集手册。把指令集按功能分组,比如计算类、数据搬运类、控制流类。每一类里,再拆解关键的操作数、寻址模式、数据格式(FP16, INT8等)、特殊功能(比如饱和处理、舍入模式)。数据通路也一样,关注那些多路选择器、FIFO、缓冲区的不同工作模式。
第二步,定义覆盖点(coverpoint)和交叉覆盖(cross)。比如,一个计算指令的覆盖点可以包括:操作码、源操作数1的数据类型、源操作数2的数据类型、目的操作数的数据类型。然后,把操作码和数据类型做交叉,看看是不是所有组合都测到了。交叉是发现角落案例的利器,但别过度交叉,否则爆炸组合数会让你崩溃。优先交叉那些架构上明确有交互或者容易出问题的地方。
第三步,关于代码覆盖率目标。没有绝对安全的数字。行业常见的一个参考基线是:行覆盖率(line)>95%,条件覆盖率(condition)>90%,翻转覆盖率(toggle)>90%。但这只是起点。关键是分析未覆盖的代码。如果未覆盖的代码是冗余的、或属于永远不会触发的错误处理分支(比如某些理论上不可能发生的FIFO上溢),可以和设计人员确认后排除。如果是一些重要的条件分支没测到,那就要反过来补充测试场景或功能覆盖点。
第四步,两者配合。功能覆盖率是你的导航仪,告诉你“该测的功能点测全了吗”;代码覆盖率是你的检查清单,帮你发现“有没有漏测一些代码分支”。理想情况是功能覆盖率达到100%(基于你定义的模型),同时代码覆盖率也达到高水位。如果功能覆盖满了但代码覆盖还有缺口,往往意味着你的功能覆盖模型有遗漏,需要完善。如果代码覆盖很高但功能覆盖不足,那说明测试虽然跑了很多代码,但可能没在验证关键功能,得加强场景。
最后提醒一个坑:别把验证计划写成一篇死文档。它应该是活的,随着验证进展和发现的问题不断迭代。一开始的模型可能不完美,在跑仿真的过程中,你会不断发现新的需要覆盖的场景,加进去就是了。和设计、架构师保持高频沟通,他们对哪些地方复杂、容易错最清楚。
