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