背景
在数字电路中我们学习过触发器和锁存器,但是在写Verilog的时候很少使用latch(锁存器),这是为什么呢。
触发器(FF)与锁存器(latch)对比
基本定义
锁存器,是一种对脉冲电平敏感的存储单元电路。锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。两者的基本功能是一样的,都可以存储数据。
产生场景
锁存器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。
latch危害
latch 的主要危害是会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免 latch 的使用。
Verilog中如何避免产生latch
组合逻辑中,if 或者 case 语句不完整的描述, 比如 if 缺少 else 分支,case 缺少 default 分支,导致代码在综合过程中出现了 latch。解决办法就是 if 必须带 else 分支, case 必须带default 分支。
但只有不带时钟的 always 语句 if 或者 case 语句不完整才会产生 latch(此时为逻辑电路), 带时钟的语句 if或者 case 语句不完整描述不会产生 latch。
代码
always@(posedge clk_50M or negedge rstn) begin
if(enable) begin
data_mux <= data;
end
//else begin
// data_mux <= 0;
//end
end
此代码不产生latch
always@(*) begin
if(enable) begin
data_mux <= data;
end
//else begin
// data_mux <= 0;
//end
end
此代码会产生latch