首页 > 代码库 > 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变量同时发生多个阻塞赋值的情况分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。