从可观察行为开始

针对一个小型 RTL 模块,定义输入事务、预期输出和允许的延迟。让 AI 从规格中整理测试矩阵:复位、正常传输、边界值和停顿。如果只提供实现并要求编写测试,测试可能重复实现中的错误。先明确独立的参考模型,再围绕它构造激励。

选择正确的采样时机

在仿真模型中,时钟边沿与输出稳定并不是同一时刻。如下所示,在边沿后等待 ReadOnly,可读取当前时间步的最终值。该片段应放在使用 dut.clk 时钟的异步测试中。进入只读阶段后,不要在同一阶段写信号;驱动器与监视器应分别安排。

python
from cocotb.triggers import RisingEdge, ReadOnly

await RisingEdge(dut.clk)
await ReadOnly()
# Sample settled outputs here.

让失败明确可判定

使用断言将输出与参考结果比较,为等待设置超时,并统计已接受的事务。单纯输出日志并不会让测试失败。确认监视器确实观察到了传输,而不是在没有观察结果的情况下结束。使用随机激励时,保留随机种子、输入序列和首个不匹配事务,便于其他工程师复现失败。

保留回归用例

记录 cocotb 和仿真器版本、HDL 源文件、顶层模块及参数。修复后重新运行原始失败场景和相邻边界用例。可让 AI 缩减失败测试,但必须保留失败条件。最终交付可复现的报告和能自动判定结果的测试。同时对 RTL 运行静态检查和综合:仿真只能覆盖实际执行的场景。

接受结果前需要检查的项目

有用的测试能够发现错误、说明差异,并用相同输入复现结果。

来源