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.