I have this code and I am having a problem in the product output, any ideas? I've tried a lot and it doesn't work.
I think it's because you have:
mult_prod = (mult_prod << 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** << shift_val); //output val = (product + mult_prod); product <= val;