module mult_x #( parameter integer A_width = 8 ,parameter integer C_width = 8 ,parameter integer D_width = 8 ,parameter integer o_width = 31//division ) ( clk, rstn, en, a, c, d, Re, Im ); input rstn; input clk; input en; input signed [A_width-1 :0] a; input signed [C_width-1 :0] c; input signed [D_width-1 :0] d; output signed [o_width-1 :0] Re; output signed [o_width-1 :0] Im; wire signed [A_width+C_width-1:0] ac; wire signed [A_width+D_width-1:0] ad; wire signed [o_width-1 :0] Re_trunc; wire signed [o_width-1 :0] Im_trunc; DW02_mult #(A_width,C_width) inst_c1( .A (a ), .B (c ), .TC (1'b1 ), .PRODUCT (ac ) ); DW02_mult #(A_width,D_width) inst_c3( .A (a ), .B (d ), .TC (1'b1 ), .PRODUCT (ad ) ); trunc #( .diw (A_width+C_width ) ,.msb (A_width+C_width-2 ) ,.lsb (A_width+C_width-o_width-1 ) ) u_round1 (clk, rstn, en, ac, Re_trunc); trunc #( .diw (A_width+D_width ) ,.msb (A_width+D_width-2 ) ,.lsb (A_width+D_width-o_width-1 ) ) u_round2 (clk, rstn, en, ad, Im_trunc); // Since this is complex multiplication, the output bit width needs to be increased by one compared to the input. assign Re = Re_trunc; assign Im = Im_trunc; endmodule