實際電路中有阻塞賦值和非阻塞賦值?


前言

最近群內同學問到:啥是阻塞,啥是非阻塞。實際電路中有這玩意兒嗎?

個人覺得阻塞非阻塞是仿真電路下的描述,實際電路中是沒有這個描述的。

實際的電路中只有組合邏輯和時序邏輯,不可能存在誰阻塞了誰。只是仿真中需要特別注意。

按照書上的描述:阻塞相當於軟件中的順序執行,非阻塞相當於並發執行。

類比為阻塞就是一個人干活,如果一條語句為一個活,那么先干前面的活再干后面的活。非阻塞就是多個人一起干活,每一條語句都是一個人在干活,則為並發。

流程

以下對幾種情況進行了相應的測試。

(1)時序邏輯使用非阻塞。(業界正確用法)

推斷結果:

 

 

 綜合結果:

 對於上述邏輯,相當於多打了一拍。

(2)時序邏輯使用阻塞。

推斷結果:

 

 

 

綜合結果:

 可以看到,中間邏輯被打平,優化掉了。

 

(3)組合邏輯使用非阻塞。

推斷結果:

綜合結果:

可以看到,推斷的結果可能跟實際上是不一致的,代碼中置了初始值,當然對實際組合電路沒啥卵用,只是仿真中指定固定態而已,只供參考,實際以綜合后結果為准。可以看到就是個或門的LUT。

(4)組合邏輯使用阻塞。(業界正確用法)

推斷結果:

綜合結果:

 

 可以看到,推斷的結果可能跟實際上是不一致的,只供參考,實際以綜合后結果為准。可以看到就是個或門的LUT。

 

結論

所以,根據實際測試結果來看,時序邏輯使用阻塞,會導致中間態被優化。組合邏輯用啥都無所謂。本句話僅表示實際電路,不代表仿真如此。

vivado的推斷闊能是不正確的,以綜合結果為准。

寫代碼遵循業界規則,否則可能給自己埋坑。

寫代碼只需記住:時序邏輯就是數據流。組合邏輯就是物理連線。世界豁然開朗。

寫綜合代碼只需遵循:

(1)組合邏輯用阻塞賦值。

(2)時序邏輯用非阻塞賦值。

(3)不要在一個塊語句中混用阻塞非阻塞。

 

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM