Latch的產生和避免

2021-09-13 03:45:04 字數 2881 閱讀 4782

designer

fpga

1 人贊同了該文章

在fpga設計或者ic設計中,latch是一種對脈衝電平敏感的儲存單元路徑,可以在特定輸入脈衝作用下改變電平。但由於往往設計為同步設計,latch不可避免的毛刺是不願意看到的;這種毛刺對下一級電路及時序收斂很不利,因而在設計中需要避免。

關於latch的產生,大多說人首先想到的是由於verilog**中在if-else結構中缺少else或case結構中缺少default所導致,因此也往往在設計中要求if-else結構和case結構要寫完整。但完整的if-else結構或case結構就能完全避免latch的產生麼?我們看下列兩段**:

always @(*)

begin

if(enable)

data_out1=ina;

else

data_out2=ina;

end

在vivado中進行synthesis後顯示warning:

同樣,下述**綜合後也會提示有latch生成:

上述**之所以產生latch,個人觀點:待賦值變數在個別分支條件下缺少相應賦值,即**風格的問題。故為避免latch的產生,個人認為應做到如下幾點:

1. if-else 和case-default必須配套,也就是出現if 必須出現else與之配套;有case必須在後面寫乙個default,針對case語句也可以增加綜合指令 //synopsys full_case指令省略default語句。

2.在所有條件下,對訊號都進行賦值,同時單個always模組盡量只對單一變數進行賦值。

最後就sirf 2023年面試題為例進行說明

下面哪種寫法會產生latch?為什麼?

(1)

always @(*)

begin

if(d)

a = b;

end(2)

always @(*)begin

if(d)

a = b;

else

a = a;

end(3)

always @ (b or d)

case(d)

2』b00: a=b>>1;

2』b11: c=b>>1;

default:

begin

a=b;

c=b;

endendcase

(4)always @(b or d)

begin

a = b;

c = b;

case (d)

2』b00: a = b >> 1;

2』b11: c = b >> 1;

endcase

end(5)always@(b or d)

begin

case (d) //synopsys full_case

2』b00: a = b >> 1;

2』b11: c = b >> 1;

endcase

end

**(1)中由於缺少else分支,故而會產生鎖存器

**(2)if-else結構完整但由於為組合邏輯,而組合邏輯要想產生記憶功能,只能綜合成鎖存器

**(3)中由於並未在所有情況下對所有訊號值賦值故會產生latch

**(4)中由於在選擇語句之前給訊號賦乙個初值,故不會產生latch。但該種**風格是按照軟體的思維方式書寫,故而不推薦使用,針對這種**風格,針對時序電路也可以應用,下列兩種**綜合出的電路沒有差別,但不推薦第一種風格

綜合電路圖

**(5)中雖然有 //synopsys full_case但是依舊並未在所有情況下對所有訊號值賦值故會產生latch( //synopsys full_case只能省掉default)。

死鎖的產生和避免

死鎖的產生和避免 死鎖的定義 該組程序 執行緒 的每乙個程序 執行緒 都在等待僅由該組程序 執行緒 的其他程序 執行緒 才能引發的事件,該程序 執行緒 是死鎖的 引入鎖是為了解決多執行緒直接的同步與互斥問題 1 執行緒自己將自己鎖住 同乙個執行緒先後兩次呼叫lock,第二次呼叫時由於鎖已經被占用,該...

避免死鎖的產生

死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。第乙個建議往往是最簡單的 乙個執行緒已獲得乙個鎖時,再別去獲取第二個。如果能堅持這個建議,因...

FPGA學習之latch的產生原因 危害與避免措施

在進行fpga設計的過程中,經常會在編譯程式時發現有一些warning提示生成了一些latch,而且一般fpga的設計規則也不建議有latch生成。那麼,latch究竟是什麼東西呢?如果在fpga設計中不允許latch中現,又如何避免呢?1 鎖存器 觸發器和暫存器的比較 1 鎖存器 鎖存器 latc...