verilog代码中避免出现latch方法
一:出现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方法相关推荐
- 如何从代码中获取当前方法的名称[复制]
本文翻译自:How to get the name of the current method from code [duplicate] This question already has an a ...
- wxpython嵌入图片_将图片文件嵌入到wxpython代码中的实现方法
下面直接上代码留存,方便以后查阅复用. # -*- coding: utf-8 -*- #作者:LeniyTsan #时间:2014-07-17 import wx from wx.lib.embed ...
- 代码中应用设计模式,看这一篇就够了
作者:宁愿呢 cnblogs.com/liyus/p/10508681.html 为什么要使用设计模式 因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展.如果 ...
- pyhton中的魔术方法
魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组 ...
- java中synchronized使用方法
synchronized的一个简单样例 public class TextThread { /** * @param args */ public static void main(Stri ...
- 在hadoop/hbase等代码中kinit
在hadoop/hbase等代码中kinit @(HBASE)[hadoop, hbase, storm, kafka] (一)在java代码中kinit的方法 使用hadoop的UserGroupI ...
- Java中的main方法
2019独角兽企业重金招聘Python工程师标准>>> 在一个Java应用程序中,通常程序的入口是一个main方法,它被声明为公有静态方法,参数是一个字符串数组,返回值为Void类型 ...
- Python3中正则表达式使用方法
关注天善智能,走好数据之路↑↑↑登陆天善社区查看更多系列: 欢迎关注天善智能hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 登陆天善社区 ...
- 子类方法中super.父类方法
1.子类方法super.父类方法,并且有自己的方法体内容 下面代码中,子类方法中的"super."的意思就是父类对象调用该方法 2.一个类中只能有一个public的class,别的 ...
- Java中System.exit()方法的功能简介说明
转自: Java中System.exit()方法的功能简介说明 下文笔者讲述java代码中System.exit()方法的功能简介说明,如下所示: Java中System.exit()方法功能:此方法 ...
最新文章
- JVM调优总结(7):调优方法
- 03_Introduction_to_AMBA_AXI
- ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper
- python需要安装的库_使用python学习【机器学习】需要安装的库~
- linux java远程调试_idea远程linux代码调试
- 连连看(HDU-1175)
- access用扫描枪输入_判断是否扫码枪输入的通用函数源码
- MATLAB2016下载地址,包含安装教程
- 手机端放在线条中间的标题
- 阿里再减持陌陌股份 持股比例从20.2%降至14%
- PHP Redis List [列表] 的使用
- 如何对物联网数据进行大数据分析
- Atitit java集成内嵌浏览器与外嵌浏览器attilax总结
- Java密码类型_java加密类型和算法名称
- 神推荐:西瓜导航你值得拥有
- 最好用的jQuery日期插件合集,前端设计必备素材
- 使用bat注册ocx
- 过采样方法、欠采样介绍
- Google Earth Engine(GEE)基于哨兵数据计算植被覆盖度—以宁夏为例
- springboot基于java的校园二手书籍交易平台毕业设计源码131558
热门文章
- 开口式霍尔电流传感器在数据中心直流配电改造的应用
- osm数据导入mysql_利用OpenStreetMap(OSM)数据搭建一个地图服务
- Ubuntu14.10 更新源
- 基于element-ui的Vue计算工作日组件
- qume 模拟NVMe zns 设备(Creating an Emulated Zoned Namespace)
- spring cloud搭建教程
- visio粘贴excel图表
- linux文件类型elf,Linux下ELF文件的格式(1)
- 光格科技递交科创板上会稿:拟募资6亿 预计年营收3亿
- 迪普科技“高”在哪里?