Verilog专题(三)如何在组合逻辑中避免latch的产生

前言

    对于verilog的学习,这里推荐一个比较好的实践网站HDLBits:https://hdlbits.01xz.net/wiki/Main_Page

    本专题记录一些我觉得有价值的题目,希望通过这些题目可以对verilog更加熟练。

    第三个专题主要讨论一个重要的问题:如何在组合逻辑中避免产生锁存器。

 

1、为什么会产生latch?

    一般语法正确的代码不一定会导致电路合理,如果你只想综合出纯组合逻辑的电路,但是有时候会综合出组合逻辑+触发器or锁存器。通常的原因是:“在您指定的情况以外的情况下会发生什么?”, Verilog一般会保持输出不变,这种“保持输出不变”的行为意味着需要记住当前状态,从而产生一个锁存器,组合逻辑(例如逻辑门)无法记住任何状态。这是组合逻辑中产生latch的主要原因。

 

2、如何避免产生latch?

    (1)在组合逻辑中,容易综合出锁存器的语句是if和case,在if-else和case中没有else和default将会导致产生latch,如下面的代码和rtl网表所示。 

Verilog专题(三)如何在组合逻辑中避免latch的产生

Verilog专题(三)如何在组合逻辑中避免latch的产生

 

    本来只想产生一个mux的组合电路,但是却产生了锁存器,这不是我们需要的电路,因此作出以下修改。

Verilog专题(三)如何在组合逻辑中避免latch的产生

Verilog专题(三)如何在组合逻辑中避免latch的产生

 

    (2)从上面的代码和电路图可知,其实只要配对使用if...else(同理,case配default使用)就基本上可以避免锁存器,但是如果代码复杂,信号很多这种情况该如何解决?

    针对上面的问题,我们来看一段代码和综合的电路。

Verilog专题(三)如何在组合逻辑中避免latch的产生

Verilog专题(三)如何在组合逻辑中避免latch的产生

 

    上面的组合逻辑代码产生了锁存器,如何解决这个问题?显而易见,按照上述的方法,把每个if都补上else就好了。(PS:如果case里面的信号描述齐全了,可以不用加default语句

Verilog专题(三)如何在组合逻辑中避免latch的产生

Verilog专题(三)如何在组合逻辑中避免latch的产生

 

    但是假如有很多个if(假设有10个好了),那就要写10个else,那岂不是很麻烦?我这里提供另外一种方法——赋值法,代码如下。

Verilog专题(三)如何在组合逻辑中避免latch的产生

Verilog专题(三)如何在组合逻辑中避免latch的产生

      从上面的综合电路可以看出,赋完初值之后,latch消失了。

 

    (3)最后再介绍一种会产生锁存器的情况,如果组合逻辑中[email protected]()块内敏感列表没有列全,该触发的时候没有触发,那么还不是保存了之前的输出结果,因而会生成锁存器。但是这种情况比较简单解决,就是把敏感信号补全或者直接用[email protected](*)。

 

3、总结

    1. 如果代码简单,信号少,直接按照if-else或者case-default的格式在每个条件下都赋值 ;

    2.如果代码复杂,信号多,就可以在case或是if语句前给信号赋一个初值;

    3.写组合逻辑电路的时候,推荐用[email protected](*),避免漏写敏感信号

 

微信公众号

     建立了一个微信公众号“Andy的ICer之路”,此公众号主要分享数字IC相关的学习经验(后期打算与****同步更新),做公众号的目的就是记录自己的学习过程,很多东西回过头来可能就忘记了,为了记住知识和分享知识,希望自己可以保持更新,有兴趣的朋友可以关注一下!

Verilog专题(三)如何在组合逻辑中避免latch的产生