blob: ae54ec3912e20d66ab341ab326fa8cdcd48c1d99 [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
`default_nettype none
(* abc9_flop, lib_whitebox *)
module sh_dff(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C
);
initial Q <= 1'b0;
always @(posedge C)
Q <= D;
endmodule
(* abc9_box, lib_blackbox *)
module adder_carry(
output wire sumout,
output wire cout,
input wire p,
input wire g,
input wire cin
);
assign sumout = p ^ cin;
assign cout = p ? cin : g;
endmodule
(* abc9_box, lib_whitebox *)
module adder_lut5(
output wire lut5_out,
(* abc9_carry *)
output wire cout,
input wire [0:4] in,
(* abc9_carry *)
input wire cin
);
parameter [0:15] LUT=0;
parameter IN2_IS_CIN = 0;
wire [0:4] li = (IN2_IS_CIN) ? {in[0], in[1], cin, in[3], in[4]} : {in[0], in[1], in[2], in[3],in[4]};
// Output function
wire [0:15] s1 = li[0] ?
{LUT[0], LUT[2], LUT[4], LUT[6], LUT[8], LUT[10], LUT[12], LUT[14], LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30]}:
{LUT[1], LUT[3], LUT[5], LUT[7], LUT[9], LUT[11], LUT[13], LUT[15], LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31]};
wire [0:7] s2 = li[1] ? {s1[0], s1[2], s1[4], s1[6], s1[8], s1[10], s1[12], s1[14]} :
{s1[1], s1[3], s1[5], s1[7], s1[9], s1[11], s1[13], s1[15]};
wire [0:3] s3 = li[2] ? {s2[0], s2[2], s2[4], s2[6]} : {s2[1], s2[3], s2[5], s2[7]};
wire [0:1] s4 = li[3] ? {s3[0], s3[2]} : {s3[1], s3[3]};
assign lut5_out = li[4] ? s4[0] : s4[1];
// Carry out function
assign cout = (s3[2]) ? cin : s3[3];
endmodule
(* abc9_lut=1, lib_whitebox *)
module frac_lut6(
input wire [0:5] in,
output wire [0:3] lut4_out,
output wire [0:1] lut5_out,
output wire lut6_out
);
parameter [0:63] LUT = 0;
// Effective LUT input
wire [0:5] li = in;
// Output function
wire [0:31] s1 = li[0] ?
{LUT[0] , LUT[2] , LUT[4] , LUT[6] , LUT[8] , LUT[10], LUT[12], LUT[14],
LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30],
LUT[32], LUT[34], LUT[36], LUT[38], LUT[40], LUT[42], LUT[44], LUT[46],
LUT[48], LUT[50], LUT[52], LUT[54], LUT[56], LUT[58], LUT[60], LUT[62]}:
{LUT[1] , LUT[3] , LUT[5] , LUT[7] , LUT[9] , LUT[11], LUT[13], LUT[15],
LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31],
LUT[33], LUT[35], LUT[37], LUT[39], LUT[41], LUT[43], LUT[45], LUT[47],
LUT[49], LUT[51], LUT[53], LUT[55], LUT[57], LUT[59], LUT[61], LUT[63]};
wire [0:15] s2 = li[1] ?
{s1[0] , s1[2] , s1[4] , s1[6] , s1[8] , s1[10], s1[12], s1[14],
s1[16], s1[18], s1[20], s1[22], s1[24], s1[26], s1[28], s1[30]}:
{s1[1] , s1[3] , s1[5] , s1[7] , s1[9] , s1[11], s1[13], s1[15],
s1[17], s1[19], s1[21], s1[23], s1[25], s1[27], s1[29], s1[31]};
wire [0:7] s3 = li[2] ?
{s2[0], s2[2], s2[4], s2[6], s2[8], s2[10], s2[12], s2[14]}:
{s2[1], s2[3], s2[5], s2[7], s2[9], s2[11], s2[13], s2[15]};
wire [0:3] s4 = li[3] ? {s3[0], s3[2], s3[4], s3[6]}:
{s3[1], s3[3], s3[5], s3[7]};
wire [0:1] s5 = li[4] ? {s4[0], s4[2]} : {s4[1], s4[3]};
assign lut4_out[0] = s4[0];
assign lut4_out[1] = s4[1];
assign lut4_out[2] = s4[2];
assign lut4_out[3] = s4[3];
assign lut5_out[0] = s5[0];
assign lut5_out[1] = s5[1];
assign lut6_out = li[5] ? s5[0] : s5[1];
endmodule
(* abc9_flop, lib_whitebox *)
module dff(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C
);
initial Q <= 1'b0;
always @(posedge C)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module dffn(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C
);
initial Q <= 1'b0;
always @(negedge C)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module dffsre(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C,
input wire E,
input wire R,
input wire S
);
initial Q <= 1'b0;
always @(posedge C or negedge S or negedge R)
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module dffnsre(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C,
input wire E,
input wire R,
input wire S
);
initial Q <= 1'b0;
always @(negedge C or negedge S or negedge R)
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module sdffsre(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C,
input wire E,
input wire R,
input wire S
);
initial Q <= 1'b0;
always @(posedge C)
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module sdffnsre(
output reg Q,
input wire D,
(* clkbuf_sink *)
input wire C,
input wire E,
input wire R,
input wire S
);
initial Q <= 1'b0;
always @(negedge C)
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E)
Q <= D;
endmodule
(* abc9_flop, lib_whitebox *)
module latchsre (
output reg Q,
input wire S,
input wire R,
input wire D,
input wire G,
input wire E
);
initial Q <= 1'b0;
always @*
begin
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E && G)
Q <= D;
end
endmodule
(* abc9_flop, lib_whitebox *)
module latchnsre (
output reg Q,
input wire S,
input wire R,
input wire D,
input wire G,
input wire E
);
initial Q <= 1'b0;
always @*
begin
if (!R)
Q <= 1'b0;
else if (!S)
Q <= 1'b1;
else if (E && !G)
Q <= D;
end
endmodule
module TDP_BRAM18 (
(* clkbuf_sink *)
input wire CLOCKA,
(* clkbuf_sink *)
input wire CLOCKB,
input wire READENABLEA,
input wire READENABLEB,
input wire [13:0] ADDRA,
input wire [13:0] ADDRB,
input wire [15:0] WRITEDATAA,
input wire [15:0] WRITEDATAB,
input wire [1:0] WRITEDATAAP,
input wire [1:0] WRITEDATABP,
input wire WRITEENABLEA,
input wire WRITEENABLEB,
input wire [1:0] BYTEENABLEA,
input wire [1:0] BYTEENABLEB,
//input wire [2:0] WRITEDATAWIDTHA,
//input wire [2:0] WRITEDATAWIDTHB,
//input wire [2:0] READDATAWIDTHA,
//input wire [2:0] READDATAWIDTHB,
output wire [15:0] READDATAA,
output wire [15:0] READDATAB,
output wire [1:0] READDATAAP,
output wire [1:0] READDATABP
);
parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter integer READ_WIDTH_A = 0;
parameter integer READ_WIDTH_B = 0;
parameter integer WRITE_WIDTH_A = 0;
parameter integer WRITE_WIDTH_B = 0;
endmodule
module TDP36K (
RESET_ni,
WEN_A1_i,
WEN_B1_i,
REN_A1_i,
REN_B1_i,
CLK_A1_i,
CLK_B1_i,
BE_A1_i,
BE_B1_i,
ADDR_A1_i,
ADDR_B1_i,
WDATA_A1_i,
WDATA_B1_i,
RDATA_A1_o,
RDATA_B1_o,
FLUSH1_i,
WEN_A2_i,
WEN_B2_i,
REN_A2_i,
REN_B2_i,
CLK_A2_i,
CLK_B2_i,
BE_A2_i,
BE_B2_i,
ADDR_A2_i,
ADDR_B2_i,
WDATA_A2_i,
WDATA_B2_i,
RDATA_A2_o,
RDATA_B2_o,
FLUSH2_i
);
parameter [80:0] MODE_BITS = 81'd0;
// First 18K RAMFIFO (41 bits)
localparam [ 0:0] SYNC_FIFO1_i = MODE_BITS[0];
localparam [ 2:0] RMODE_A1_i = MODE_BITS[3 : 1];
localparam [ 2:0] RMODE_B1_i = MODE_BITS[6 : 4];
localparam [ 2:0] WMODE_A1_i = MODE_BITS[9 : 7];
localparam [ 2:0] WMODE_B1_i = MODE_BITS[12:10];
localparam [ 0:0] FMODE1_i = MODE_BITS[13];
localparam [ 0:0] POWERDN1_i = MODE_BITS[14];
localparam [ 0:0] SLEEP1_i = MODE_BITS[15];
localparam [ 0:0] PROTECT1_i = MODE_BITS[16];
localparam [11:0] UPAE1_i = MODE_BITS[28:17];
localparam [11:0] UPAF1_i = MODE_BITS[40:29];
// Second 18K RAMFIFO (39 bits)
localparam [ 0:0] SYNC_FIFO2_i = MODE_BITS[41];
localparam [ 2:0] RMODE_A2_i = MODE_BITS[44:42];
localparam [ 2:0] RMODE_B2_i = MODE_BITS[47:45];
localparam [ 2:0] WMODE_A2_i = MODE_BITS[50:48];
localparam [ 2:0] WMODE_B2_i = MODE_BITS[53:51];
localparam [ 0:0] FMODE2_i = MODE_BITS[54];
localparam [ 0:0] POWERDN2_i = MODE_BITS[55];
localparam [ 0:0] SLEEP2_i = MODE_BITS[56];
localparam [ 0:0] PROTECT2_i = MODE_BITS[57];
localparam [10:0] UPAE2_i = MODE_BITS[68:58];
localparam [10:0] UPAF2_i = MODE_BITS[79:69];
// Split (1 bit)
localparam [ 0:0] SPLIT_i = MODE_BITS[80];
parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
input wire RESET_ni;
input wire WEN_A1_i;
input wire WEN_B1_i;
input wire REN_A1_i;
input wire REN_B1_i;
(* clkbuf_sink *)
input wire CLK_A1_i;
(* clkbuf_sink *)
input wire CLK_B1_i;
input wire [1:0] BE_A1_i;
input wire [1:0] BE_B1_i;
input wire [14:0] ADDR_A1_i;
input wire [14:0] ADDR_B1_i;
input wire [17:0] WDATA_A1_i;
input wire [17:0] WDATA_B1_i;
output reg [17:0] RDATA_A1_o;
output reg [17:0] RDATA_B1_o;
input wire FLUSH1_i;
input wire WEN_A2_i;
input wire WEN_B2_i;
input wire REN_A2_i;
input wire REN_B2_i;
(* clkbuf_sink *)
input wire CLK_A2_i;
(* clkbuf_sink *)
input wire CLK_B2_i;
input wire [1:0] BE_A2_i;
input wire [1:0] BE_B2_i;
input wire [13:0] ADDR_A2_i;
input wire [13:0] ADDR_B2_i;
input wire [17:0] WDATA_A2_i;
input wire [17:0] WDATA_B2_i;
output reg [17:0] RDATA_A2_o;
output reg [17:0] RDATA_B2_o;
input wire FLUSH2_i;
wire EMPTY2;
wire EPO2;
wire EWM2;
wire FULL2;
wire FMO2;
wire FWM2;
wire EMPTY1;
wire EPO1;
wire EWM1;
wire FULL1;
wire FMO1;
wire FWM1;
wire UNDERRUN1;
wire OVERRUN1;
wire UNDERRUN2;
wire OVERRUN2;
wire UNDERRUN3;
wire OVERRUN3;
wire EMPTY3;
wire EPO3;
wire EWM3;
wire FULL3;
wire FMO3;
wire FWM3;
wire ram_fmode1;
wire ram_fmode2;
wire [17:0] ram_rdata_a1;
wire [17:0] ram_rdata_b1;
wire [17:0] ram_rdata_a2;
wire [17:0] ram_rdata_b2;
reg [17:0] ram_wdata_a1;
reg [17:0] ram_wdata_b1;
reg [17:0] ram_wdata_a2;
reg [17:0] ram_wdata_b2;
reg [14:0] laddr_a1;
reg [14:0] laddr_b1;
wire [13:0] ram_addr_a1;
wire [13:0] ram_addr_b1;
wire [13:0] ram_addr_a2;
wire [13:0] ram_addr_b2;
wire smux_clk_a1;
wire smux_clk_b1;
wire smux_clk_a2;
wire smux_clk_b2;
reg [1:0] ram_be_a1;
reg [1:0] ram_be_a2;
reg [1:0] ram_be_b1;
reg [1:0] ram_be_b2;
wire [2:0] ram_rmode_a1;
wire [2:0] ram_wmode_a1;
wire [2:0] ram_rmode_b1;
wire [2:0] ram_wmode_b1;
wire [2:0] ram_rmode_a2;
wire [2:0] ram_wmode_a2;
wire [2:0] ram_rmode_b2;
wire [2:0] ram_wmode_b2;
wire ram_ren_a1;
wire ram_ren_b1;
wire ram_ren_a2;
wire ram_ren_b2;
wire ram_wen_a1;
wire ram_wen_b1;
wire ram_wen_a2;
wire ram_wen_b2;
wire ren_o;
wire [11:0] ff_raddr;
wire [11:0] ff_waddr;
reg [35:0] fifo_rdata;
wire [1:0] fifo_rmode;
wire [1:0] fifo_wmode;
wire [1:0] bwl;
wire [17:0] pl_dout0;
wire [17:0] pl_dout1;
wire sclk_a1;
wire sclk_b1;
wire sclk_a2;
wire sclk_b2;
wire sreset;
wire flush1;
wire flush2;
assign sreset = RESET_ni;
assign flush1 = ~FLUSH1_i;
assign flush2 = ~FLUSH2_i;
assign ram_fmode1 = FMODE1_i & SPLIT_i;
assign ram_fmode2 = FMODE2_i & SPLIT_i;
assign smux_clk_a1 = CLK_A1_i;
assign smux_clk_b1 = (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i);
assign smux_clk_a2 = (SPLIT_i ? CLK_A2_i : CLK_A1_i);
assign smux_clk_b2 = (SPLIT_i ? (FMODE2_i ? (SYNC_FIFO2_i ? CLK_A2_i : CLK_B2_i) : CLK_B2_i) : (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i));
assign sclk_a1 = smux_clk_a1;
assign sclk_a2 = smux_clk_a2;
assign sclk_b1 = smux_clk_b1;
assign sclk_b2 = smux_clk_b2;
assign ram_ren_a1 = (SPLIT_i ? REN_A1_i : (FMODE1_i ? 0 : REN_A1_i));
assign ram_ren_a2 = (SPLIT_i ? REN_A2_i : (FMODE1_i ? 0 : REN_A1_i));
assign ram_ren_b1 = (SPLIT_i ? REN_B1_i : (FMODE1_i ? ren_o : REN_B1_i));
assign ram_ren_b2 = (SPLIT_i ? REN_B2_i : (FMODE1_i ? ren_o : REN_B1_i));
localparam MODE_36 = 3'b011;
assign ram_wen_a1 = (SPLIT_i ? WEN_A1_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ~ADDR_A1_i[4])));
assign ram_wen_a2 = (SPLIT_i ? WEN_A2_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ADDR_A1_i[4])));
assign ram_wen_b1 = (SPLIT_i ? WEN_B1_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ~ADDR_B1_i[4]));
assign ram_wen_b2 = (SPLIT_i ? WEN_B2_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ADDR_B1_i[4]));
assign ram_addr_a1 = (SPLIT_i ? ADDR_A1_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
assign ram_addr_b1 = (SPLIT_i ? ADDR_B1_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
assign ram_addr_a2 = (SPLIT_i ? ADDR_A2_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
assign ram_addr_b2 = (SPLIT_i ? ADDR_B2_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
assign bwl = (SPLIT_i ? ADDR_A1_i[4:3] : (FMODE1_i ? ff_waddr[1:0] : ADDR_A1_i[4:3]));
localparam MODE_18 = 3'b010;
localparam MODE_9 = 3'b001;
always @(*) begin : WDATA_SEL
case (SPLIT_i)
1: begin
ram_wdata_a1 = WDATA_A1_i;
ram_wdata_a2 = WDATA_A2_i;
ram_wdata_b1 = WDATA_B1_i;
ram_wdata_b2 = WDATA_B2_i;
ram_be_a2 = BE_A2_i;
ram_be_b2 = BE_B2_i;
ram_be_a1 = BE_A1_i;
ram_be_b1 = BE_B1_i;
end
0: begin
case (WMODE_A1_i)
MODE_36: begin
ram_wdata_a1 = WDATA_A1_i;
ram_wdata_a2 = WDATA_A2_i;
ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A2_i);
ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
end
MODE_18: begin
ram_wdata_a1 = WDATA_A1_i;
ram_wdata_a2 = WDATA_A1_i;
ram_be_a1 = (FMODE1_i ? (ff_waddr[1] ? 2'b00 : 2'b11) : BE_A1_i);
ram_be_a2 = (FMODE1_i ? (ff_waddr[1] ? 2'b11 : 2'b00) : BE_A1_i);
end
MODE_9: begin
ram_wdata_a1[7:0] = WDATA_A1_i[7:0];
ram_wdata_a1[16] = WDATA_A1_i[16];
ram_wdata_a1[15:8] = WDATA_A1_i[7:0];
ram_wdata_a1[17] = WDATA_A1_i[16];
ram_wdata_a2[7:0] = WDATA_A1_i[7:0];
ram_wdata_a2[16] = WDATA_A1_i[16];
ram_wdata_a2[15:8] = WDATA_A1_i[7:0];
ram_wdata_a2[17] = WDATA_A1_i[16];
case (bwl)
0: {ram_be_a2, ram_be_a1} = 4'b0001;
1: {ram_be_a2, ram_be_a1} = 4'b0010;
2: {ram_be_a2, ram_be_a1} = 4'b0100;
3: {ram_be_a2, ram_be_a1} = 4'b1000;
endcase
end
default: begin
ram_wdata_a1 = WDATA_A1_i;
ram_wdata_a2 = WDATA_A1_i;
ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A1_i);
ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
end
endcase
case (WMODE_B1_i)
MODE_36: begin
ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B2_i);
ram_be_b2 = BE_B2_i;
ram_be_b1 = BE_B1_i;
end
MODE_18: begin
ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
ram_be_b1 = BE_B1_i;
ram_be_b2 = BE_B1_i;
end
MODE_9: begin
ram_wdata_b1[7:0] = WDATA_B1_i[7:0];
ram_wdata_b1[16] = WDATA_B1_i[16];
ram_wdata_b1[15:8] = WDATA_B1_i[7:0];
ram_wdata_b1[17] = WDATA_B1_i[16];
ram_wdata_b2[7:0] = WDATA_B1_i[7:0];
ram_wdata_b2[16] = WDATA_B1_i[16];
ram_wdata_b2[15:8] = WDATA_B1_i[7:0];
ram_wdata_b2[17] = WDATA_B1_i[16];
case (ADDR_B1_i[4:3])
0: {ram_be_b2, ram_be_b1} = 4'b0001;
1: {ram_be_b2, ram_be_b1} = 4'b0010;
2: {ram_be_b2, ram_be_b1} = 4'b0100;
3: {ram_be_b2, ram_be_b1} = 4'b1000;
endcase
end
default: begin
ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
ram_be_b2 = BE_B1_i;
ram_be_b1 = BE_B1_i;
end
endcase
end
endcase
end
assign ram_rmode_a1 = (SPLIT_i ? (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
assign ram_rmode_a2 = (SPLIT_i ? (RMODE_A2_i == MODE_36 ? MODE_18 : RMODE_A2_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
assign ram_wmode_a1 = (SPLIT_i ? (WMODE_A1_i == MODE_36 ? MODE_18 : WMODE_A1_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
assign ram_wmode_a2 = (SPLIT_i ? (WMODE_A2_i == MODE_36 ? MODE_18 : WMODE_A2_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
assign ram_rmode_b1 = (SPLIT_i ? (RMODE_B1_i == MODE_36 ? MODE_18 : RMODE_B1_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
assign ram_rmode_b2 = (SPLIT_i ? (RMODE_B2_i == MODE_36 ? MODE_18 : RMODE_B2_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
assign ram_wmode_b1 = (SPLIT_i ? (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
assign ram_wmode_b2 = (SPLIT_i ? (WMODE_B2_i == MODE_36 ? MODE_18 : WMODE_B2_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
always @(*) begin : FIFO_READ_SEL
case (RMODE_B1_i)
MODE_36: fifo_rdata = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:0], ram_rdata_b1[15:0]};
MODE_18: fifo_rdata = (ff_raddr[1] ? {18'b000000000000000000, ram_rdata_b2} : {18'b000000000000000000, ram_rdata_b1});
MODE_9:
case (ff_raddr[1:0])
0: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]};
1: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[17], 8'b00000000, ram_rdata_b1[15:8]};
2: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]};
3: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[17], 8'b00000000, ram_rdata_b2[15:8]};
endcase
default: fifo_rdata = {ram_rdata_b2, ram_rdata_b1};
endcase
end
localparam MODE_1 = 3'b101;
localparam MODE_2 = 3'b110;
localparam MODE_4 = 3'b100;
always @(*) begin : RDATA_SEL
case (SPLIT_i)
1: begin
RDATA_A1_o = (FMODE1_i ? {10'b0000000000, EMPTY1, EPO1, EWM1, UNDERRUN1, FULL1, FMO1, FWM1, OVERRUN1} : ram_rdata_a1);
RDATA_B1_o = ram_rdata_b1;
RDATA_A2_o = (FMODE2_i ? {10'b0000000000, EMPTY2, EPO2, EWM2, UNDERRUN2, FULL2, FMO2, FWM2, OVERRUN2} : ram_rdata_a2);
RDATA_B2_o = ram_rdata_b2;
end
0: begin
if (FMODE1_i) begin
RDATA_A1_o = {10'b0000000000, EMPTY3, EPO3, EWM3, UNDERRUN3, FULL3, FMO3, FWM3, OVERRUN3};
RDATA_A2_o = 18'b000000000000000000;
end
else
case (RMODE_A1_i)
MODE_36: begin
RDATA_A1_o = {ram_rdata_a1[17:0]};
RDATA_A2_o = {ram_rdata_a2[17:0]};
end
MODE_18: begin
RDATA_A1_o = (laddr_a1[4] ? ram_rdata_a2 : ram_rdata_a1);
RDATA_A2_o = 18'b000000000000000000;
end
MODE_9: begin
RDATA_A1_o = (laddr_a1[4] ? {{2 {ram_rdata_a2[16]}}, {2 {ram_rdata_a2[7:0]}}} : {{2 {ram_rdata_a1[16]}}, {2 {ram_rdata_a1[7:0]}}});
RDATA_A2_o = 18'b000000000000000000;
end
MODE_4: begin
RDATA_A2_o = 18'b000000000000000000;
RDATA_A1_o[17:4] = 14'b00000000000000;
RDATA_A1_o[3:0] = (laddr_a1[4] ? ram_rdata_a2[3:0] : ram_rdata_a1[3:0]);
end
MODE_2: begin
RDATA_A2_o = 18'b000000000000000000;
RDATA_A1_o[17:2] = 16'b0000000000000000;
RDATA_A1_o[1:0] = (laddr_a1[4] ? ram_rdata_a2[1:0] : ram_rdata_a1[1:0]);
end
MODE_1: begin
RDATA_A2_o = 18'b000000000000000000;
RDATA_A1_o[17:1] = 17'b00000000000000000;
RDATA_A1_o[0] = (laddr_a1[4] ? ram_rdata_a2[0] : ram_rdata_a1[0]);
end
default: begin
RDATA_A1_o = {ram_rdata_a2[1:0], ram_rdata_a1[15:0]};
RDATA_A2_o = {ram_rdata_a2[17:16], ram_rdata_a1[17:16], ram_rdata_a2[15:2]};
end
endcase
case (RMODE_B1_i)
MODE_36: begin
RDATA_B1_o = {ram_rdata_b1};
RDATA_B2_o = {ram_rdata_b2};
end
MODE_18: begin
RDATA_B1_o = (FMODE1_i ? fifo_rdata[17:0] : (laddr_b1[4] ? ram_rdata_b2 : ram_rdata_b1));
RDATA_B2_o = 18'b000000000000000000;
end
MODE_9: begin
RDATA_B1_o = (FMODE1_i ? {fifo_rdata[17:0]} : (laddr_b1[4] ? {1'b0, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]} : {1'b0, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]}));
RDATA_B2_o = 18'b000000000000000000;
end
MODE_4: begin
RDATA_B2_o = 18'b000000000000000000;
RDATA_B1_o[17:4] = 14'b00000000000000;
RDATA_B1_o[3:0] = (laddr_b1[4] ? ram_rdata_b2[3:0] : ram_rdata_b1[3:0]);
end
MODE_2: begin
RDATA_B2_o = 18'b000000000000000000;
RDATA_B1_o[17:2] = 16'b0000000000000000;
RDATA_B1_o[1:0] = (laddr_b1[4] ? ram_rdata_b2[1:0] : ram_rdata_b1[1:0]);
end
MODE_1: begin
RDATA_B2_o = 18'b000000000000000000;
RDATA_B1_o[17:1] = 17'b00000000000000000;
RDATA_B1_o[0] = (laddr_b1[4] ? ram_rdata_b2[0] : ram_rdata_b1[0]);
end
default: begin
RDATA_B1_o = ram_rdata_b1;
RDATA_B2_o = ram_rdata_b2;
end
endcase
end
endcase
end
always @(posedge sclk_a1 or negedge sreset)
if (sreset == 0)
laddr_a1 <= 1'sb0;
else
laddr_a1 <= ADDR_A1_i;
always @(posedge sclk_b1 or negedge sreset)
if (sreset == 0)
laddr_b1 <= 1'sb0;
else
laddr_b1 <= ADDR_B1_i;
assign fifo_wmode = ((WMODE_A1_i == MODE_36) ? 2'b00 : ((WMODE_A1_i == MODE_18) ? 2'b01 : ((WMODE_A1_i == MODE_9) ? 2'b10 : 2'b00)));
assign fifo_rmode = ((RMODE_B1_i == MODE_36) ? 2'b00 : ((RMODE_B1_i == MODE_18) ? 2'b01 : ((RMODE_B1_i == MODE_9) ? 2'b10 : 2'b00)));
fifo_ctl #(
.ADDR_WIDTH(12),
.FIFO_WIDTH(3'd4),
.DEPTH(7)
) fifo36_ctl(
.rclk(sclk_b1),
.rst_R_n(flush1),
.wclk(sclk_a1),
.rst_W_n(flush1),
.ren(REN_B1_i),
.wen(ram_wen_a1),
.sync(SYNC_FIFO1_i),
.rmode(fifo_rmode),
.wmode(fifo_wmode),
.ren_o(ren_o),
.fflags({FULL3, FMO3, FWM3, OVERRUN3, EMPTY3, EPO3, EWM3, UNDERRUN3}),
.raddr(ff_raddr),
.waddr(ff_waddr),
.upaf(UPAF1_i),
.upae(UPAE1_i)
);
TDP18K_FIFO #(
.UPAF_i(UPAF1_i[10:0]),
.UPAE_i(UPAE1_i[10:0]),
.SYNC_FIFO_i(SYNC_FIFO1_i),
.POWERDN_i(POWERDN1_i),
.SLEEP_i(SLEEP1_i),
.PROTECT_i(PROTECT1_i)
)u1(
.RMODE_A_i(ram_rmode_a1),
.RMODE_B_i(ram_rmode_b1),
.WMODE_A_i(ram_wmode_a1),
.WMODE_B_i(ram_wmode_b1),
.WEN_A_i(ram_wen_a1),
.WEN_B_i(ram_wen_b1),
.REN_A_i(ram_ren_a1),
.REN_B_i(ram_ren_b1),
.CLK_A_i(sclk_a1),
.CLK_B_i(sclk_b1),
.BE_A_i(ram_be_a1),
.BE_B_i(ram_be_b1),
.ADDR_A_i(ram_addr_a1),
.ADDR_B_i(ram_addr_b1),
.WDATA_A_i(ram_wdata_a1),
.WDATA_B_i(ram_wdata_b1),
.RDATA_A_o(ram_rdata_a1),
.RDATA_B_o(ram_rdata_b1),
.EMPTY_o(EMPTY1),
.EPO_o(EPO1),
.EWM_o(EWM1),
.UNDERRUN_o(UNDERRUN1),
.FULL_o(FULL1),
.FMO_o(FMO1),
.FWM_o(FWM1),
.OVERRUN_o(OVERRUN1),
.FLUSH_ni(flush1),
.FMODE_i(ram_fmode1)
);
TDP18K_FIFO #(
.UPAF_i(UPAF2_i),
.UPAE_i(UPAE2_i),
.SYNC_FIFO_i(SYNC_FIFO2_i),
.POWERDN_i(POWERDN2_i),
.SLEEP_i(SLEEP2_i),
.PROTECT_i(PROTECT2_i)
)u2(
.RMODE_A_i(ram_rmode_a2),
.RMODE_B_i(ram_rmode_b2),
.WMODE_A_i(ram_wmode_a2),
.WMODE_B_i(ram_wmode_b2),
.WEN_A_i(ram_wen_a2),
.WEN_B_i(ram_wen_b2),
.REN_A_i(ram_ren_a2),
.REN_B_i(ram_ren_b2),
.CLK_A_i(sclk_a2),
.CLK_B_i(sclk_b2),
.BE_A_i(ram_be_a2),
.BE_B_i(ram_be_b2),
.ADDR_A_i(ram_addr_a2),
.ADDR_B_i(ram_addr_b2),
.WDATA_A_i(ram_wdata_a2),
.WDATA_B_i(ram_wdata_b2),
.RDATA_A_o(ram_rdata_a2),
.RDATA_B_o(ram_rdata_b2),
.EMPTY_o(EMPTY2),
.EPO_o(EPO2),
.EWM_o(EWM2),
.UNDERRUN_o(UNDERRUN2),
.FULL_o(FULL2),
.FMO_o(FMO2),
.FWM_o(FWM2),
.OVERRUN_o(OVERRUN2),
.FLUSH_ni(flush2),
.FMODE_i(ram_fmode2)
);
endmodule
module BRAM2x18_TDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
parameter CFG_ABITS = 11;
parameter CFG_DBITS = 18;
parameter CFG_ENABLE_B = 4;
parameter CFG_ENABLE_D = 4;
parameter CFG_ENABLE_F = 4;
parameter CFG_ENABLE_H = 4;
parameter CLKPOL2 = 1;
parameter CLKPOL3 = 1;
parameter [18431:0] INIT0 = 18432'bx;
parameter [18431:0] INIT1 = 18432'bx;
localparam MODE_36 = 3'b011; // 36- or 32-bit
localparam MODE_18 = 3'b010; // 18- or 16-bit
localparam MODE_9 = 3'b001; // 9- or 8-bit
localparam MODE_4 = 3'b100; // 4-bit
localparam MODE_2 = 3'b110; // 2-bit
localparam MODE_1 = 3'b101; // 1-bit
input CLK1;
input CLK2;
input CLK3;
input CLK4;
input [CFG_ABITS-1:0] A1ADDR;
output [CFG_DBITS-1:0] A1DATA;
input A1EN;
input [CFG_ABITS-1:0] B1ADDR;
input [CFG_DBITS-1:0] B1DATA;
input [CFG_ENABLE_B-1:0] B1EN;
input [CFG_ABITS-1:0] C1ADDR;
output [CFG_DBITS-1:0] C1DATA;
input C1EN;
input [CFG_ABITS-1:0] D1ADDR;
input [CFG_DBITS-1:0] D1DATA;
input [CFG_ENABLE_D-1:0] D1EN;
input [CFG_ABITS-1:0] E1ADDR;
output [CFG_DBITS-1:0] E1DATA;
input E1EN;
input [CFG_ABITS-1:0] F1ADDR;
input [CFG_DBITS-1:0] F1DATA;
input [CFG_ENABLE_F-1:0] F1EN;
input [CFG_ABITS-1:0] G1ADDR;
output [CFG_DBITS-1:0] G1DATA;
input G1EN;
input [CFG_ABITS-1:0] H1ADDR;
input [CFG_DBITS-1:0] H1DATA;
input [CFG_ENABLE_H-1:0] H1EN;
wire FLUSH1;
wire FLUSH2;
wire SPLIT;
wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] E1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] F1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] G1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] H1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
wire [13:0] E1ADDR_TOTAL = {E1ADDR_CMPL, E1ADDR};
wire [13:0] F1ADDR_TOTAL = {F1ADDR_CMPL, F1ADDR};
wire [13:0] G1ADDR_TOTAL = {G1ADDR_CMPL, G1ADDR};
wire [13:0] H1ADDR_TOTAL = {H1ADDR_CMPL, H1ADDR};
wire [17:CFG_DBITS] A1_RDATA_CMPL;
wire [17:CFG_DBITS] C1_RDATA_CMPL;
wire [17:CFG_DBITS] E1_RDATA_CMPL;
wire [17:CFG_DBITS] G1_RDATA_CMPL;
wire [17:CFG_DBITS] B1_WDATA_CMPL;
wire [17:CFG_DBITS] D1_WDATA_CMPL;
wire [17:CFG_DBITS] F1_WDATA_CMPL;
wire [17:CFG_DBITS] H1_WDATA_CMPL;
wire [13:0] PORT_A1_ADDR;
wire [13:0] PORT_A2_ADDR;
wire [13:0] PORT_B1_ADDR;
wire [13:0] PORT_B2_ADDR;
case (CFG_DBITS)
1: begin
assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
};
end
2: begin
assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
};
end
4: begin
assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
};
end
8, 9: begin
assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
};
end
16, 18: begin
assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
};
end
default: begin
assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
};
end
endcase
assign FLUSH1 = 1'b0;
assign FLUSH2 = 1'b0;
wire [17:0] PORT_A1_RDATA = {A1_RDATA_CMPL, A1DATA};
wire [17:0] PORT_B1_RDATA = {C1_RDATA_CMPL, C1DATA};
wire [17:0] PORT_A2_RDATA = {E1_RDATA_CMPL, E1DATA};
wire [17:0] PORT_B2_RDATA = {G1_RDATA_CMPL, G1DATA};
wire [17:0] PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
wire [17:0] PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
wire [17:0] PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
wire [17:0] PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
wire PORT_A1_CLK = CLK1;
wire PORT_A2_CLK = CLK3;
wire PORT_B1_CLK = CLK2;
wire PORT_B2_CLK = CLK4;
wire PORT_A1_REN = A1EN;
wire PORT_A1_WEN = B1EN[0];
wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
wire PORT_A2_REN = E1EN;
wire PORT_A2_WEN = F1EN[0];
wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
wire PORT_B1_REN = C1EN;
wire PORT_B1_WEN = D1EN[0];
wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
wire PORT_B2_REN = G1EN;
wire PORT_B2_WEN = H1EN[0];
wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
TDP36K bram_2x18k (
.WDATA_A1_i(PORT_A1_WDATA),
.RDATA_A1_o(PORT_A1_RDATA),
.ADDR_A1_i(PORT_A1_ADDR),
.CLK_A1_i(PORT_A1_CLK),
.REN_A1_i(PORT_A1_REN),
.WEN_A1_i(PORT_A1_WEN),
.BE_A1_i(PORT_A1_BE),
.WDATA_A2_i(PORT_A2_WDATA),
.RDATA_A2_o(PORT_A2_RDATA),
.ADDR_A2_i(PORT_A2_ADDR),
.CLK_A2_i(PORT_A2_CLK),
.REN_A2_i(PORT_A2_REN),
.WEN_A2_i(PORT_A2_WEN),
.BE_A2_i(PORT_A2_BE),
.WDATA_B1_i(PORT_B1_WDATA),
.RDATA_B1_o(PORT_B1_RDATA),
.ADDR_B1_i(PORT_B1_ADDR),
.CLK_B1_i(PORT_B1_CLK),
.REN_B1_i(PORT_B1_REN),
.WEN_B1_i(PORT_B1_WEN),
.BE_B1_i(PORT_B1_BE),
.WDATA_B2_i(PORT_B2_WDATA),
.RDATA_B2_o(PORT_B2_RDATA),
.ADDR_B2_i(PORT_B2_ADDR),
.CLK_B2_i(PORT_B2_CLK),
.REN_B2_i(PORT_B2_REN),
.WEN_B2_i(PORT_B2_WEN),
.BE_B2_i(PORT_B2_BE),
.FLUSH1_i(FLUSH1),
.FLUSH2_i(FLUSH2)
);
endmodule
module BRAM2x18_SDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, D1ADDR, D1DATA, D1EN);
parameter CFG_ABITS = 11;
parameter CFG_DBITS = 18;
parameter CFG_ENABLE_B = 4;
parameter CFG_ENABLE_D = 4;
parameter CLKPOL2 = 1;
parameter CLKPOL3 = 1;
parameter [18431:0] INIT0 = 18432'bx;
parameter [18431:0] INIT1 = 18432'bx;
localparam MODE_36 = 3'b011; // 36- or 32-bit
localparam MODE_18 = 3'b010; // 18- or 16-bit
localparam MODE_9 = 3'b001; // 9- or 8-bit
localparam MODE_4 = 3'b100; // 4-bit
localparam MODE_2 = 3'b110; // 2-bit
localparam MODE_1 = 3'b101; // 1-bit
input CLK1;
input CLK2;
input [CFG_ABITS-1:0] A1ADDR;
output [CFG_DBITS-1:0] A1DATA;
input A1EN;
input [CFG_ABITS-1:0] B1ADDR;
input [CFG_DBITS-1:0] B1DATA;
input [CFG_ENABLE_B-1:0] B1EN;
input [CFG_ABITS-1:0] C1ADDR;
output [CFG_DBITS-1:0] C1DATA;
input C1EN;
input [CFG_ABITS-1:0] D1ADDR;
input [CFG_DBITS-1:0] D1DATA;
input [CFG_ENABLE_D-1:0] D1EN;
wire FLUSH1;
wire FLUSH2;
wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
wire [17:CFG_DBITS] A1_RDATA_CMPL;
wire [17:CFG_DBITS] C1_RDATA_CMPL;
wire [17:CFG_DBITS] B1_WDATA_CMPL;
wire [17:CFG_DBITS] D1_WDATA_CMPL;
wire [13:0] PORT_A1_ADDR;
wire [13:0] PORT_A2_ADDR;
wire [13:0] PORT_B1_ADDR;
wire [13:0] PORT_B2_ADDR;
case (CFG_DBITS)
1: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL;
assign PORT_B1_ADDR = B1ADDR_TOTAL;
assign PORT_A2_ADDR = C1ADDR_TOTAL;
assign PORT_B2_ADDR = D1ADDR_TOTAL;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
};
end
2: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL << 1;
assign PORT_B1_ADDR = B1ADDR_TOTAL << 1;
assign PORT_A2_ADDR = C1ADDR_TOTAL << 1;
assign PORT_B2_ADDR = D1ADDR_TOTAL << 1;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
};
end
4: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL << 2;
assign PORT_B1_ADDR = B1ADDR_TOTAL << 2;
assign PORT_A2_ADDR = C1ADDR_TOTAL << 2;
assign PORT_B2_ADDR = D1ADDR_TOTAL << 2;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
};
end
8, 9: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL << 3;
assign PORT_B1_ADDR = B1ADDR_TOTAL << 3;
assign PORT_A2_ADDR = C1ADDR_TOTAL << 3;
assign PORT_B2_ADDR = D1ADDR_TOTAL << 3;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
};
end
16, 18: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL << 4;
assign PORT_B1_ADDR = B1ADDR_TOTAL << 4;
assign PORT_A2_ADDR = C1ADDR_TOTAL << 4;
assign PORT_B2_ADDR = D1ADDR_TOTAL << 4;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
};
end
default: begin
assign PORT_A1_ADDR = A1ADDR_TOTAL;
assign PORT_B1_ADDR = B1ADDR_TOTAL;
assign PORT_A2_ADDR = D1ADDR_TOTAL;
assign PORT_B2_ADDR = C1ADDR_TOTAL;
defparam bram_2x18k.MODE_BITS = { 1'b1,
11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
};
end
endcase
assign FLUSH1 = 1'b0;
assign FLUSH2 = 1'b0;
wire [17:0] PORT_A1_RDATA;
wire [17:0] PORT_B1_RDATA;
wire [17:0] PORT_A2_RDATA;
wire [17:0] PORT_B2_RDATA;
wire [17:0] PORT_A1_WDATA;
wire [17:0] PORT_B1_WDATA;
wire [17:0] PORT_A2_WDATA;
wire [17:0] PORT_B2_WDATA;
// Assign read/write data - handle special case for 9bit mode
// parity bit for 9bit mode is placed in R/W port on bit #16
case (CFG_DBITS)
9: begin
assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
assign C1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
assign PORT_A1_WDATA = {18{1'b0}};
assign PORT_B1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
assign PORT_A2_WDATA = {18{1'b0}};
assign PORT_B2_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
end
default: begin
assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
assign C1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
assign PORT_A1_WDATA = {18{1'b1}};
assign PORT_B1_WDATA = {B1_WDATA_CMPL, B1DATA};
assign PORT_A2_WDATA = {18{1'b1}};
assign PORT_B2_WDATA = {D1_WDATA_CMPL, D1DATA};
end
endcase
wire PORT_A1_CLK = CLK1;
wire PORT_A2_CLK = CLK2;
wire PORT_B1_CLK = CLK1;
wire PORT_B2_CLK = CLK2;
wire PORT_A1_REN = A1EN;
wire PORT_A1_WEN = 1'b0;
wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {PORT_A1_WEN,PORT_A1_WEN};
wire PORT_A2_REN = C1EN;
wire PORT_A2_WEN = 1'b0;
wire [CFG_ENABLE_D-1:0] PORT_A2_BE = {PORT_A2_WEN,PORT_A2_WEN};
wire PORT_B1_REN = 1'b0;
wire PORT_B1_WEN = B1EN[0];
wire [CFG_ENABLE_B-1:0] PORT_B1_BE = {B1EN[1],B1EN[0]};
wire PORT_B2_REN = 1'b0;
wire PORT_B2_WEN = D1EN[0];
wire [CFG_ENABLE_D-1:0] PORT_B2_BE = {D1EN[1],D1EN[0]};
TDP36K bram_2x18k (
.WDATA_A1_i(PORT_A1_WDATA),
.RDATA_A1_o(PORT_A1_RDATA),
.ADDR_A1_i(PORT_A1_ADDR),
.CLK_A1_i(PORT_A1_CLK),
.REN_A1_i(PORT_A1_REN),
.WEN_A1_i(PORT_A1_WEN),
.BE_A1_i(PORT_A1_BE),
.WDATA_A2_i(PORT_A2_WDATA),
.RDATA_A2_o(PORT_A2_RDATA),
.ADDR_A2_i(PORT_A2_ADDR),
.CLK_A2_i(PORT_A2_CLK),
.REN_A2_i(PORT_A2_REN),
.WEN_A2_i(PORT_A2_WEN),
.BE_A2_i(PORT_A2_BE),
.WDATA_B1_i(PORT_B1_WDATA),
.RDATA_B1_o(PORT_B1_RDATA),
.ADDR_B1_i(PORT_B1_ADDR),
.CLK_B1_i(PORT_B1_CLK),
.REN_B1_i(PORT_B1_REN),
.WEN_B1_i(PORT_B1_WEN),
.BE_B1_i(PORT_B1_BE),
.WDATA_B2_i(PORT_B2_WDATA),
.RDATA_B2_o(PORT_B2_RDATA),
.ADDR_B2_i(PORT_B2_ADDR),
.CLK_B2_i(PORT_B2_CLK),
.REN_B2_i(PORT_B2_REN),
.WEN_B2_i(PORT_B2_WEN),
.BE_B2_i(PORT_B2_BE),
.FLUSH1_i(FLUSH1),
.FLUSH2_i(FLUSH2)
);
endmodule
(* blackbox *)
module QL_DSP1 (
input wire [19:0] a,
input wire [17:0] b,
(* clkbuf_sink *)
input wire clk0,
(* clkbuf_sink *)
input wire clk1,
input wire [ 1:0] feedback0,
input wire [ 1:0] feedback1,
input wire load_acc0,
input wire load_acc1,
input wire reset0,
input wire reset1,
output reg [37:0] z
);
parameter MODE_BITS = 27'b00000000000000000000000000;
endmodule /* QL_DSP1 */
module QL_DSP2 ( // TODO: Name subject to change
input wire [19:0] a,
input wire [17:0] b,
input wire [ 5:0] acc_fir,
output wire [37:0] z,
output wire [17:0] dly_b,
(* clkbuf_sink *)
input wire clk,
input wire reset,
input wire [2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [2:0] output_select,
input wire saturate_enable,
input wire [5:0] shift_right,
input wire round,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
localparam NBITS_ACC = 64;
localparam NBITS_A = 20;
localparam NBITS_B = 18;
localparam NBITS_Z = 38;
wire [NBITS_Z-1:0] dsp_full_z;
wire [(NBITS_Z/2)-1:0] dsp_frac0_z;
wire [(NBITS_Z/2)-1:0] dsp_frac1_z;
wire [NBITS_B-1:0] dsp_full_dly_b;
wire [(NBITS_B/2)-1:0] dsp_frac0_dly_b;
wire [(NBITS_B/2)-1:0] dsp_frac1_dly_b;
assign z = f_mode ? {dsp_frac1_z, dsp_frac0_z} : dsp_full_z;
assign dly_b = f_mode ? {dsp_frac1_dly_b, dsp_frac0_dly_b} : dsp_full_dly_b;
// Output used when fmode == 1
dsp_t1_sim #(
.NBITS_A(NBITS_A/2),
.NBITS_B(NBITS_B/2),
.NBITS_ACC(NBITS_ACC/2),
.NBITS_Z(NBITS_Z/2)
) dsp_frac0 (
.a_i(a[(NBITS_A/2)-1:0]),
.b_i(b[(NBITS_B/2)-1:0]),
.z_o(dsp_frac0_z),
.dly_b_o(dsp_frac0_dly_b),
.acc_fir_i(acc_fir),
.feedback_i(feedback),
.load_acc_i(load_acc),
.unsigned_a_i(unsigned_a),
.unsigned_b_i(unsigned_b),
.clock_i(clk),
.s_reset(reset),
.saturate_enable_i(saturate_enable),
.output_select_i(output_select),
.round_i(round),
.shift_right_i(shift_right),
.subtract_i(subtract),
.register_inputs_i(register_inputs),
.coef_0_i(COEFF_0[(NBITS_A/2)-1:0]),
.coef_1_i(COEFF_1[(NBITS_A/2)-1:0]),
.coef_2_i(COEFF_2[(NBITS_A/2)-1:0]),
.coef_3_i(COEFF_3[(NBITS_A/2)-1:0])
);
// Output used when fmode == 1
dsp_t1_sim #(
.NBITS_A(NBITS_A/2),
.NBITS_B(NBITS_B/2),
.NBITS_ACC(NBITS_ACC/2),
.NBITS_Z(NBITS_Z/2)
) dsp_frac1 (
.a_i(a[NBITS_A-1:NBITS_A/2]),
.b_i(b[NBITS_B-1:NBITS_B/2]),
.z_o(dsp_frac1_z),
.dly_b_o(dsp_frac1_dly_b),
.acc_fir_i(acc_fir),
.feedback_i(feedback),
.load_acc_i(load_acc),
.unsigned_a_i(unsigned_a),
.unsigned_b_i(unsigned_b),
.clock_i(clk),
.s_reset(reset),
.saturate_enable_i(saturate_enable),
.output_select_i(output_select),
.round_i(round),
.shift_right_i(shift_right),
.subtract_i(subtract),
.register_inputs_i(register_inputs),
.coef_0_i(COEFF_0[NBITS_A-1:NBITS_A/2]),
.coef_1_i(COEFF_1[NBITS_A-1:NBITS_A/2]),
.coef_2_i(COEFF_2[NBITS_A-1:NBITS_A/2]),
.coef_3_i(COEFF_3[NBITS_A-1:NBITS_A/2])
);
// Output used when fmode == 0
dsp_t1_sim #(
.NBITS_A(NBITS_A),
.NBITS_B(NBITS_B),
.NBITS_ACC(NBITS_ACC),
.NBITS_Z(NBITS_Z)
) dsp_full (
.a_i(a),
.b_i(b),
.z_o(dsp_full_z),
.dly_b_o(dsp_full_dly_b),
.acc_fir_i(acc_fir),
.feedback_i(feedback),
.load_acc_i(load_acc),
.unsigned_a_i(unsigned_a),
.unsigned_b_i(unsigned_b),
.clock_i(clk),
.s_reset(reset),
.saturate_enable_i(saturate_enable),
.output_select_i(output_select),
.round_i(round),
.shift_right_i(shift_right),
.subtract_i(subtract),
.register_inputs_i(register_inputs),
.coef_0_i(COEFF_0),
.coef_1_i(COEFF_1),
.coef_2_i(COEFF_2),
.coef_3_i(COEFF_3)
);
endmodule
module QL_DSP2_MULT ( // TODO: Name subject to change
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
// Port not available in architecture file
input wire reset,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [2:0] output_select,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.reset(reset),
.f_mode(f_mode),
.feedback(3'b0),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.output_select(3'b0), // unregistered output: a * b (0)
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULT_REGIN ( // TODO: Name subject to change
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [2:0] output_select,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(3'b0),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(3'b0), // unregistered output: a * b (0)
.register_inputs(1'b1) // registered inputs
);
endmodule
module QL_DSP2_MULT_REGOUT ( // TODO: Name subject to change
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [2:0] output_select,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(3'b0),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(3'b100), // registered output: a * b (4)
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULT_REGIN_REGOUT ( // TODO: Name subject to change
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [2:0] output_select,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(3'b0),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(3'b100), // registered output: a * b (4)
.register_inputs(1'b1) // registered inputs
);
endmodule
module QL_DSP2_MULTADD (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
// begin: Ports not available in architecture file
(* clkbuf_sink *)
input wire clk,
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
// end: Ports not available in architecture file
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(output_select), // unregistered output: ACCin (2, 3)
.subtract(subtract),
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULTADD_REGIN (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(output_select), // unregistered output: ACCin (2, 3)
.subtract(subtract),
.register_inputs(1'b1) // registered inputs
);
endmodule
module QL_DSP2_MULTADD_REGOUT (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(output_select), // registered output: ACCin (6, 7)
.subtract(subtract),
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULTADD_REGIN_REGOUT (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(output_select), // registered output: ACCin (6, 7)
.subtract(subtract),
.register_inputs(1'b1) // registered inputs
);
endmodule
module QL_DSP2_MULTACC (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// begin: Ports not available in architecture file
input wire reset,
input wire load_acc,
// end: Ports not available in architecture file
input wire [ 2:0] feedback,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(1'b1), // unregistered output: ACCout (1)
.subtract(subtract),
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULTACC_REGIN (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(1'b1), // unregistered output: ACCout (1)
.subtract(subtract),
.register_inputs(1'b1) // registered inputs
);
endmodule
module QL_DSP2_MULTACC_REGOUT (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(3'b101), // registered output: ACCout (5)
.subtract(subtract),
.register_inputs(1'b0) // unregistered inputs
);
endmodule
module QL_DSP2_MULTACC_REGIN_REGOUT (
input wire [19:0] a,
input wire [17:0] b,
output wire [37:0] z,
(* clkbuf_sink *)
input wire clk,
// Port not available in architecture file
input wire reset,
input wire [ 2:0] feedback,
input wire load_acc,
input wire unsigned_a,
input wire unsigned_b,
input wire f_mode,
input wire [ 2:0] output_select,
input wire subtract,
input wire register_inputs
);
parameter [79:0] MODE_BITS = 80'd0;
localparam [19:0] COEFF_0 = MODE_BITS[19:0];
localparam [19:0] COEFF_1 = MODE_BITS[39:20];
localparam [19:0] COEFF_2 = MODE_BITS[59:40];
localparam [19:0] COEFF_3 = MODE_BITS[79:60];
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a),
.b(b),
.z(z),
.f_mode(f_mode),
.feedback(feedback),
.load_acc(load_acc),
.unsigned_a(unsigned_a),
.unsigned_b(unsigned_b),
.clk(clk),
.reset(reset),
.output_select(3'b101), // registered output: ACCout (5)
.subtract(subtract),
.register_inputs(1'b1) // registered inputs
);
endmodule
module dsp_t1_sim # (
parameter NBITS_ACC = 64,
parameter NBITS_A = 20,
parameter NBITS_B = 18,
parameter NBITS_Z = 38
)(
input wire [NBITS_A-1:0] a_i,
input wire [NBITS_B-1:0] b_i,
output wire [NBITS_Z-1:0] z_o,
output reg [NBITS_B-1:0] dly_b_o,
input wire [5:0] acc_fir_i,
input wire [2:0] feedback_i,
input wire load_acc_i,
input wire unsigned_a_i,
input wire unsigned_b_i,
input wire clock_i,
input wire s_reset,
input wire saturate_enable_i,
input wire [2:0] output_select_i,
input wire round_i,
input wire [5:0] shift_right_i,
input wire subtract_i,
input wire register_inputs_i,
input wire [NBITS_A-1:0] coef_0_i,
input wire [NBITS_A-1:0] coef_1_i,
input wire [NBITS_A-1:0] coef_2_i,
input wire [NBITS_A-1:0] coef_3_i
);
// FIXME: The version of Icarus Verilog from Conda seems not to recognize the
// $error macro. Disable this sanity check for now because of that.
`ifndef __ICARUS__
if (NBITS_ACC < NBITS_A + NBITS_B)
$error("NBITS_ACC must be > NBITS_A + NBITS_B");
`endif
// Input registers
reg [NBITS_A-1:0] r_a;
reg [NBITS_B-1:0] r_b;
reg [5:0] r_acc_fir;
reg r_unsigned_a;
reg r_unsigned_b;
reg r_load_acc;
reg [2:0] r_feedback;
reg [5:0] r_shift_d1;
reg [5:0] r_shift_d2;
reg r_subtract;
reg r_sat;
reg r_rnd;
reg [NBITS_ACC-1:0] acc;
initial begin
r_a <= 0;
r_b <= 0;
r_acc_fir <= 0;
r_unsigned_a <= 0;
r_unsigned_b <= 0;
r_feedback <= 0;
r_shift_d1 <= 0;
r_shift_d2 <= 0;
r_subtract <= 0;
r_load_acc <= 0;
r_sat <= 0;
r_rnd <= 0;
end
always @(posedge clock_i or posedge s_reset) begin
if (s_reset) begin
r_a <= 'h0;
r_b <= 'h0;
r_acc_fir <= 0;
r_unsigned_a <= 0;
r_unsigned_b <= 0;
r_feedback <= 0;
r_shift_d1 <= 0;
r_shift_d2 <= 0;
r_subtract <= 0;
r_load_acc <= 0;
r_sat <= 0;
r_rnd <= 0;
end else begin
r_a <= a_i;
r_b <= b_i;
r_acc_fir <= acc_fir_i;
r_unsigned_a <= unsigned_a_i;
r_unsigned_b <= unsigned_b_i;
r_feedback <= feedback_i;
r_shift_d1 <= shift_right_i;
r_shift_d2 <= r_shift_d1;
r_subtract <= subtract_i;
r_load_acc <= load_acc_i;
r_sat <= r_sat;
r_rnd <= r_rnd;
end
end
// Registered / non-registered input path select
wire [NBITS_A-1:0] a = register_inputs_i ? r_a : a_i;
wire [NBITS_B-1:0] b = register_inputs_i ? r_b : b_i;
wire [5:0] acc_fir = register_inputs_i ? r_acc_fir : acc_fir_i;
wire unsigned_a = register_inputs_i ? r_unsigned_a : unsigned_a_i;
wire unsigned_b = register_inputs_i ? r_unsigned_b : unsigned_b_i;
wire [2:0] feedback = register_inputs_i ? r_feedback : feedback_i;
wire load_acc = register_inputs_i ? r_load_acc : load_acc_i;
wire subtract = register_inputs_i ? r_subtract : subtract_i;
wire sat = register_inputs_i ? r_sat : saturate_enable_i;
wire rnd = register_inputs_i ? r_rnd : round_i;
// Shift right control
wire [5:0] shift_d1 = register_inputs_i ? r_shift_d1 : shift_right_i;
wire [5:0] shift_d2 = output_select_i[1] ? shift_d1 : r_shift_d2;
// Multiplier
wire unsigned_mode = unsigned_a & unsigned_b;
wire [NBITS_A-1:0] mult_a;
assign mult_a = (feedback == 3'h0) ? a :
(feedback == 3'h1) ? a :
(feedback == 3'h2) ? a :
(feedback == 3'h3) ? acc[NBITS_A-1:0] :
(feedback == 3'h4) ? coef_0_i :
(feedback == 3'h5) ? coef_1_i :
(feedback == 3'h6) ? coef_2_i :
coef_3_i; // if feedback == 3'h7
wire [NBITS_B-1:0] mult_b = (feedback == 2'h2) ? {NBITS_B{1'b0}} : b;
wire [NBITS_A-1:0] mult_sgn_a = mult_a[NBITS_A-1];
wire [NBITS_A-1:0] mult_mag_a = (mult_sgn_a && !unsigned_a) ? (~mult_a + 1) : mult_a;
wire [NBITS_B-1:0] mult_sgn_b = mult_b[NBITS_B-1];
wire [NBITS_B-1:0] mult_mag_b = (mult_sgn_b && !unsigned_b) ? (~mult_b + 1) : mult_b;
wire [NBITS_A+NBITS_B-1:0] mult_mag = mult_mag_a * mult_mag_b;
wire mult_sgn = (mult_sgn_a && !unsigned_a) ^ (mult_sgn_b && !unsigned_b);
wire [NBITS_A+NBITS_B-1:0] mult = (unsigned_a && unsigned_b) ?
(mult_a * mult_b) : (mult_sgn ? (~mult_mag + 1) : mult_mag);
// Sign extension
wire [NBITS_ACC-1:0] mult_xtnd = unsigned_mode ?
{{(NBITS_ACC-NBITS_A-NBITS_B){1'b0}}, mult[NBITS_A+NBITS_B-1:0]} :
{{(NBITS_ACC-NBITS_A-NBITS_B){mult[NBITS_A+NBITS_B-1]}}, mult[NBITS_A+NBITS_B-1:0]};
// Adder
wire [NBITS_ACC-1:0] acc_fir_int = unsigned_a ? {{(NBITS_ACC-NBITS_A){1'b0}}, a} :
{{(NBITS_ACC-NBITS_A){a[NBITS_A-1]}}, a} ;
wire [NBITS_ACC-1:0] add_a = (subtract) ? (~mult_xtnd + 1) : mult_xtnd;
wire [NBITS_ACC-1:0] add_b = (feedback_i == 3'h0) ? acc :
(feedback_i == 3'h1) ? {{NBITS_ACC}{1'b0}} : (acc_fir_int << acc_fir);
wire [NBITS_ACC-1:0] add_o = add_a + add_b;
// Accumulator
initial acc <= 0;
always @(posedge clock_i or posedge s_reset)
if (s_reset) acc <= 'h0;
else begin
if (load_acc)
acc <= add_o;
else
acc <= acc;
end
// Adder/accumulator output selection
wire [NBITS_ACC-1:0] acc_out = (output_select_i[1]) ? add_o : acc;
// Round, shift, saturate
wire [NBITS_ACC-1:0] acc_rnd = (rnd && (shift_right_i != 0)) ? (acc_out + ({{(NBITS_ACC-1){1'b0}}, 1'b1} << (shift_right_i - 1))) :
acc_out;
wire [NBITS_ACC-1:0] acc_shr = (unsigned_mode) ? (acc_rnd >> shift_right_i) :
(acc_rnd >>> shift_right_i);
wire [NBITS_ACC-1:0] acc_sat_u = (acc_shr[NBITS_ACC-1:NBITS_Z] != 0) ? {{(NBITS_ACC-NBITS_Z){1'b0}},{NBITS_Z{1'b1}}} :
{{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}};
wire [NBITS_ACC-1:0] acc_sat_s = ((|acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b0) ||
(&acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b1)) ? {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}} :
{{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_ACC-1],{NBITS_Z-1{~acc_shr[NBITS_ACC-1]}}}};
wire [NBITS_ACC-1:0] acc_sat = (sat) ? ((unsigned_mode) ? acc_sat_u : acc_sat_s) : acc_shr;
// Output signals
wire [NBITS_Z-1:0] z0;
reg [NBITS_Z-1:0] z1;
wire [NBITS_Z-1:0] z2;
assign z0 = mult_xtnd[NBITS_Z-1:0];
assign z2 = acc_sat[NBITS_Z-1:0];
initial z1 <= 0;
always @(posedge clock_i or posedge s_reset)
if (s_reset)
z1 <= 0;
else begin
z1 <= (output_select_i == 3'b100) ? z0 : z2;
end
// Output mux
assign z_o = (output_select_i == 3'h0) ? z0 :
(output_select_i == 3'h1) ? z2 :
(output_select_i == 3'h2) ? z2 :
(output_select_i == 3'h3) ? z2 :
(output_select_i == 3'h4) ? z1 :
(output_select_i == 3'h5) ? z1 :
(output_select_i == 3'h6) ? z1 :
z1; // if output_select_i == 3'h7
// B input delayed passthrough
initial dly_b_o <= 0;
always @(posedge clock_i or posedge s_reset)
if (s_reset)
dly_b_o <= 0;
else
dly_b_o <= b_i;
endmodule
module dsp_t1_20x18x64 (
input wire [19:0] a_i,
input wire [17:0] b_i,
input wire [ 5:0] acc_fir_i,
output wire [37:0] z_o,
output wire [17:0] dly_b_o,
(* clkbuf_sink *)
input wire clock_i,
input wire reset_i,
input wire [ 2:0] feedback_i,
input wire load_acc_i,
input wire unsigned_a_i,
input wire unsigned_b_i,
input wire [ 2:0] output_select_i,
input wire saturate_enable_i,
input wire [ 5:0] shift_right_i,
input wire round_i,
input wire subtract_i,
input wire register_inputs_i
);
parameter [19:0] COEFF_0 = 20'd0;
parameter [19:0] COEFF_1 = 20'd0;
parameter [19:0] COEFF_2 = 20'd0;
parameter [19:0] COEFF_3 = 20'd0;
QL_DSP2 #(
.MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0})
) dsp (
.a(a_i),
.b(b_i),
.z(z_o),
.dly_b(dly_b_o),
.f_mode(1'b0), // 20x18x64 DSP
.acc_fir(acc_fir_i),
.feedback(feedback_i),
.load_acc(load_acc_i),
.unsigned_a(unsigned_a_i),
.unsigned_b(unsigned_b_i),
.clk(clock_i),
.reset(reset_i),
.saturate_enable(saturate_enable_i),
.output_select(output_select_i),
.round(round_i),
.shift_right(shift_right_i),
.subtract(subtract_i),
.register_inputs(register_inputs_i)
);
endmodule
module dsp_t1_10x9x32 (
input wire [ 9:0] a_i,
input wire [ 8:0] b_i,
input wire [ 5:0] acc_fir_i,
output wire [18:0] z_o,
output wire [ 8:0] dly_b_o,
(* clkbuf_sink *)
input wire clock_i,
input wire reset_i,
input wire [ 2:0] feedback_i,
input wire load_acc_i,
input wire unsigned_a_i,
input wire unsigned_b_i,
input wire [ 2:0] output_select_i,
input wire saturate_enable_i,
input wire [ 5:0] shift_right_i,
input wire round_i,
input wire subtract_i,
input wire register_inputs_i
);
parameter [9:0] COEFF_0 = 10'd0;
parameter [9:0] COEFF_1 = 10'd0;
parameter [9:0] COEFF_2 = 10'd0;
parameter [9:0] COEFF_3 = 10'd0;
wire [18:0] z_rem;
wire [8:0] dly_b_rem;
QL_DSP2 #(
.MODE_BITS({10'd0, COEFF_3,
10'd0, COEFF_2,
10'd0, COEFF_1,
10'd0, COEFF_0})
) dsp (
.a({10'd0, a_i}),
.b({9'd0, b_i}),
.z({z_rem, z_o}),
.dly_b({dly_b_rem, dly_b_o}),
.f_mode(1'b1), // 10x9x32 DSP
.acc_fir(acc_fir_i),
.feedback(feedback_i),
.load_acc(load_acc_i),
.unsigned_a(unsigned_a_i),
.unsigned_b(unsigned_b_i),
.clk(clock_i),
.reset(reset_i),
.saturate_enable(saturate_enable_i),
.output_select(output_select_i),
.round(round_i),
.shift_right(shift_right_i),
.subtract(subtract_i),
.register_inputs(register_inputs_i)
);
endmodule