Verilog如何避免Latch
生活随笔
收集整理的这篇文章主要介绍了
Verilog如何避免Latch
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
锁存器(Latch)产生的原因:
目录
1.if结构不完整
2.case结构不完整
3.敏感信号列表不完整
Latch的危害:
1.if结构不完整
例如: module module_Latch1 (input in,en,output reg q );always @(*) beginif (en) q=in;end endmodule由于if语句中缺少else,系统会默认else分支下的输出q会保持不变,即具有寄存器的功能,所以寄存器q会被综合成Latch。
避免方法:
补全if-case结构
module module_Latch1 (input in,en,output reg q );always @(*) beginif (en) q=in;elseq=1'b0;end endmodule赋初值
module tmodule_Latch1 (input in,en,output reg q );always @(*) beginq=1'b0; //给q赋初值0if (en) q=in;end endmodule如果en为真,in赋值给q,否则q会保持为0。
2.case结构不完整
case语句产生Latch的原理和if语句几乎一致。当case列表不完整且没有在末尾加default,或者有多个赋值语句不完整时会产生Latch。
例子:
module module_Latch (input a,b,input [1:0],output reg y);always @(*) begincase(sel)2'b00:y=a;2'b01:y=b;endcaseendendmodule避免方法也是两种:
补全case列表
module module_Latch (input a,b,input [1:0],output reg y);always @(*) begincase(sel)2'b00:y=a;2'b01:y=b;2'b10,2'b11:y=1'b0;endcaseendendmodule或者在末尾加default
module module_Latch (input a,b,input [1:0],output reg y);always @(*) begincase(sel)2'b00:y=a;2'b01:y=b;default:y=1'b0;endcaseendendmodule建议就算列出所有的case列表,也在末尾加上default关键词,这样不仅可以在写Verilog的时候避免Latch的出现,在修改的时候也可以避免每次都要验证是否列出了所有case列表。
3.敏感信号列表不完整
如果组合逻辑内的always@()括号内的敏感列表没有列全,该触发的时候会触发不了,那么相关的寄存器还是会保存之前的结果,因而会产生Latch。
解决方法也很简单,就是直接用always @(*)。
总结
以上是生活随笔为你收集整理的Verilog如何避免Latch的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: verilog中的代码使用
- 下一篇: 组合电路Verilog的几种描述方式