這幾個概念是不同的
順序塊:順序塊中的語句是按順序執行的,每條語句中的延遲值是與其前一條語句執行的仿真時間有關。
並行塊:並行塊語句是並行執行的,它裏面的每條語句中指定的延遲值都是相對於語句塊開始執行的時候。
因此順序塊和並行塊的區別是,裏面每條語句執行的仿真時間,而非具體的阻塞,非阻塞語句。
阻塞賦值:在一下條語句執行前,這條賦值語句必須已經完成。
非阻塞賦值:當非阻塞性過程賦值語句執行時,計算右側的表達式,而後在預約時刻將右側的值賦給的目標。最快的輸出也要在當前時刻結束前的最後時刻。它計算出右側的值後,並不阻塞,後面的語句正常運行,而真正的賦值發生在當前或者延遲結束的時刻。 不阻塞後面語句執行,在當前或者延遲結束時刻賦值是它的特色。然後面語句內部延遲,它只是說明賦值延遲時刻而已,而不關注賦值的時機。它們是不一樣的概念。input
下面是我寫的例子,使用Synplify_pro綜合:test
module test(
d1,
clk,
q1,
q2
);
input d1,clk;
output q1;
output q2;
reg q1,q2;
always @ (posedge clk)
begin
q1 = d1;
q2 = q1;
end
endmodule
綜合後只有一個DFF。module
module test(
d1,
clk,
q1,
q2
);
input d1,clk;
output q1;
output q2;
reg q1,q2;
always @ (posedge clk)
fork
q1 = d1;
q2 = q1;
join
endmodulesed
綜合後有兩個DFF。並行
module test(
d1,
clk,
q1,
q2
);
input d1,clk;
output q1;
output q2;
reg q1,q2;
always @ (posedge clk)
begin
q1 <= d1;
q2 <= q1;
end
endmodule
綜合後有兩個DFF。時間
module test(
d1,
clk,
q1,
q2
);
input d1,clk;
output q1;
output q2;
reg q1,q2;
always @ (posedge clk)
fork
q1 <= d1;
q2 <= q1;
join
endmodule阻塞
綜合後有兩個DFF。join