整理一下--~~觉得还不错--~~其实latch就是在生成rtl图的时候,意想不到的寄存器,比如说if else或者case语句没有赋值完整,这样会有别的分支存在的时候,会导致一些寄存器会保留前一时刻的值,所以会多出一些寄存器。
例如
always@(posedge clk)
begin
假如没有default语句的话,当为00或者01 的时候out就会保留前一个时钟的值,也就是hold住,所以rtl图的时候会多出来两个寄存器,专门对应11和10时候的寄存器。
有default语句时
always@(posedge clk)
begin
case(in_s)
2'b11: out<=2'b11;
2'b10: out<=2'b10;
default:out<=2'b00;
endcase
如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。比如:
这是一个基本的Latch。如果IF的条件中用到算术操作,如下面的例子
算术操作作为条件。在一个好的设计中,condition应该是触发器的输出。
如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch,如下面的例子:
有哪些编码会产生latch。我们应该注意哪些情况来避免无谓的latch的出现?