作者:李秋鳳,華清遠(yuǎn)見嵌入式學(xué)院講師。
稍微接觸過Verilog HDL的都對阻塞與非阻塞賦值略知一二,也是我們經(jīng)常強(qiáng)調(diào)的重點(diǎn)之一,在課堂上還是有學(xué)員問什么不一樣呢,為什么我用阻塞賦值也能得出正確的結(jié)果呢?
在編寫可綜合代碼的時(shí)候,建議大家不要忘了打開RTL網(wǎng)表查看器看看我們自己綜合出來的電路是不是自己想要的邏輯。
我就阻塞與非阻塞賦值這個(gè)問題詳細(xì)說明一下。
1、連續(xù)賦值
連續(xù)賦值語句的硬件實(shí)現(xiàn)是:從賦值語句(=)右邊提取出的邏輯,用于驅(qū)動(dòng)賦值語句左邊的線網(wǎng)(net)
連續(xù)賦值語句
module continousassignment(a,b,c);
input a,b;
output c;
assign c=a&b;
endmodule
綜合以后,通過網(wǎng)表查看器為上圖的結(jié)果,線網(wǎng)c由賦值語句的右邊的邏輯是組合邏輯a&b簡單驅(qū)動(dòng)
2、過程賦值
過程賦值語句的硬件實(shí)現(xiàn)是,從賦值語句的(=或<=)右邊提取出的邏輯用于驅(qū)動(dòng)賦值語句左邊的變量(必需是reg類型)。必須注意的是雖然過程賦值語句是可以出現(xiàn)在initial語句中(僅用于仿真),也可以出現(xiàn)在“always”塊語句中,但是只有“always”中的過程賦值語句才能被綜合
有兩種類型的過程賦值語句:阻塞賦值語句(Blocking Assignment statement)、非阻塞賦值語句(non-Blocking Assignment statement)
2.1、阻塞賦值語句
阻塞賦值語句可以簡單描述為,在一個(gè)always塊中,語句按照從上到下的順序執(zhí)行
module blockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1=q1+3'b1;
q2=q1;
end
endmodule
綜合后的RTL視圖如上圖所示,每個(gè)時(shí)鐘上升沿觸發(fā)后,變量q2、q1的值是同步的,q2被賦予了q1更新后的值
2.2、非阻塞賦值語句
非阻塞賦值語句簡述為:在一個(gè)always 塊中,語句是并行執(zhí)行的
module nonblockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1<=q1+3'b1;
q2<=q1;
end
endmodule
從綜合結(jié)果的RTL查看器可以看到如上圖所示,每個(gè)時(shí)鐘觸發(fā)后,q2被賦予的q1值時(shí)上個(gè)時(shí)鐘周期生成的值
從上面可以看出,第一條語句綜合出來的結(jié)果是一樣的,阻塞與非阻塞不同在于它們會影響到后面引用該條語句的邏輯
3、阻塞與非阻塞建模建模原則
1)、組合邏輯使用阻塞語句、時(shí)序邏輯使用非阻塞語句;
2)、在同一個(gè)模塊里,同一個(gè)變量不能既有阻塞賦值,又有非阻塞賦值
“本文由華清遠(yuǎn)見http://www.embedu.org/index.htm提供”
來源:華清遠(yuǎn)見1次