verilog同一個reg變量同時發生多個阻塞賦值的情況分析

 1 module main();
 2 reg [5:0] a=0;
 3 reg [5:0] b=0;
 4 reg clk=0;
 5 
 6 always@(clk)
 7 begin
 8    a<=a+3;
 9     b<=b+1;
10 end
11 
12 always@(b)
13 begin
14    a<=a+2;
15 end
16 
17 always #50 clk=~clk;
18 endmodule

看看上面的輸出結果是什麼?

在看看這段代碼:

 1 module main();
 2 reg clk=0;
 3 reg [5:0] a=0;
 4 reg [5:0] b=0;
 5 
 6 always@(clk)
 7 begin
 8    a<=a+3;
 9     b<=b+1;
10 end
11 
12 always@(b)
13 begin
14    a<=a+2;
15 end
16 
17 always #50 clk=~clk;
18 endmodule

差別只在於2~4行,輸出結果:

原因在於:

  • 如果是同一個時刻對同一個reg型變量觸發的多個阻塞賦值,只會執行最後一個。
  • 除了阻塞賦值語句,其他語句都是順序執行的。

 

如果把上面的 <= 都改成 = 那自然每條觸發都會執行,這個就好理解了。

 

但如果觸發A改變的是同一個信號(那一定同時),那就看誰在位置上的後面了:

 1 `timescale 1ns / 1ps
 2 module main();
 3 reg clk=0;
 4 reg [5:0] a=0;
 5 
 6 always #50 clk=~clk;
 7 
 8 always@(clk)
 9 begin
10   a<=a+3;
11 end
12 
13 always@(clk)
14 begin
15    a<=a+2;
16 end
17 
18 endmodule
19  

 

 1 `timescale 1ns / 1ps
 2 module main();
 3 reg clk=0;
 4 reg [5:0] a=0;
 5 
 6 always #50 clk=~clk;
 7 
 8 always@(clk)
 9 begin
10    a<=a+2;
11 end
12 
13 always@(clk)
14 begin
15   a<=a+3;
16 end
17 
18 endmodule

 

但是可以避免的話儘量不要出現同一個變量多處賦值的情況,很容易出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章