// mult_20x20_carsav.v // // 20 x 20-bit signed pipelined multiplier // with two product outputs that are meant to simulate carry-save format. // They are a valid carry-save format but are not exactly what would // normally appear with a real hardware multiplier. // Inputs and outputs are registered. // // 2006/02/18 Written `timescale 10ps/1ps `celldefine module mult_20x20_carsav ( ina, inb, out_0, out_1, clk ); input [19:0] ina; input [19:0] inb; input clk; output [39:0] out_0; output [39:0] out_1; //----- declarations reg [19:0] r_ina; reg [19:0] r_inb; wire [39:0] c_out_0; wire [39:0] c_out_1; reg [39:0] out_0; reg [39:0] out_1; //----- main // ina = ina[18:0] - (ina[19] << 19); // inb = inb[18:0] - (inb[19] << 19); assign c_out_0 = r_inb[18:0] * (r_ina[18:0] - (r_ina[19] << 19)); assign c_out_1 = -(r_inb[19] << 19) * (r_ina[18:0] - (r_ina[19] << 19)); always @(posedge clk) begin r_ina <= #1 ina; r_inb <= #1 inb; out_0 <= #1 c_out_0; out_1 <= #1 c_out_1; end endmodule // mult_20x20_carsav `endcelldefine