A non-blocking assignment (
<=) is used for assignment inside edge-sensitive
always blocks. Within a block, the new values are not visible until the entire block has been processed. For example:
module flip( input clk, input reset ) reg f1; reg f2; always @ (posedge clk) begin if (reset) begin // synchronous reset f1 <= 0; f2 <= 1; end else begin f1 <= f2; f2 <= f1; end end endmodule
Notice the use of non-blocking (
<=) assignments here. Since the first assignment doesn't actually take effect until after the procedural block, the second assignment does what is intended and actually swaps the two variables -- unlike in a blocking assignment (
=) or assignments in other languages;
f1 still has its original value on the right-hand-side of the second assignment in the block.