首页 > 代码库 > verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值和非阻塞赋值

 1 module main(); 2 reg clk=0; 3 reg [11:0] a=0; 4 reg [11:0] b=0; 5 always #50 clk=~clk; 6 always@(clk) 7 begin 8    a=a+4; 9    b<=a/4;10 end11 endmodule

如果把always中的两句顺序倒一下输出结果会改变是为什么?

上面的程序0~50s时,b=1;改成下面情形后b=0;
 1   module main(); 2   reg clk=0; 3   reg [11:0] a=0; 4   reg [11:0] b=0; 5   always #50 clk=~clk; 6   always@(clk) 7   begin 8      b<=a/4; 9      a=a+4;10  end11  endmodule

1) 在赋值时刻开始时,计算非阻塞赋值 RHS 表达式。
2) 在赋值时刻结束时,更新非阻塞赋值 LHS 表达式。

 

在编写时牢记这八个要点可以为绝大多数的Verilog 用户解决在综合后仿真中出现的 90-100% 的冒险竞争问题。

1) 时序电路建模时,用非阻塞赋值。
2) 锁存器电路建模时,用非阻塞赋值。
3) 用 always 块建立组合逻辑模型时,用阻塞赋值。
4) 在同一个 always 块中建立时序和组合逻辑电路时,用非阻塞赋值。
5) 在同一个 always 块中不要既用非阻塞赋值又用阻塞赋值。
6) 不要在一个以上的 always 块中为同一个变量赋值。
7) 用$strobe 系统任务来显示用非阻塞赋值的变量值
8) 在赋值时不要使用 #0 延迟


推荐这篇博客
http://www.cnblogs.com/layup/archive/2013/05/14/3078605.html

 

 

 

verilog 阻塞赋值和非阻塞赋值