--- Quote Start ---
I don't see overflow problem since it is 18 bits + 18bits => 19 bits
--- Quote End ---
I know that this is a popular misunderstanding of Verilog (and VHDL too) expression length evaluation.
First point, even without understanding the overflow cause in Verilog terms, the waveforms don't allow any doubt about it.
In the below assignment, both input variables are 18 bit and the variable receiving the sum is 19 bit.
mix <= fsin_o +fsin_o_2;
The mistake is in assuming that the assignment LHS would determine the expression length, but it doesn't. It's the maximum bit length of involved input terms, 18 bit in this case. Please refer to the detailed and instructive chapter
5.4 expression bit lengths in IEEE Std 1364.
To avoid overflows, you have to extend one of both input terms before the add operation to 19 bit (with sign extension). Or use the simple trick suggested in the Verilog specification, add an integer 0 which extends the intermediate result to 32 bit.
mix <= fsin_o +fsin_o_2 + 0;