| // Copyright (C) 2020-2021 The SymbiFlow Authors. | |
| // | |
| // Use of this source code is governed by a ISC-style | |
| // license that can be found in the LICENSE file or at | |
| // https://opensource.org/licenses/ISC | |
| // | |
| // SPDX-License-Identifier:ISC | |
| (* blackbox *) | |
| module qlal4s3_mult_32x32_cell ( | |
| input [31:0] Amult, | |
| input [31:0] Bmult, | |
| input [ 1:0] Valid_mult, | |
| output [63:0] Cmult | |
| ); | |
| endmodule /* qlal4s3_32x32_mult_cell */ | |
| (* blackbox *) | |
| module qlal4s3_mult_16x16_cell ( | |
| input [15:0] Amult, | |
| input [15:0] Bmult, | |
| input Valid_mult, | |
| output [31:0] Cmult | |
| ); | |
| endmodule /* qlal4s3_16x16_mult_cell */ | |
| /* Verilog model of QLAL4S3 Multiplier */ | |
| /*qlal4s3_mult_cell*/ | |
| module signed_mult ( | |
| A, | |
| B, | |
| Valid, | |
| C | |
| ); | |
| parameter WIDTH = 32; | |
| parameter CWIDTH = 2 * WIDTH; | |
| input [WIDTH-1:0] A, B; | |
| input Valid; | |
| output [CWIDTH-1:0] C; | |
| reg signed [WIDTH-1:0] A_q, B_q; | |
| wire signed [CWIDTH-1:0] C_int; | |
| assign C_int = A_q * B_q; | |
| assign valid_int = Valid; | |
| assign C = C_int; | |
| always @(*) if (valid_int == 1'b1) A_q <= A; | |
| always @(*) if (valid_int == 1'b1) B_q <= B; | |
| endmodule | |
| module qlal4s3_mult_cell_macro ( | |
| Amult, | |
| Bmult, | |
| Valid_mult, | |
| sel_mul_32x32, | |
| Cmult | |
| ); | |
| input [31:0] Amult; | |
| input [31:0] Bmult; | |
| input [1:0] Valid_mult; | |
| input sel_mul_32x32; | |
| output [63:0] Cmult; | |
| wire [15:0] A_mult_16_0; | |
| wire [15:0] B_mult_16_0; | |
| wire [31:0] C_mult_16_0; | |
| wire [15:0] A_mult_16_1; | |
| wire [15:0] B_mult_16_1; | |
| wire [31:0] C_mult_16_1; | |
| wire [31:0] A_mult_32; | |
| wire [31:0] B_mult_32; | |
| wire [63:0] C_mult_32; | |
| wire Valid_mult_16_0; | |
| wire Valid_mult_16_1; | |
| wire Valid_mult_32; | |
| assign Cmult = sel_mul_32x32 ? C_mult_32 : {C_mult_16_1, C_mult_16_0}; | |
| assign A_mult_16_0 = sel_mul_32x32 ? 16'h0 : Amult[15:0]; | |
| assign B_mult_16_0 = sel_mul_32x32 ? 16'h0 : Bmult[15:0]; | |
| assign A_mult_16_1 = sel_mul_32x32 ? 16'h0 : Amult[31:16]; | |
| assign B_mult_16_1 = sel_mul_32x32 ? 16'h0 : Bmult[31:16]; | |
| assign A_mult_32 = sel_mul_32x32 ? Amult : 32'h0; | |
| assign B_mult_32 = sel_mul_32x32 ? Bmult : 32'h0; | |
| assign Valid_mult_16_0 = sel_mul_32x32 ? 1'b0 : Valid_mult[0]; | |
| assign Valid_mult_16_1 = sel_mul_32x32 ? 1'b0 : Valid_mult[1]; | |
| assign Valid_mult_32 = sel_mul_32x32 ? Valid_mult[0] : 1'b0; | |
| signed_mult #( | |
| .WIDTH(16) | |
| ) u_signed_mult_16_0 ( | |
| .A (A_mult_16_0), //I: 16 bits | |
| .B (B_mult_16_0), //I: 16 bits | |
| .Valid(Valid_mult_16_0), //I | |
| .C (C_mult_16_0) //O: 32 bits | |
| ); | |
| signed_mult #( | |
| .WIDTH(16) | |
| ) u_signed_mult_16_1 ( | |
| .A (A_mult_16_1), //I: 16 bits | |
| .B (B_mult_16_1), //I: 16 bits | |
| .Valid(Valid_mult_16_1), //I | |
| .C (C_mult_16_1) //O: 32 bits | |
| ); | |
| signed_mult #( | |
| .WIDTH(32) | |
| ) u_signed_mult_32 ( | |
| .A (A_mult_32), //I: 32 bits | |
| .B (B_mult_32), //I: 32 bits | |
| .Valid(Valid_mult_32), //I | |
| .C (C_mult_32) //O: 64 bits | |
| ); | |
| endmodule | |
| /*qlal4s3_mult_cell*/ | |