Verilog語言中講的阻塞賦值與非阻塞賦值,但從字面意思來看,阻塞就是執行的時候在某個地方卡住了,等這個操做執行完在繼續執行下面的語句,而非阻塞就是無論執行完沒有,我無論執行的結果是什麼,反正我繼續下面的事情。而Verilog中的阻塞賦值與非阻塞賦值正好也是這個意思,經過執行一個例子,就能夠簡單地明白了:
一、阻塞賦值能夠理解爲語句的順序執行,所以語句的執行順序很重要
二、非阻塞賦值能夠理解爲語句的並行執行,因此語句的執行不考慮順序
三、在assign的結構中,必須使用的是阻塞賦值測試
//阻塞
module blocking(clk,a,b,c ); input[3:0] a; output[3:0] b,c; input clk; reg[3:0] b,c; always @(posedge clk) begin b=a; c=b; $display("Blocking: a=%d,b=%d,c=%d",a,b,c); end endmodule
//非阻塞
module non_blocking(clk,a,b,c ); input[3:0] a; output[3:0] b,c; input clk; reg[3:0] b,c; always @(posedge clk) begin b<=a; c<=b; $display("non_Blocking: a=%d,b=%d,c=%d",a,b,c); end endmodule
//測試
module test; wire[3:0] b1,c1,b2,c2; reg[3:0] a; reg clk; initial begin clk=0; forever #50 clk=~clk; end initial begin a=4'h3; $display("__________________"); #100 a=4'h5; $display("__________________"); #100 a=4'hf; $display("__________________"); #100 a=4'ha; $display("__________________"); #100 a=4'h6; $display("__________________"); #100 a=4'h2; $display("__________________"); #100 $display("__________________"); $stop; end blocking blocking(clk,a,b1,c1); non_blocking non_blocking(clk,a,b2,c2); endmodule
結果:spa
仿真波形:code