芯片测试初学者
哥们,我刚搞完一个PCIe控制器的覆盖,和你这情况类似。说点实在的步骤和踩过的坑。
首先,方法论上可以借鉴V计划(V-model)的思想,从验证计划(verification plan)倒推覆盖点。你的验证计划里应该列出了所有需要测试的场景(scenario),把这些场景分解成具体的功能点,每个功能点对应到covergroup或coverpoint。这样能保证覆盖点和测试目标对齐,避免为了覆盖而覆盖。
具体到DDR控制器,我建议从接口和状态机入手。
接口覆盖:DDR控制器一定有AXI或AHB之类的用户接口,和DFI之类的PHY接口。在接口上定义coverpoint,比如AXI接口的burst类型、size、地址对齐情况、outstanding数量等。PHY接口上覆盖各种命令码、bank地址、行列地址的切换。这些是控制器与外界交互的“语言”,必须覆盖全。
内部状态机覆盖:这是核心。把控制器的核心状态机(比如初始化FSM、命令仲裁FSM、刷新管理FSM)的状态和状态迁移作为coverpoint。确保状态机所有状态都被访问过,所有合理的迁移路径都被触发过。这个往往能发现一些深藏的bug。
交叉覆盖的实用技巧:别一开始就搞大交叉。先让单个coverpoint的覆盖率上去。然后分析覆盖报告,看看有没有哪些coverpoint的组合是仿真从来没碰到过的。针对这些“空白区域”,再有目的地设计一些定向测试或者增加约束随机的权重,或者补充一些交叉coverpoint。这叫“覆盖率驱动的验证闭环”。
一个大坑:注意采样时机(sample point)。比如采样命令时,一定要在命令被真正接受和执行的那个时钟沿采样,而不是在发出时就采样,否则可能采到被丢弃的命令。多看看波形,确认你的采样点是对的。
工具建议:用好仿真工具的覆盖率分析功能。它们通常能帮你列出所有信号、状态机,你可以从中勾选感兴趣的作为覆盖点,这是一个不错的起点,但一定要自己根据功能进行整合和抽象,不能完全依赖自动生成。
