状态机出现未知状态导致BUG
问题描述:最近产品中出现了功放与适配器会概率性的出现握手失败的情况,握手过程为主机发送握手信号,然后从机接收到握手信号后响应主机。
问题原因原代码中状态机有些bug:rlc_state: integer range 1 to 11 := 1;高云编译器编译后为rlc_state [3:0],但在状态机运行的时候会出现未知状态0导致程序出现BUG,当状态机为0状态时会随机的跳转到别的状态从而造成状态机乱跳卡死而导致的握手失败。
猜测rlc_state: integer range 1 to 11 := 1;虽然刚开始赋初始值为1但编译器综合成rlc_state [3:0]后在进行状态跳转的过程中会出现未知状态的跳转,因为case语句中最后没有others,以及在有些状态下没有给状态机赋值下一个状态,但编译器会默认赋初值为0进而出现未知状态。
注:建议还是rlc_state: integer range 0 to 11 := 0;
std_logic可能会出现高阻状态和未知状态。