Problem in blocking and non-blocking - verilog
I think it's because you have:

mult_prod = (mult_prod &lt;&lt; shift_val);

Remember mult_prod is a bus, not a variable but a representation of a physical set of wires.  An assignment like this implies that those wires simultaneously have two different states.  Try introducing an intermediate term like mult_prod_temp, like:

// 8x16 multiplier
 **mult_prod_temp** = z2*z1;

// Shifter
 mult_prod = (**mult_prod_temp** &lt;&lt; shift_val);

//output
val = (product + mult_prod);
product &lt;= val;