所有IC设计同学必然知道的知识是——verilog中的变量都是4态的,即1,0,z,x。
前两者很好理解,就是高低电平,z就是没有源头电平驱动的高阻态(即没有连线的悬空状态),但对于第四态x,包括我自己在内的很多人理解都是糊里糊涂。
x态就是不定态,什么是不定态?
不定态一种特殊的逻辑状态(不是物理状态),在仿真和验证过程中出现,表示信号的值未知或不确定。这可能是由于信号未初始化、多驱动、异步输入等原因处于不稳定状态。不定态帮助检测设计中的问题,如竞争条件、逻辑错误或未初始化的寄存器。在实际电路中,不定态通常会导致不可预测的行为,因此在设计中需要避免或显式处理。
将上面一段话看三遍,然后得出结论:x态不是实际的物理状态,不定态只是用于标识电路运行过程中的不稳定状态,为了帮助设计人员查漏补缺而设置的理想状态。当仿真出现不定态时候,对应于实际芯片物理器件的1/0状态,这里的1/0是随机进入高/低电平,而不是卡在高低电平的中间开关阈值状态,所以实际芯片中是没有x态的,只有0,1。
既然实际并不存在x态,为什么我们还需要重视并排除x态呢,因为x态代表了电路有50%的可能性在高电平,有50%的可能性在低电平,如果你的芯片中有一个63位的控制寄存器,那么你的芯片就会随机进入1/(2^64)的状态中一种,俗称跑飞了。
说一个真实项目中的案例:同学在仿真开始的一段时间里时看到某enable使能信号是x态,此时模块的所有输出也都是x态,因为都是x态也没有信号变化,他就以为模块没有正常开始工作,所以只关注了复位后的模块状态。当RTL在帕拉丁仿真器上跑的时候(硬件仿真加速器模拟了实际电路),仿真一开始,使能信号就被拉高(而不是x态),所以模块立马根据随机输入进行计算,算出的结果快速从串口传出,堵塞了芯片的串口通信。虽然这并非一个致命问题,但也反映出因为x态这个小问题误解导致的bug。
不定态在verdi中是红色标识的,用以提醒当前仿真时刻某个器件上的状态无法决断,设计人员最好检查一下。解决不定态通常涉及确保信号在其使用之前已被正确初始化,或通过适当的同步和复位电路来管理信号的状态。
除了不定态x之外,和x态相关的语句都会导致上述的问题,分支语句casex也会导致设计出现问题,因为casex不关心x和z所在的bit位。但后仿真和综合实现的时候,门级模型中并没有不确定值x,结果一定是1或0中的一个,这就导致可能进入不期望分支中去,导致仿真所用RTL和综合除的网表功能不一致。
另外,“===”和“==”在关于x态的判断中也有区别,应当留意。
所以现在明白casex为什么是不可综合的了吧,因为x态本来就不是物理的真实状态。