不可忽視的verilog零延遲 (IC君給您拜年)
這是IC君的第25篇原創文章(同步於公眾號 icstudy )
首先給大家拜個年,IC君祝大家在2018年新年快樂,事事順心!
Verilog HDL 是目前中國IC設計里最流行的硬體描述語言,做這一行的或多或少都會接觸過。
在數字IC設計裡面,我們常用Verilog來做兩類任務,一類是設計:用來描述能實現規範指定的電路功能,這類代碼是可綜合的verilog代碼,最終目的是要綜合成門級netlist,拿去做Layout,產出晶元;
另外就是用來驗證電路的:建立電路模擬平台,用來驗證我們設定的電路是否符合規範要求,比如產生電路激勵信號、列印一些信息供debug等,即我們常說的testbench。
在testbench裡面我們通常會加一些延遲來描述信號發生的先後順序,但可綜合的電路裡面則通常不會加延遲。這些不加延遲的電路,在模擬的時候波形里顯示的輸出信號在輸入信號發生變化時立即隨之變化,沒有任何的延遲。
但實際上所有可綜合代碼都是可以映射成門級電路,是有延遲的。只是在沒有綜合成實際電路之前,我們不知道延遲是多少而已。為了描述沒有定義延遲的電路信號發生先後順序,verilog HDL裡面引入了0延遲的概念,如果寫了#0就稱之為顯性0延遲,如果什麼都沒寫則為隱性0延遲。
如果不了解verilog 0延遲的概念,在看時序電路的波形時,就容易搞不清楚信號的傳輸是否正確。比如下面圖1,信號a_in是用clk 採樣生成的,a_in被clk 採樣後再得到信號b_out,
那麼a_in 由0變為1時,A時刻clk 採到的a_in是0,還是1呢?
b_out正確的輸出波形應該是圖2還是圖3呢?
圖1 時序電路波形( b_out 是clk直接採樣 a_in得到)
圖2 時序電路波形 b_out 波形一
圖3 時序電路波形 b_out 波形二
如果你有了解verilog 0延遲的概念,你就可以把這裡的0想像成一個具體的概念,無限接近0但比0大的數,比如0.1或更小,這樣你很快就可以畫出類似圖4的波形。
圖4 帶有延遲的時序電路波形
因為a_in 是經過clk採樣的,在A時刻a_in 由0變1是發生在clk上升沿的後面,所以在A時刻clk抓到的是a_in的低電平,在B時刻抓到的是a_in的高電平。
0延遲的概念也適用組合電路,不過一般來說,組合電路不太容易被困擾到。
如果你已經了解了verilog 0延遲的概念,下面的testbench例子發生的錯誤也適用0延遲來解釋。你知道如何修正嗎?
以下是testbench:
推薦閱讀: