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...