欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Verilog如何避免Latch

发布时间:2024/10/14 编程问答 26 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。