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 end 11 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 end 11 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
原文:http://www.cnblogs.com/wkl7123/p/4132250.html