下面哪种写法会产生latch?为什么?
代码如下:
A.
always @(*)begin
if(d)
a = b;
end
B
always @(*)begin
if(d)
a = b;
else
a = a;
end
C
always @ (b or d)
case(d)
2’b00: a=b>>1;
2’b11: c=b>>1;
default:
begin
a=b;
c=b;
end
endcase
D
always @(b or d)begin
a=b;
c=b;
case(d)
2’b00: a=b>>1;
2’b11: c=b>>1;
endcase
end
E
always@(bor d)begin
case(d) //synopsys full_case
2’b00: a=b>>1;
2’b11: c=b>>1;
endcase
end
代码A:
是一个always语句块构成的组合逻辑,其中缺少else分支。
当d=1'b0时,综合工具会默认保持a的值,即生成锁存器
代码B:
代码B虽然补全了else分支语句。但是,其代码依然有保持功能,即会生成锁存器;也就是说,组合逻辑是否会生成锁存器,其根本原因是该组合逻辑存在保持功能!
代码C:
代码C在always语句块内使用了case语句,并且case语句中含有default分支。但是,我们可以发现:
d=2’b00时,没有说明c的赋值;
d=2’b01时,没有说明a的赋值;
代码D
代码D和代码C的不同是,它在always语句块的开始,对a和c进行了默认赋值;
这就类似于软件里面的初始化,当然只是类似而已,不会生成锁存器;
代码E
使用了//synopsys full_case 选项,该选项:
1、防止综合工具将case语句综合成不必要的优先级电路,增大硬件开销
2、和default语句类似,补全case语句没有列出的情况。
3、但是//synopsys full_case会造成工具之间的移植性问题,改代码依然综合出了锁存器