RTL Studio Open IDE

Wiki Verilog language Blocking vs non-blocking

Blocking vs non-blocking

Why combo uses = and clocked state uses <= .

Assignment kind is a scheduling choice, not a style preference.

flowchart LR
  combo[always_comb] --> blk["blocking ="]
  seq[always_ff] --> nba["nonblocking <="]
Context Use
Combinational (always_comb, assign) blocking =
Sequential flops (always_ff) non-blocking <=

NBA (<=) schedules the update after all RHS in the timestep are read. That is how a shift register a <= b; b <= a swaps instead of collapsing.

Wrong vs right

Wrong — blocking in a clocked block for two flops that talk to each other:

always_ff @(posedge clk) begin
  a = b;
  b = a;   // both become b
end

Right:

always_ff @(posedge clk) begin
  a <= b;
  b <= a;
end

Do not mix = and <= in one process to “get NBA tricks” — that is a sim/synth mismatch factory.

See also