1. latch是电平触发,无法实现同步操作,与我们正常的时序逻辑电路设计思路不符。
2. latch会对输入电平敏感,受布线延迟影响较大,比较容易导致输出有毛刺产生。
3. latch会导致静态时序分析和DFT会很复杂。
4. 在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现。
latch的好处:
因为使用latch可以timing borrow,在高速电路设计中(timing会很紧),有时候就需要用latch。
这次讲一下latch。
latch的危害已经说过了,这里不再多说,关键讲一下如何避免。
1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。
1 always @( * ) begin 2 3 if ( sig_a == 1'b1 ) sig_b = sig_c; 4 5 end
这个是绝对会产生latch的。
正确的应该是
1 always @( * ) begin 2 3 if ( sig_a == 1'b1 ) sig_b = sig_c; 4 5 else sig_b = sig_d; 6 7 end
另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。
1 always @( * ) begin 2 3 if ( rst == 1'b1 ) counter = 32'h00000000; 4 5 else counter = counter + 1; 6 7 end
但如果是时序逻辑进程,则不存在该问题。
2)case语句的default一定不能少!
原因和if语句相同,这里不再多说了。
需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。
3)组合逻辑进程敏感变量不能少也不能多
这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。
顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。
1 /********************************************************************************* 2 * Company : 3 * Engineer : 空气微凉 4 * 5 * Create Date : 00:00:00 22/03/2013 6 * Design Name : 7 * Module Name : 8 * Project Name : 9 * Target Devices : 10 * Tool versions : 11 * Description : 12 * http://www.cnblogs.com/kongqiweiliang/ 13 * Dependencies : 14 * 15 * Revision : 16 * Revision : 0.01 - File Created 17 * Additional Comments : 18 ********************************************************************************/ 19 `timescale 1ns/1ps 20 `define UD #1 21 /*******************************************************************************/ 22 module LATCH_N 23 ( 24 //Interface package 25 input iDAT ,// 26 input iDAT_EN ,// 27 output reg oDAT // 28 ); 29 //------------------------------------------------------------------------------- 30 always@(*)begin 31 if(iDAT_EN == 1'h1) 32 oDAT = iDAT; 33 else 34 oDAT = iDAT; 35 end 36 //------------------------------------------------------------------------------- 37 endmodule