再谈锁存器在Verilog中的故事
锁存器
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路。它们可以在特定输入脉冲电平作用下改变状态。锁存就是把信号暂存以维持某种电平状态
锁存器出现的危害:
输出信号被锁死,输入信号的变化不起作用;同时使静态时域分析非常复杂。
我们在数字集成电路的设计中要尽可能地避免出现锁存器。
出现锁存器的情况:
1、敏感列表不完整
对于组合电路,在@引导的敏感列表必须包含完整的敏感列表。对于时序电路,@的敏感事件如果不全会变成异步电路,不过异步电路的设计很多综合器不支持(在公司,设计人员就是无用功)。
如果敏感列表不完整,会造成逻辑错误。甚至有可能出现锁存器。比如:
always @ (a) //敏感列表没有b
c=a~^b;
b的变化不会促使always结构变化,这样就是一个带控制的锁存器。
修改代码如下:
always @ (a or b)
c=a~^b;
2、if和else不成对出现
例如:
if (a<b)
out=a;
else if (a>b)
out=b;
这就是一个简单的比较功能。不过if和else没有成对出现,这样如果a=b时,输出会保持不变。但是组合电路中没有存储元件,所有会生成设计之外的锁存器。
修改代码如下:
if (a<b)
out=a;
else if (a>b)
out=b;
else
out=a||b;
3、case语句中没有default
如果需要锁存器,设计代码如下:
module latch (clk,d,q);
input clk;
input d;
output q;
assign q=clk?d:q;
endmodule
原因与i“if和else不成对出现”一样。不再赘述。
总结:
再次对锁存器做一个回顾。
感想:
念念不忘,必有回响!!!