Verilog如何避免Latch
鎖存器(Latch)產(chǎn)生的原因:
目錄
1.if結(jié)構(gòu)不完整
2.case結(jié)構(gòu)不完整
3.敏感信號(hào)列表不完整
Latch的危害:
1.if結(jié)構(gòu)不完整
例如: module module_Latch1 (input in,en,output reg q );always @(*) beginif (en)?q=in;end? ? ?? endmodule由于if語句中缺少else,系統(tǒng)會(huì)默認(rèn)else分支下的輸出q會(huì)保持不變,即具有寄存器的功能,所以寄存器q會(huì)被綜合成Latch。
避免方法:
補(bǔ)全if-case結(jié)構(gòu)
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會(huì)保持為0。
2.case結(jié)構(gòu)不完整
case語句產(chǎn)生Latch的原理和if語句幾乎一致。當(dāng)case列表不完整且沒有在末尾加default,或者有多個(gè)賦值語句不完整時(shí)會(huì)產(chǎn)生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避免方法也是兩種:
補(bǔ)全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關(guān)鍵詞,這樣不僅可以在寫Verilog的時(shí)候避免Latch的出現(xiàn),在修改的時(shí)候也可以避免每次都要驗(yàn)證是否列出了所有case列表。
3.敏感信號(hào)列表不完整
如果組合邏輯內(nèi)的always@()括號(hào)內(nèi)的敏感列表沒有列全,該觸發(fā)的時(shí)候會(huì)觸發(fā)不了,那么相關(guān)的寄存器還是會(huì)保存之前的結(jié)果,因而會(huì)產(chǎn)生Latch。
解決方法也很簡(jiǎn)單,就是直接用always @(*)。
總結(jié)
以上是生活随笔為你收集整理的Verilog如何避免Latch的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog中的代码使用
- 下一篇: 组合电路Verilog的几种描述方式