阻塞賦值與非阻塞賦值(verilog篇)
相信剛剛接觸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