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的几种描述方式