實例解析Verilog綜合出鎖存器的問題

原文鏈接:https://mp.weixin.qq.com/s/kOgmVAFAoP70LRwmkTlEgw

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章