阻塞(=)賦值和非阻塞(
阿新 • • 發佈:2019-02-14
關鍵是組合邏輯中是實時變化的,而時序邏輯中一個cycle才變化一次 比如: always @(a or b) begin c = a + b; end always @(posedge clk) begin if(rst) c <= 0; else c <= a + b; end 在組合邏輯的always block中,a和b的變化都會引起c值的變化; 而時序邏輯中c至少會維持一個clock cycle,也就是說如果a和b的變化導致c變化的時間是在下一個clock的上升沿,而不會讓c立刻改變 -------------------------------------------------------------------------------------------------------------------- 好,說正題 阻塞賦值“=”與非阻塞賦值“<=”的本質區別在於: 非阻塞賦值語句右端表示式計算完後並不立即賦值給左端,而是同時啟動下一條語句繼續執行,可以將其理解為所有的右端表示式RHS1、RHS2等在程序開始時同時計算,計算完後 ,等程序結束時同時分別賦給左端變數LHS1、LHS2等; 而阻塞賦值語句在每個右端表示式計算完後立即賦給左端變數,即賦值語句LHS1=RHS1執行完後LHS1是立即更新的,同時只有LHS1=RHS1執行完後才可執行語句LHS1=RHS2,依次類推。前一條語句的執行結果直接影響到後面語句的執行結果。
2 module blocking_vlg_tst();
3 4 reg clk;
5 reg iD;
6 // wires 7 wire oQA;
8 wire oQB;
9 10 // assign statements (if any) 11 blocking i1 (
12 // port map - connection between master ports and signals/registers 13 .clk(clk),
14 .iD(iD),
15 .oQA(oQA),
16 .oQB(oQB)
17 );
18 initial19 begin20 clk =1'b0;21 iD =1'b0;22 end23 24 always #10 clk = (~clk);
25 26 always27 begin28 #8 iD = (~iD);
29 end30 endmodule31