电路板玩家2023
从实际流片和仿真debug的经验看,判断序列检测器有没有bug,光看代码静态检查不够,必须考虑动态行为。我一般会心里默默跑几个关键测试向量,这是最快的方法。
首先,构造一个最长的正确序列,比如1011,看输出是否只在最后一个bit拉高一个周期。然后,马上接一个干扰,比如在1011之后输入0,输出应该立刻变低,不能持续。这里常有的bug是输出信号没有及时清零。
其次,重点测试重叠序列。输入1011011,你应该看到两次有效输出。如果只在第一个1011和第二个1011末尾各输出一次,那是对的。如果输出次数不对,或者输出脉冲宽度不对,重叠状态转移肯定有问题。
第三,跑随机长序列。心里模拟可能不现实,但你可以检查代码的“健壮性”。比如,检查是否所有状态在任何输入(0/1)下都有明确的转移路径,不能有状态缺失,否则综合后可能锁死。再比如,检查输出逻辑是否只在明确的状态和输入条件下触发,防止毛刺误触发。
另外,提一个工程师容易忽略的点:异步复位。检查复位信号是否真的把所有状态寄存器和输出寄存器都复位了,并且复位后的状态机处于正确的起始状态。有些代码复位后状态变量是未知的,这在实际电路中是灾难。
最后,如果是手写代码,留意一下是否使用了可综合的语法。用initial做初始化、在always块里用#延迟,这些在面试代码里出现基本就是坑。
