下面哪種寫法會產生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會造成工具之間的移植性問題,改代碼依然綜合出了鎖存器