Verilog HDL語言中存在兩種賦值語言: ● 非阻塞型賦值語句 ● 阻塞型賦值語句 1. 非阻塞型語句 以賦值操作符“<=”來標識的賦值操作稱為“非阻塞型過程賦值(NonblockingAssignment)”。非阻塞型過程賦值語句的特點是: (1) 在begin-end串行語句塊中,一條非阻塞過程語句的執(zhí)行不會阻塞下一條語句的執(zhí)行,也就是說在本條非阻塞型過程賦值語句對應(yīng)的賦值操作執(zhí)行完之前,下一條語句也可以開始執(zhí)行。 (2) 仿真過程在遇到非阻塞型過程賦值語句后首先計算其右端賦值表達式的值,然后等到仿真時間步結(jié)束時再將該計算結(jié)果賦值變量。也就是說,這種情況下的賦值操作是在同一仿真時刻上的其他普通操作結(jié)束后才得到執(zhí)行的。 如以下語句的程序1: Initial begin A<=B;//語句S1 B<=A; //語句S2 end 上述語句中包含了兩條非阻塞型過程賦值語句S1和S2,當仿真進程遇到Initial過程塊后(0時刻),語句S1首先開始執(zhí)行,賦值表達式“B”的值得到計算(但是對被賦值變量A的賦值操作要等到當前時間步結(jié)束才執(zhí)行),同時由于S1是一條非阻塞型賦值語句,所以S1的執(zhí)行不會阻塞S2的執(zhí)行;由于S2也隨即開始執(zhí)行,其對應(yīng)的賦值表達式“A”的值得到計算,由于這時S1對A的賦值操作還沒有執(zhí)行,所以此時計算得到的賦值表達式取值是A的初值。由于S2也是一條非阻塞型賦值語句,它對應(yīng)的為變量B進行賦值操作也要等到當前時間步結(jié)束時才會得到執(zhí)行;所以在當前時間步結(jié)束時,S1、S2兩條語句對應(yīng)的賦值操作同時執(zhí)行,分別將計算得到的A和B初值賦給變量B和A,這樣就交換了A與B的取值。 例程1: 仿真圖: 從仿真圖我們可以看出,使用非阻塞型過程賦值語句,把a的初值給b,b的初值給a。所以,從圖可以看出它的結(jié)果和前面分析的一樣。 1. 阻塞型語句 以賦值操作符“=”來標識的賦值操作稱為“阻塞型過程賦值(blocking Assignment)”。非阻塞型過程賦值語句的特點是: (1)串行塊(begin-end)中的各條阻塞型過程賦值語句將以它們在順序塊后排列次序依次得到執(zhí)行。 (2)阻塞型過程賦值語句的執(zhí)行過程是:首先計算右端賦值表達式的值,然后立即將計算結(jié)果賦值給“=”左端的被賦值變量。 阻塞型過程賦值語句的這兩個特點表明:仿真進程在遇到阻塞型過程賦值語句時將計算表達式的值并立即將其結(jié)果賦給等式左邊的被賦值變量;在串行語句塊中,下一條語句的執(zhí)行會被本條阻塞型過程賦值語句所阻塞,只有在當前這條阻塞型過程賦值語句所對應(yīng)的賦值操作執(zhí)行完后下一條語句才能開始執(zhí)行。 例如語句程序2: initial begin a=0;//語句S1 a=1;//語句s2 end 在這段語句中包含兩條阻塞型過程賦值語句S1和S2,它們都是在仿真零時刻得到執(zhí)行的,其對應(yīng)的賦值操作也都是在0時刻進行的。但由于它們是阻塞型賦值語句,所以在執(zhí)行S1語句是S2被阻塞而不能得到執(zhí)行;只有在S1執(zhí)行完,a被賦值0之后,S2才能開始執(zhí)行。而S2的執(zhí)行將使a被重新賦值1,所以上面這個過程塊執(zhí)行后變量a的值終取值為1. 例程2: 仿真圖: 可以看出,只是把賦值方式換成了阻塞型,結(jié)果就和非阻塞型的不同。 |