非阻塞(Non_Blocking)賦值方式( 如 b <= a; ), 塊結(jié)束后才完成賦值操作,值并不是立刻就改變的, 這是一種比較常用的賦值方法。(特別在編寫可綜合模塊時)。
阻塞(Blocking)賦值方式( 如 b = a; ), 賦值語句執(zhí)行完后,塊才結(jié)束,值在賦值語句執(zhí)行完后立刻就改變的, 可能會產(chǎn)生意想不到的結(jié)果。
見西安企云基創(chuàng)軟件
一般情況下組合邏輯使用=賦值,時序邏輯使用<=賦值。
舉個例子:初始化m=1,n=2,p=3;分別執(zhí)行以下語句
1、begin
m=n;n=p;p=m;
end
2、begin
m<=n; n<=p; p<=m;
end
結(jié)果分別是:1、m=2,n=3,p=2;(在給p賦值時m=2已經(jīng)生效)
2、m=2,n=3,p=1;(在begin-end過程中,m=2一直無效而是在整體執(zhí)行完后才生效)
這兩種賦值“=”用于阻塞式賦值;“<=”用于非阻塞式賦值中。
阻塞賦值:阻塞賦值語句是在這句之后所有語句執(zhí)行之前執(zhí)行的,即后邊的語句必須在這句執(zhí)行完畢才能執(zhí)行,所以稱為阻塞,實際上就是順序執(zhí)行。
非阻塞賦值:非阻塞賦值就是與后邊相關(guān)語句同時執(zhí)行,即就是并行執(zhí)行。
所以一般時序電路使用非阻塞賦值,assign語句一般使用=阻塞賦值;
組合邏輯電路使用阻塞賦值。
在使用阻塞賦值和非阻塞賦值時的八大原則:
1)時序電路建模時,采用非阻塞賦值;
2)鎖存器電路建模時,采用非阻塞賦值;
3)用always塊建立組合邏輯模型時,采用阻塞賦值;
4)用always塊建立時序和組合邏輯混合電路時,采用非阻塞賦值;
5)不要在同一個always塊中同時使用非阻塞賦值和阻塞賦值;
6)不要在一個以上的always塊中為同一個變量賦值;
7)用$strobe系統(tǒng)任務(wù)來顯示用非阻塞賦值的變量值;
8)在賦值時,不要用#0延遲;
————————————————
版權(quán)聲明:本文為CSDN博主「iPlatForm」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/iplatform/article/details/78874239