阻塞賦值與非阻塞賦值(verilog篇)


阻塞賦值與非阻塞賦值(verilog篇)

2017-09-30 竹海 相約電子ee

相信剛剛接觸verilog的讀者,多少對阻塞賦值和非阻塞賦值仍有一些困惑。筆者在這篇文章,帶領大家深入的理解這兩者的區別。

 

首先筆者給一些實驗及仿真數據。通過修改testbench文件,利用modelsim軟件來觀察兩者的不同。

同樣也可以這樣寫:

 

                                                                                  

輸出波形如下:

稍作改動:

輸入波形如下:

細心的讀者會發現是 " = " 與 " <= "的區別。

1> 當使用 " = " ,記為阻塞賦值。從開始時刻開始,經過2個周期置1,持續4個周期后置0。也就是說在執行一條語句時,其他的語句不能執行。

打個比方,有很多車都要上高架,由於道路堵塞,一次只能通過一輛車,其他車只能等這輛過去后,才能過。

2 > 當使用 " <= " ,記為非阻塞賦值。從開始時刻開始,經過2個周期置1;從開始時刻,經過4個周期后置0。你會發現,經過四個周期后,test信號始終維持低電平,好像最后一句賦值沒發生一樣。

再打個比方,還是很多車准備過高速路口,通常有多個出口。現在有三輛車都過,這三輛車是互不影響的。

實際上也就是延遲三個周期置高電平,可是延遲兩個周期已經置高電平了,可以分析這句一定是同時進行的。

 

通過作者的分析,相信讀者可能加深了對兩者區別的理解。

 

在此筆者推薦用阻塞賦值的方法,書寫testbench腳本初始化模塊,這樣時序較為容易分析。

 

那么以上兩者對電路有那種影響呢?

 

采用非阻塞賦值,部分代碼如下:

 

always @(posedge clk)

begin 

b <= a;

z <= b;

end 

 

其綜合對應的電路如下:

 

采用阻塞賦值,部分代碼及綜合電路如下:

 

 

always @(posedge clk)

begin 

b = a;

z = b;

end 

區別已經很明顯了,具體區別就不再贅述,不過在這里,我想說的是,不要以為加入寄存器變量,一定意味着添加寄存器,這是錯誤的。

 

對於阻塞賦值,b為寄存器變量,可沒有輸出為b的寄存器喲。

 

綜上所述,阻塞賦值和非阻塞賦值各占一片天。always 里面一定是非阻塞賦值,這可不一定喲。

具體問題具體分析,我相信,即使最簡單的語法知識,深入分析之后,也會收獲很多的。

轉載:https://mp.weixin.qq.com/s?__biz=MzI4NTM4NjgyNg==&mid=100000173&idx=1&sn=b6cc881e9e82893b0d8ab22ef2fa7549&chksm=6bedb0885c9a399e334dafd5623a1260950a7ae5f6751fc2206b7d441baa073516b39ca16cfc&mpshare=1&scene=23&srcid=11295jqBMDZ97ciHjoM2uuZP#rd


免責聲明!

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



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