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