Altifigence Academy

26 / 37 · 概念

计数器调试与最小反例

设计简短测试,区分复位、enable 与回绕边界错误。

最终值正确,顺序仍可能错误

计数器最终为 0,并不能证明 reset 和回绕正确。一直停在 0 的电路也会产生相同结果。需要设置分别揭示正常递增、保持、复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。了解更多和边界回绕的观察点。

刻意让两个功能发生冲突

情况应检查的规格
reset=1、enable=0reset 是否被 enable 屏蔽
reset=1、enable=1reset 是否优先于递增
count=M-1、enable=0暂停时是否错误回绕
count=M-1、enable=1是否准确从 M-1 回到 0
在边沿之间改变 reset同步复位是否在下一边沿生效

若只分别测试各个控制,优先级错误很难被发现。

每列记录一个上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。初始 count=5。错误电路只在 enable 内检查 reset,因此第一边沿仍保持 5。即使最终值相同,首次不匹配也会暴露缺陷。

reset 被 enable 屏蔽的最小反例
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
edge234E0 → E1 → E2
reset101
enable01.
correct after2340 → 1 → 0
bug after2345 → 6 → 0

模 8 参考电路从初始 101 开始。选择 enable=0、reset=1,再推进时钟。正确值应为 000;将 reset 放在 enable 内的错误 RTL 会保持 101。释放 reset 后,再区分 enable=0 的保持与 enable=1 的递增。

让 reset 与 enable 冲突

同步 reset 优先于 enable。enable=0 时保持当前存储值。 q=101; q_next = (q + 1) mod 8

用参考模型寻找首次不匹配

Ck+1=rk?0:(ek?((Ck+1) mod M):Ck)C_{k+1}=r_k?0:(e_k?((C_k+1)\bmod M):C_k)

此表达式是以正常状态 0~M-1 为前提的功能模型。越界状态恢复应作为独立策略加入。每个边沿都计算预期值并与实际值比较。首次不匹配之前那个边沿的输入与状态,是寻找原因的最小起点。

若失败在一千个周期后才出现,尝试删除无关输入区间,用三到五个边沿重现同一错误。修复 RTL 后,将这一最小反例保留为回归测试。应分别审查修改后的规格与代码,避免把设计和测试同时改成同一个错误条件。

自己试试

错误代码用 if(en) begin if(rst) ... end 包住 reset。如何选择初态与输入,用最短序列暴露问题?

阅读解释

从非零初态开始,施加一个 rst=1、en=0 的上升沿。若规格规定 reset 优先,结果应为 0;错误电路则保持旧值。初态若为 0,会掩盖这个错误。

你的选择适用于此浏览器,可随时在页脚更改。