blob: d46ddc02517b176b2afd357f40d7fbbb1ddd97b9 [file] [log] [blame]
// Copyright 2020-2022 F4PGA Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// SPDX-License-Identifier: Apache-2.0
(* 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*/