避免latch的产生
latch就是锁存器,数据被所存后,输入会不起作用。
避免不规范的写法
verilog中不规范的写法会导致latch的产生,应当避免这些行为:
组合逻辑中if语句没有else
下面这是个例子,由于没有else语句,会导致if中条件不满足时将输出端口直接接入输入端口,会综合出锁存器
1 | module top_module ( |
应当改为如下的代码,加上else语句
1 | module top_module ( |
组合逻辑中case的条件不能完全列举且不写defult
每加default的情况和if每加else类似,都会产生latch。因此必须保证case要有default语句,或者在case语句之前给每个输出都赋值一个初始值
下面两种方式都可以
1 | // synthesis verilog_input_version verilog_2001 |
1 | // synthesis verilog_input_version verilog_2001 |
组合逻辑中输出变量赋值给自己。
例如:
1 | module latch( |
always中敏感列表不全
1 | module moduled( |
组合逻辑中 always@() 块内敏感列表没有列全(有rst 和 rd两个),该触发的时候没有触发,那么相关寄存器还是会保存之前的输出结果,因而会生成锁存器。直接用 always@(*) 即可消除 latch
条件语句中有多条赋值语句,每个分支条件下赋值语句的不完整,这也会产生 latch
1 | module moduleb( |
其中q1和q2的赋值都不全,当然需要避免这种写法,应该一个always块中只给一个变量赋值。
总结
综上,在组合逻辑中要避免让输出信号处于不定状态! 一定要让所有输出无论在任何条件下都有一个已知的状态,这样可以避免latch的产生。