码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-29 18:53:38      阅读:497      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   sp   strong   on   div   2014   

 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

看看上面的输出结果是什么?

bubuko.com,布布扣

在看看这段代码:

 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行,输出结果:

bubuko.com,布布扣

原因在于:

  • 如果是同一个时刻对同一个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  

bubuko.com,布布扣

 

 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

bubuko.com,布布扣

 

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

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

标签:style   blog   http   color   sp   strong   on   div   2014   

原文地址:http://www.cnblogs.com/wkl7123/p/4131671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!