首页 > 代码库 > verilog同一个reg变量同时发生多个阻塞赋值的情况分析

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 end11 12 always@(b)13 begin14    a<=a+2;15 end16 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 end11 12 always@(b)13 begin14    a<=a+2;15 end16 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 begin10   a<=a+3;11 end12 13 always@(clk)14 begin15    a<=a+2;16 end17 18 endmodule19  

 

 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 begin10    a<=a+2;11 end12 13 always@(clk)14 begin15   a<=a+3;16 end17 18 endmodule

 

但是可以避免的话尽量不要出现同一个变量多处赋值的情况,很容易出错。

verilog同一个reg变量同时发生多个阻塞赋值的情况分析