Hi cafukarfoo,
Your example is a combinational with a flip flop at the output.
Actually, your example is a sequential design.
Why?
Because you use clock edge.
When to use blocking (=)?
We use blocking when we want to design PURELY combinational circuit.
Example:
wire [2:0] x;
assign x = a + b;
OR
reg [2:0] x;
always @(a or b) // here I'm not using any clock edge (flops)
begin
x = a + b; // adder circuit (purely combinational)
end
As for non-blocking (<=), we use it for sequential circuit, where the circuit is using clock edge. Flop is a sequential circuit.
Example:
reg [2:0] x;
always @(posedge clock)
begin
x <= a + b; // there will be flip flops at output X
end
For better understanding, try to synthesis all the example given.
Before that my personal opinion, you need to understand both pure combinational circuit and sequential circuit.
Hope it helps.