一:出现latch的情况?

在组合逻辑中,有时候往往不需要生成latch,所以必须知道某些信号会综合为latch,通过实践发现下面两类会出现latch:
1.在if-else和case中没有else和default将会导致产生latch。这个在夏宇闻的verilog中有讲到。
2.即使if-else 和case语句都满足if都有else,caes都有default,此时还是有可能出现latch,例如:
代码A:

always @(enable or ina or inb) beginif (enable) begindata_out = ina;endelse begindata_out = inb;end
end

代码B:

input[3:0] data_in;
always @(data_in)
begin
case(data_in)0:         out1 = 1'b1;1,3:       out2 = 1'b1;2,4,5,6,7: out3 = 1'b1;default:   out4 = 1'b1;
endcase
end

verilog代码中避免出现latch方法
在上图两段代码都是标准的if-else 和case语句,但是第二段代码却可以生产latch,通过将第二段代码综合后看RTL就可以清楚看到:

第二段代码产生了4个latch。第二段代码之所以会出现latch,是因为:
out1,out2,out3,out4仅仅在data_in一种情况下赋值,当data_in在非条件下,就没有对该信号赋值。

二、怎么使得代码中消除不需要的latch呢?

   由上面发现即使使用了if-else和 case-default这样标准的代码风格,还是会导致latch的产生的。通过测试可以发现要使得组合逻辑中,特别是在三段式状态机中代码不产生latch,必须做到下面几点:

1. if-else 和case-default必须配套,也就是出现if 必须出现else与之配套;有case必须在后面写一个default。
2.在所有条件下,对信号都进行赋值
下面解释一下第二点,还是按照前面的代码为例,如果将out1在所有条件下都赋值,也就是将代码修改为:

input[3:0] data_in;
always @(data_in)
begin
case(data_in)0:         out1 = 1'b1;1,3:       beginout1 = 1,b0;out2 = 1'b1;end2,4,5,6,7: beginout3 = 1'b1;out1 = 1'b0;enddefault:   beignout4 = 1'b1;out1 = 1'b0;end
endcase
end

然后综合后查看RTL,可以发现:

verilog代码中避免出现latch方法
可以看出out1没有产生latch。所以在信号不多的情况下,可以讲每个信号在所有条件下都进行赋值,这样就会消除latch的产生。
但是,在三段式状态机代码中,特别是状态机多,信号特别多的情况下,在每个条件下都给每个信号赋值,这样就会导致代码很冗长,此时可以给每个信号一个初值。修改方法为:

input[3:0] data_in;
always @(data_in)
beginout1 = 1'b0;out2 = 1'b0;out3 = 1'b0;out4 = 1'b0;case(data_in)0:         out1 = 1'b1;1,3:       beginout2 = 1'b1;end2,4,5,6,7: beginout3 = 1'b1;enddefault:   beignout4 = 1'b1;endendcase
end

verilog代码中避免出现latch方法
这样就是在选择语句之前给信号赋一个初值,这样就不需要在所有条件都给信号赋值,减少代码的重复和代码量。上图代码综合后的RTL图为:


可以发现这种方法也是可行的。

所以总结为:

   1.如果代码简单,信号少,直接在每个条件下都赋值2.如果代码复杂,信号多,就可以在case或是if语句前给信号赋一个初值。

关于第二条,估计会产生一些迷惑,例如在前面代码中data_in为1,out2赋值为0还是赋值为1呢?
这里就涉及到阻塞赋值和非阻塞赋值的区别。在上面代码中一般都是阻塞赋值,也就是上面一句赋值都完成了,才进行第二条语句的赋值。在上面的代码中,就是先给out2赋值为0,然后再赋值为1。这个不同于非阻塞赋值,如果是非阻塞赋值的话,就会导致同时给out2赋值两个值,导致亚稳态。
最后需要注意的是:在组合逻辑中,always@()的括号里面,使用*代替敏感变量,这是在verilog2001中的代码风格,这样可以避免敏感变量不全的情况,建议在写组合逻辑中这样书写代码。

附加

组合逻辑赋值给自己也会产生latch

    always @(*) beginif(condition)aa = 1'b0;elseaa = aa; //generate latchend

verilog代码中避免出现latch方法相关推荐

  1. 如何从代码中获取当前方法的名称[复制]

    本文翻译自:How to get the name of the current method from code [duplicate] This question already has an a ...

  2. wxpython嵌入图片_将图片文件嵌入到wxpython代码中的实现方法

    下面直接上代码留存,方便以后查阅复用. # -*- coding: utf-8 -*- #作者:LeniyTsan #时间:2014-07-17 import wx from wx.lib.embed ...

  3. 代码中应用设计模式,看这一篇就够了

    作者:宁愿呢 cnblogs.com/liyus/p/10508681.html 为什么要使用设计模式 因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展.如果 ...

  4. pyhton中的魔术方法

    魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组 ...

  5. java中synchronized使用方法

    synchronized的一个简单样例 public class TextThread { /**   * @param args   */  public static void main(Stri ...

  6. 在hadoop/hbase等代码中kinit

    在hadoop/hbase等代码中kinit @(HBASE)[hadoop, hbase, storm, kafka] (一)在java代码中kinit的方法 使用hadoop的UserGroupI ...

  7. Java中的main方法

    2019独角兽企业重金招聘Python工程师标准>>> 在一个Java应用程序中,通常程序的入口是一个main方法,它被声明为公有静态方法,参数是一个字符串数组,返回值为Void类型 ...

  8. Python3中正则表达式使用方法

    关注天善智能,走好数据之路↑↑↑登陆天善社区查看更多系列: 欢迎关注天善智能hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 登陆天善社区 ...

  9. 子类方法中super.父类方法

    1.子类方法super.父类方法,并且有自己的方法体内容 下面代码中,子类方法中的"super."的意思就是父类对象调用该方法 2.一个类中只能有一个public的class,别的 ...

  10. Java中System.exit()方法的功能简介说明

    转自: Java中System.exit()方法的功能简介说明 下文笔者讲述java代码中System.exit()方法的功能简介说明,如下所示: Java中System.exit()方法功能:此方法 ...

最新文章

  1. JVM调优总结(7):调优方法
  2. 03_Introduction_to_AMBA_AXI
  3. ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper
  4. python需要安装的库_使用python学习【机器学习】需要安装的库~
  5. linux java远程调试_idea远程linux代码调试
  6. 连连看(HDU-1175)
  7. access用扫描枪输入_判断是否扫码枪输入的通用函数源码
  8. MATLAB2016下载地址,包含安装教程
  9. 手机端放在线条中间的标题
  10. 阿里再减持陌陌股份 持股比例从20.2%降至14%
  11. PHP Redis List [列表] 的使用
  12. 如何对物联网数据进行大数据分析
  13. Atitit java集成内嵌浏览器与外嵌浏览器attilax总结
  14. Java密码类型_java加密类型和算法名称
  15. 神推荐:西瓜导航你值得拥有
  16. 最好用的jQuery日期插件合集,前端设计必备素材
  17. 使用bat注册ocx
  18. 过采样方法、欠采样介绍
  19. Google Earth Engine(GEE)基于哨兵数据计算植被覆盖度—以宁夏为例
  20. springboot基于java的校园二手书籍交易平台毕业设计源码131558

热门文章

  1. 开口式霍尔电流传感器在数据中心直流配电改造的应用
  2. osm数据导入mysql_利用OpenStreetMap(OSM)数据搭建一个地图服务
  3. Ubuntu14.10 更新源
  4. 基于element-ui的Vue计算工作日组件
  5. qume 模拟NVMe zns 设备(Creating an Emulated Zoned Namespace)
  6. spring cloud搭建教程
  7. visio粘贴excel图表
  8. linux文件类型elf,Linux下ELF文件的格式(1)
  9. 光格科技递交科创板上会稿:拟募资6亿 预计年营收3亿
  10. 迪普科技“高”在哪里?