# latch
### latch發生原因:
合成器認為某部分電路需要鎖定在某個特定值中。
1. 非同步電路Latch是一種非理想的狀態,發生在電路未定義完全的情況。
2. Latch只在組合邏輯才會產生,在非同步電路中,Latch可取代暫存器的角色。
3. 當輸入變更時,Latch會保持輸入的狀態,並將其儲存在輸出連接port上,直到輸入發生變化。
3. Latch類似於Flip-flop,但它沒有時脈輸入,因此它的輸出取決於輸入變化的時間。
### 產生latch的寫法:
latch語法: 只寫if不寫else、只寫case不寫defult、輸出自己給輸入賦值。
除了這些外,不是只要寫完整就不會有latch,更重要的在於不要hold值。
### latch的缺點:
以下討論是建立在設計的電路是同步電路,才要避免。
1. 對glitch敏感: 訊號有效時,輸出狀態可能隨輸入多次變化,產生空翻,對下一級電路造成危險。
2. 需要更多logic資源: FPGA本身沒有設計好的latch(注意這是發生在FPGA上)。
3. 不能非同步reset: 上電後會鎖值,只能下電重置,無法使用reset重置,如果鎖了一個錯誤的值會造成極大的危險。
4. 需要額外的delay: 不適合運用在高速電路上。
5. 複雜的STA分析: 沒有經過clock,STA不會分析,每次合成器合成的結果可能也不一樣。
7. 時序問題: Latch不像DFF具有clock,輸出狀態可以在任何時間被改變,這可能導致時序問題。
8. 設計不確定性: Latch是非同步元件,會導致電路輸出的值與輸入值之間存在不一致的情況,從而導致電路輸出的結果無法預測。
### latch的優點:
如果latch和FF兩者都由與NOT gate搭建的話,latch使用的logic source要比DFF少一半,
latch的整合度較DFF高,latch的面積很小,又能省電。
所以在ASIC設計中會用到latch,且只有在CPU高速電路或RAM這種面積很敏感的電路才會使用latch。
### latch的應用:
1. Clock Gating Cell(非常常見):
Integrated Clock Gating(ICG) = latch +AND,詳細部分參看IC design筆記。
2. A Dual-Edge D Flip-Flop(少見):
A Dual-Edge D Flip-Flo = 2 latches + 1 MUX.
A dual-edge flip-flop stores data at both clock transitions.
### 合出latch的解決方式
使用FF取代Latch,以確保電路的可靠性和正確性。
### coding技巧
在coding時:需要在組合邏輯中避免hold的操作。
**<font color="#f00">記住,當組合邏輯需要hold時,就會合成出latch。</font>**
```
always@(*) begin
if(d)a = b;
end
```
應改為
```
always@(*) begin
a=1'b0;
if(d)a = b;
end
```
或
```
always@(*) begin
if(d)a = b;
else a = 1'b0;
end
```
Refence:
1. [Avoiding Unwanted Latches](https://www.doe.carleton.ca/~shams/ELEC3500/Ver2Syn.pdf)