blob: be0b23017cfe6bfb2879438a28c6e21319862b42 [file] [log] [blame]
// 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
module \$__QLF_FACTOR_BRAM36_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
parameter CFG_ABITS = 10;
parameter CFG_DBITS = 36;
parameter CFG_ENABLE_B = 4;
parameter CLKPOL2 = 1;
parameter CLKPOL3 = 1;
parameter [36863:0] INIT = 36864'bx;
input CLK2;
input CLK3;
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;
wire [14:0] A1ADDR_15;
wire [14:0] B1ADDR_15;
//wire [7:0] B1EN_8 = //B1EN;
wire [3:0] DIP, DOP;
wire [31:0] DI, DO;
wire [31:0] DOBDO;
wire [3:0] DOPBDOP;
//wire [2:0] WRITEDATAWIDTHB;
//wire [2:0] READDATAWIDTHA;
assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] };
assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA;
assign A1ADDR_15[14:CFG_ABITS] = 0;
assign A1ADDR_15[CFG_ABITS-1:0] = A1ADDR;
assign B1ADDR_15[14:CFG_ABITS] = 0;
assign B1ADDR_15[CFG_ABITS-1:0] = B1ADDR;
/*if (CFG_DBITS == 1) begin
assign WRITEDATAWIDTHB = 3'b000;
assign READDATAWIDTHA = 3'b000;
end else if (CFG_DBITS == 2) begin
assign WRITEDATAWIDTHB = 3'b001;
assign READDATAWIDTHA = 3'b001;
end else if (CFG_DBITS > 2 && CFG_DBITS <= 4) begin
assign WRITEDATAWIDTHB = 3'b010;
assign READDATAWIDTHA = 3'b010;
end else if (CFG_DBITS > 4 && CFG_DBITS <= 9) begin
assign WRITEDATAWIDTHB = 3'b011;
assign READDATAWIDTHA = 3'b011;
end else if (CFG_DBITS > 9 && CFG_DBITS <= 18) begin
assign WRITEDATAWIDTHB = 3'b100;
assign READDATAWIDTHA = 3'b100;
end else if (CFG_DBITS > 18 && CFG_DBITS <= 36) begin
assign WRITEDATAWIDTHB = 3'b101;
assign READDATAWIDTHA = 3'b101;
end*/
generate if (CFG_DBITS > 8) begin
TDP_BRAM36 #(
//`include "brams_init_36.vh"
.READ_WIDTH_A(CFG_DBITS),
.READ_WIDTH_B(CFG_DBITS),
.WRITE_WIDTH_A(CFG_DBITS),
.WRITE_WIDTH_B(CFG_DBITS),
) _TECHMAP_REPLACE_ (
.WRITEDATAA(32'hFFFFFFFF),
.WRITEDATAAP(4'hF),
.READDATAA(DO[31:0]),
.READDATAAP(DOP[3:0]),
.ADDRA(A1ADDR_15),
.CLOCKA(CLK2),
.READENABLEA(A1EN),
.WRITEENABLEA(1'b0),
.BYTEENABLEA(4'b0),
//.WRITEDATAWIDTHA(3'b0),
//.READDATAWIDTHA(READDATAWIDTHA),
.WRITEDATAB(DI),
.WRITEDATABP(DIP),
.READDATAB(DOBDO),
.READDATABP(DOPBDOP),
.ADDRB(B1ADDR_15),
.CLOCKB(CLK3),
.READENABLEA(1'b0),
.WRITEENABLEB(1'b1),
.BYTEENABLEB(B1EN)
//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
//.READDATAWIDTHB(3'b0)
);
end else begin
TDP_BRAM36 #(
//`include "brams_init_32.vh"
) _TECHMAP_REPLACE_ (
.WRITEDATAA(32'hFFFFFFFF),
.WRITEDATAAP(4'hF),
.READDATAA(DO[31:0]),
.READDATAAP(DOP[3:0]),
.ADDRA(A1ADDR_15),
.CLOCKA(CLK2),
.READENABLEA(A1EN),
.WRITEENABLEA(1'b0),
.BYTEENABLEA(4'b0),
//.WRITEDATAWIDTHA(3'b0),
//.READDATAWIDTHA(READDATAWIDTHA),
.WRITEDATAB(DI),
.WRITEDATABP(DIP),
.READDATAB(DOBDO),
.READDATABP(DOPBDOP),
.ADDRB(B1ADDR_15),
.CLOCKB(CLK3),
.READENABLEB(1'b0),
.WRITEENABLEB(1'b1),
.BYTEENABLEB(B1EN)
//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
//.READDATAWIDTHB(3'b0)
);
end endgenerate
endmodule
// ------------------------------------------------------------------------
module \$__QLF_FACTOR_BRAM18_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
parameter CFG_ABITS = 10;
parameter CFG_DBITS = 18;
parameter CFG_ENABLE_B = 2;
parameter CLKPOL2 = 1;
parameter CLKPOL3 = 1;
parameter [18431:0] INIT = 18432'bx;
input CLK2;
input CLK3;
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;
wire [13:0] A1ADDR_14;
wire [13:0] B1ADDR_14;
//wire [3:0] B1EN_4 = B1EN;
wire [1:0] DIP, DOP;
wire [15:0] DI, DO;
wire [15:0] DOBDO;
wire [1:0] DOPBDOP;
assign A1DATA = { DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] };
assign { DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA;
assign A1ADDR_14[13:CFG_ABITS] = 0;
assign A1ADDR_14[CFG_ABITS-1:0] = A1ADDR;
assign B1ADDR_14[13:CFG_ABITS] = 0;
assign B1ADDR_14[CFG_ABITS-1:0] = B1ADDR;
/*if (CFG_DBITS == 1) begin
assign WRITEDATAWIDTHB = 3'b000;
assign READDATAWIDTHA = 3'b000;
end else if (CFG_DBITS == 2) begin
assign WRITEDATAWIDTHB = 3'b001;
assign READDATAWIDTHA = 3'b001;
end else if (CFG_DBITS > 2 && CFG_DBITS <= 4) begin
assign WRITEDATAWIDTHB = 3'b010;
assign READDATAWIDTHA = 3'b010;
end else if (CFG_DBITS > 4 && CFG_DBITS <= 9) begin
assign WRITEDATAWIDTHB = 3'b011;
assign READDATAWIDTHA = 3'b011;
end else if (CFG_DBITS > 9 && CFG_DBITS <= 18) begin
//assign WRITEDATAWIDTHB = 3'b100;
assign READDATAWIDTHA = 3'b100;
end*/
generate if (CFG_DBITS > 8) begin
TDP_BRAM18 #(
//`include "brams_init_18.vh"
.READ_WIDTH_A(CFG_DBITS),
.READ_WIDTH_B(CFG_DBITS),
.WRITE_WIDTH_A(CFG_DBITS),
.WRITE_WIDTH_B(CFG_DBITS),
) _TECHMAP_REPLACE_ (
.WRITEDATAA(16'hFFFF),
.WRITEDATAAP(2'b11),
.READDATAA(DO[15:0]),
.READDATAAP(DOP[2:0]),
.ADDRA(A1ADDR_14),
.CLOCKA(CLK2),
.READENABLEA(A1EN),
.WRITEENABLEA(1'b0),
.BYTEENABLEA(2'b0),
//.WRITEDATAWIDTHA(3'b0),
//.READDATAWIDTHA(READDATAWIDTHA),
.WRITEDATAB(DI),
.WRITEDATABP(DIP),
.READDATAB(DOBDO),
.READDATABP(DOPBDOP),
.ADDRB(B1ADDR_14),
.CLOCKB(CLK3),
.READENABLEB(1'b0),
.WRITEENABLEB(1'b1),
.BYTEENABLEB(B1EN)
//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
//.READDATAWIDTHB(3'b0)
);
end else begin
TDP_BRAM18 #(
//`include "brams_init_16.vh"
) _TECHMAP_REPLACE_ (
.WRITEDATAA(16'hFFFF),
.WRITEDATAAP(2'b11),
.READDATAA(DO[15:0]),
.READDATAAP(DOP[2:0]),
.ADDRA(A1ADDR_14),
.CLOCKA(CLK2),
.READENABLEA(A1EN),
.WRITEENABLEA(1'b0),
.BYTEENABLEA(2'b0),
//.WRITEDATAWIDTHA(3'b0),
// .READDATAWIDTHA(READDATAWIDTHA),
.WRITEDATAB(DI),
.WRITEDATABP(DIP),
.READDATAB(DOBDO),
.READDATABP(DOPBDOP),
.ADDRB(B1ADDR_14),
.CLOCKB(CLK3),
.READENABLEB(1'b0),
.WRITEENABLEB(1'b1),
.BYTEENABLEB(B1EN)
//.WRITEDATAWIDTHB(WRITEDATAWIDTHB),
//.READDATAWIDTHB(3'b0)
);
end endgenerate
endmodule