|  | // 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 | 
|  |  | 
|  | `define MODE_36 3'b011	// 36 or 32-bit | 
|  | `define MODE_18 3'b010	// 18 or 16-bit | 
|  | `define MODE_9  3'b001	// 9 or 8-bit | 
|  | `define MODE_4  3'b100	// 4-bit | 
|  | `define MODE_2  3'b110	// 32-bit | 
|  | `define MODE_1  3'b101	// 32-bit | 
|  |  | 
|  | module \$__QLF_FACTOR_BRAM36_TDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, D1ADDR, D1DATA, D1EN); | 
|  | parameter CFG_ABITS = 10; | 
|  | parameter CFG_DBITS = 36; | 
|  | parameter CFG_ENABLE_B = 4; | 
|  | parameter CFG_ENABLE_D = 4; | 
|  |  | 
|  | parameter CLKPOL2 = 1; | 
|  | parameter CLKPOL3 = 1; | 
|  | parameter [36863:0] INIT = 36864'bx; | 
|  |  | 
|  | 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_B-1:0] D1EN; | 
|  |  | 
|  | wire FLUSH1; | 
|  | wire FLUSH2; | 
|  | wire SPLIT; | 
|  |  | 
|  | wire [14:CFG_ABITS] A1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  | wire [14:CFG_ABITS] B1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  | wire [14:CFG_ABITS] C1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  | wire [14:CFG_ABITS] D1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  |  | 
|  | wire [14:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR}; | 
|  | wire [14:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR}; | 
|  | wire [14:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR}; | 
|  | wire [14:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR}; | 
|  |  | 
|  | wire [35:CFG_DBITS] A1DATA_CMPL; | 
|  | wire [35:CFG_DBITS] B1DATA_CMPL; | 
|  | wire [35:CFG_DBITS] C1DATA_CMPL; | 
|  | wire [35:CFG_DBITS] D1DATA_CMPL; | 
|  |  | 
|  | wire [35:0] A1DATA_TOTAL; | 
|  | wire [35:0] B1DATA_TOTAL; | 
|  | wire [35:0] C1DATA_TOTAL; | 
|  | wire [35:0] D1DATA_TOTAL; | 
|  |  | 
|  | wire [14:0] PORT_A_ADDR; | 
|  | wire [14:0] PORT_B_ADDR; | 
|  |  | 
|  | // 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 = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]}; | 
|  | assign C1DATA = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]}; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], B1DATA[8], B1DATA_CMPL[16:9], B1DATA[7:0]}; | 
|  | assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], D1DATA[8], D1DATA_CMPL[16:9], D1DATA[7:0]}; | 
|  | end | 
|  | default: begin | 
|  | assign A1DATA = A1DATA_TOTAL[CFG_DBITS-1:0]; | 
|  | assign C1DATA = C1DATA_TOTAL[CFG_DBITS-1:0]; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL, B1DATA}; | 
|  | assign D1DATA_TOTAL = {D1DATA_CMPL, D1DATA}; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (CFG_DBITS) | 
|  | 1: begin | 
|  | assign PORT_A_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  |  | 
|  | 32, 36: begin | 
|  | assign PORT_A_ADDR = A1EN ? (A1ADDR_TOTAL << 5) : (B1EN ? (B1ADDR_TOTAL << 5) : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? (C1ADDR_TOTAL << 5) : (D1EN ? (D1ADDR_TOTAL << 5) : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | default: begin | 
|  | assign PORT_A_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 15'd0); | 
|  | assign PORT_B_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 15'd0); | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 SPLIT = 1'b0; | 
|  | assign FLUSH1 = 1'b0; | 
|  | assign FLUSH2 = 1'b0; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | (* rd_data_width = CFG_DBITS *) | 
|  | (* wr_data_width = CFG_DBITS *) | 
|  | TDP36K _TECHMAP_REPLACE_ ( | 
|  | .RESET_ni(1'b1), | 
|  | .WDATA_A1_i(B1DATA_TOTAL[17:0]), | 
|  | .WDATA_A2_i(B1DATA_TOTAL[35:18]), | 
|  | .RDATA_A1_o(A1DATA_TOTAL[17:0]), | 
|  | .RDATA_A2_o(A1DATA_TOTAL[35:18]), | 
|  | .ADDR_A1_i(PORT_A_ADDR), | 
|  | .ADDR_A2_i(PORT_A_ADDR), | 
|  | .CLK_A1_i(CLK1), | 
|  | .CLK_A2_i(CLK1), | 
|  | .REN_A1_i(A1EN), | 
|  | .REN_A2_i(A1EN), | 
|  | .WEN_A1_i(B1EN[0]), | 
|  | .WEN_A2_i(B1EN[0]), | 
|  | .BE_A1_i({B1EN[1],B1EN[0]}), | 
|  | .BE_A2_i({B1EN[3],B1EN[2]}), | 
|  |  | 
|  | .WDATA_B1_i(D1DATA_TOTAL[17:0]), | 
|  | .WDATA_B2_i(D1DATA_TOTAL[35:18]), | 
|  | .RDATA_B1_o(C1DATA_TOTAL[17:0]), | 
|  | .RDATA_B2_o(C1DATA_TOTAL[35:18]), | 
|  | .ADDR_B1_i(PORT_B_ADDR), | 
|  | .ADDR_B2_i(PORT_B_ADDR), | 
|  | .CLK_B1_i(CLK2), | 
|  | .CLK_B2_i(CLK2), | 
|  | .REN_B1_i(C1EN), | 
|  | .REN_B2_i(C1EN), | 
|  | .WEN_B1_i(D1EN[0]), | 
|  | .WEN_B2_i(D1EN[0]), | 
|  | .BE_B1_i({D1EN[1],D1EN[0]}), | 
|  | .BE_B2_i({D1EN[3],D1EN[2]}), | 
|  |  | 
|  | .FLUSH1_i(FLUSH1), | 
|  | .FLUSH2_i(FLUSH2) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | // ------------------------------------------------------------------------ | 
|  |  | 
|  | module \$__QLF_FACTOR_BRAM18_TDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, 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] INIT = 18432'bx; | 
|  |  | 
|  | 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; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | BRAM2x18_TDP #( | 
|  | .CFG_ABITS(CFG_ABITS), | 
|  | .CFG_DBITS(CFG_DBITS), | 
|  | .CFG_ENABLE_B(CFG_ENABLE_B), | 
|  | .CFG_ENABLE_D(CFG_ENABLE_D), | 
|  | .CLKPOL2(CLKPOL2), | 
|  | .CLKPOL3(CLKPOL3), | 
|  | .INIT0(INIT) | 
|  | ) _TECHMAP_REPLACE_ ( | 
|  | .A1ADDR(A1ADDR), | 
|  | .A1DATA(A1DATA), | 
|  | .A1EN(A1EN), | 
|  | .B1ADDR(B1ADDR), | 
|  | .B1DATA(B1DATA), | 
|  | .B1EN(B1EN), | 
|  | .CLK1(CLK1), | 
|  |  | 
|  | .C1ADDR(C1ADDR), | 
|  | .C1DATA(C1DATA), | 
|  | .C1EN(C1EN), | 
|  | .D1ADDR(D1ADDR), | 
|  | .D1DATA(D1DATA), | 
|  | .D1EN(D1EN), | 
|  | .CLK2(CLK2), | 
|  |  | 
|  | .E1ADDR(), | 
|  | .E1DATA(), | 
|  | .E1EN(), | 
|  | .F1ADDR(), | 
|  | .F1DATA(), | 
|  | .F1EN(), | 
|  | .CLK3(), | 
|  |  | 
|  | .G1ADDR(), | 
|  | .G1DATA(), | 
|  | .G1EN(), | 
|  | .H1ADDR(), | 
|  | .H1DATA(), | 
|  | .H1EN(), | 
|  | .CLK4() | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | module \$__QLF_FACTOR_BRAM18_SDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, CLK1, CLK2); | 
|  | parameter CFG_ABITS = 11; | 
|  | parameter CFG_DBITS = 18; | 
|  | parameter CFG_ENABLE_B = 4; | 
|  |  | 
|  | parameter CLKPOL2 = 1; | 
|  | parameter CLKPOL3 = 1; | 
|  | parameter [18431:0] INIT = 18432'bx; | 
|  |  | 
|  | 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; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | BRAM2x18_SDP #( | 
|  | .CFG_ABITS(CFG_ABITS), | 
|  | .CFG_DBITS(CFG_DBITS), | 
|  | .CFG_ENABLE_B(CFG_ENABLE_B), | 
|  | .CLKPOL2(CLKPOL2), | 
|  | .CLKPOL3(CLKPOL3), | 
|  | .INIT0(INIT) | 
|  | ) _TECHMAP_REPLACE_ ( | 
|  | .A1ADDR(A1ADDR), | 
|  | .A1DATA(A1DATA), | 
|  | .A1EN(A1EN), | 
|  | .CLK1(CLK1), | 
|  |  | 
|  | .B1ADDR(B1ADDR), | 
|  | .B1DATA(B1DATA), | 
|  | .B1EN(B1EN), | 
|  | .CLK2(CLK2) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | module \$__QLF_FACTOR_BRAM36_SDP (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; | 
|  |  | 
|  | localparam MODE_36  = 3'b111;	// 36 or 32-bit | 
|  | localparam MODE_18  = 3'b110;	// 18 or 16-bit | 
|  | localparam MODE_9   = 3'b101;	// 9 or 8-bit | 
|  | localparam MODE_4   = 3'b100;	// 4-bit | 
|  | localparam MODE_2   = 3'b010;	// 32-bit | 
|  | localparam MODE_1   = 3'b001;	// 32-bit | 
|  |  | 
|  | 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 [35:0] DOBDO; | 
|  |  | 
|  | wire [14:CFG_ABITS] A1ADDR_CMPL; | 
|  | wire [14:CFG_ABITS] B1ADDR_CMPL; | 
|  | wire [35:CFG_DBITS] A1DATA_CMPL; | 
|  | wire [35:CFG_DBITS] B1DATA_CMPL; | 
|  |  | 
|  | wire [14:0] A1ADDR_TOTAL; | 
|  | wire [14:0] B1ADDR_TOTAL; | 
|  | wire [35:0] A1DATA_TOTAL; | 
|  | wire [35:0] B1DATA_TOTAL; | 
|  |  | 
|  | wire FLUSH1; | 
|  | wire FLUSH2; | 
|  |  | 
|  | assign A1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  | assign B1ADDR_CMPL = {15-CFG_ABITS{1'b0}}; | 
|  |  | 
|  | assign A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR}; | 
|  | assign B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR}; | 
|  |  | 
|  | // 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 = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]}; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], B1DATA[8], B1DATA_CMPL[16:9], B1DATA[7:0]}; | 
|  | end | 
|  | default: begin | 
|  | assign A1DATA = A1DATA_TOTAL[CFG_DBITS-1:0]; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL, B1DATA}; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (CFG_DBITS) | 
|  | 1: begin | 
|  | assign A1ADDR_15 = A1ADDR_TOTAL; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 A1ADDR_15 = A1ADDR_TOTAL << 1; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL << 1; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 A1ADDR_15 = A1ADDR_TOTAL << 2; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL << 2; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 A1ADDR_15 = A1ADDR_TOTAL << 3; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL << 3; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 A1ADDR_15 = A1ADDR_TOTAL << 4; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL << 4; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | 32, 36: begin | 
|  | assign A1ADDR_15 = A1ADDR_TOTAL << 5; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL << 5; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | default: begin | 
|  | assign A1ADDR_15 = A1ADDR_TOTAL; | 
|  | assign B1ADDR_15 = B1ADDR_TOTAL; | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | (* rd_data_width = CFG_DBITS *) | 
|  | (* wr_data_width = CFG_DBITS *) | 
|  | TDP36K _TECHMAP_REPLACE_ ( | 
|  | .RESET_ni(1'b1), | 
|  | .WDATA_A1_i(18'h3FFFF), | 
|  | .WDATA_A2_i(18'h3FFFF), | 
|  | .RDATA_A1_o(A1DATA_TOTAL[17:0]), | 
|  | .RDATA_A2_o(A1DATA_TOTAL[35:18]), | 
|  | .ADDR_A1_i(A1ADDR_15), | 
|  | .ADDR_A2_i(A1ADDR_15), | 
|  | .CLK_A1_i(CLK2), | 
|  | .CLK_A2_i(CLK2), | 
|  | .REN_A1_i(A1EN), | 
|  | .REN_A2_i(A1EN), | 
|  | .WEN_A1_i(1'b0), | 
|  | .WEN_A2_i(1'b0), | 
|  | .BE_A1_i({A1EN, A1EN}), | 
|  | .BE_A2_i({A1EN, A1EN}), | 
|  |  | 
|  | .WDATA_B1_i(B1DATA_TOTAL[17:0]), | 
|  | .WDATA_B2_i(B1DATA_TOTAL[35:18]), | 
|  | .RDATA_B1_o(DOBDO[17:0]), | 
|  | .RDATA_B2_o(DOBDO[35:18]), | 
|  | .ADDR_B1_i(B1ADDR_15), | 
|  | .ADDR_B2_i(B1ADDR_15), | 
|  | .CLK_B1_i(CLK3), | 
|  | .CLK_B2_i(CLK3), | 
|  | .REN_B1_i(1'b0), | 
|  | .REN_B2_i(1'b0), | 
|  | .WEN_B1_i(B1EN[0]), | 
|  | .WEN_B2_i(B1EN[0]), | 
|  | .BE_B1_i(B1EN[1:0]), | 
|  | .BE_B2_i(B1EN[3:2]), | 
|  |  | 
|  | .FLUSH1_i(FLUSH1), | 
|  | .FLUSH2_i(FLUSH2) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | (* techmap_celltype = "_$_mem_v2_asymmetric" *) | 
|  | module \$__QLF_FACTOR_BRAM36_SDP_ASYMMETRIC (RD_ADDR, RD_ARST, RD_CLK, RD_DATA, RD_EN, RD_SRST, WR_ADDR, WR_CLK, WR_DATA, WR_EN); | 
|  | parameter CFG_ABITS = 10; | 
|  | parameter CFG_DBITS = 36; | 
|  | parameter CFG_ENABLE_B = 4; | 
|  |  | 
|  | parameter CLKPOL2 = 1; | 
|  | parameter CLKPOL3 = 1; | 
|  |  | 
|  | parameter RD_ADDR_WIDTH = 11; | 
|  | parameter RD_DATA_WIDTH = 16; | 
|  | parameter WR_ADDR_WIDTH = 10; | 
|  | parameter WR_DATA_WIDTH = 32; | 
|  |  | 
|  | parameter ABITS = 0; | 
|  | parameter MEMID = 0; | 
|  | parameter [36863:0] INIT = 36864'bx; | 
|  | parameter OFFSET = 0; | 
|  | parameter RD_ARST_VALUE = 0; | 
|  | parameter RD_CE_OVER_SRST = 0; | 
|  | parameter RD_CLK_ENABLE = 0; | 
|  | parameter RD_CLK_POLARITY = 0; | 
|  | parameter RD_COLLISION_X_MASK = 0; | 
|  | parameter RD_INIT_VALUE = 0; | 
|  | parameter RD_PORTS = 0; | 
|  | parameter RD_SRST_VALUE = 0; | 
|  | parameter RD_TRANSPARENCY_MASK = 0; | 
|  | parameter RD_WIDE_CONTINUATION = 0; | 
|  | parameter SIZE = 0; | 
|  | parameter WIDTH = 0; | 
|  | parameter WR_CLK_ENABLE = 0; | 
|  | parameter WR_CLK_POLARITY = 0; | 
|  | parameter WR_PORTS = 0; | 
|  | parameter WR_PRIORITY_MASK = 0; | 
|  | parameter WR_WIDE_CONTINUATION = 0; | 
|  |  | 
|  | localparam MODE_36  = 3'b111;	// 36 or 32-bit | 
|  | localparam MODE_18  = 3'b110;	// 18 or 16-bit | 
|  | localparam MODE_9   = 3'b101;	// 9 or 8-bit | 
|  | localparam MODE_4   = 3'b100;	// 4-bit | 
|  | localparam MODE_2   = 3'b010;	// 32-bit | 
|  | localparam MODE_1   = 3'b001;	// 32-bit | 
|  |  | 
|  | localparam READ_DATA_BITS_TO_SKIP = 36 - RD_DATA_WIDTH; | 
|  |  | 
|  | input RD_CLK; | 
|  | input WR_CLK; | 
|  | input RD_ARST; | 
|  | input RD_SRST; | 
|  |  | 
|  | input [RD_ADDR_WIDTH-1:0] RD_ADDR; | 
|  | output reg [RD_DATA_WIDTH-1:0] RD_DATA; | 
|  | input RD_EN; | 
|  |  | 
|  | input [WR_ADDR_WIDTH-1:0] WR_ADDR; | 
|  | input [WR_DATA_WIDTH-1:0] WR_DATA; | 
|  | input [CFG_ENABLE_B-1:0] WR_EN; | 
|  |  | 
|  | wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL; | 
|  | wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL; | 
|  | reg [35:RD_DATA_WIDTH] RD_DATA_CMPL; | 
|  | wire [35:WR_DATA_WIDTH] WR_DATA_CMPL; | 
|  |  | 
|  | wire [14:0] RD_ADDR_TOTAL; | 
|  | wire [14:0] WR_ADDR_TOTAL; | 
|  | wire [35:0] RD_DATA_TOTAL; | 
|  | wire [35:0] WR_DATA_TOTAL; | 
|  |  | 
|  | wire [14:0] RD_ADDR_SHIFTED; | 
|  | wire [14:0] WR_ADDR_SHIFTED; | 
|  |  | 
|  | wire FLUSH1; | 
|  | wire FLUSH2; | 
|  |  | 
|  | assign RD_ADDR_CMPL = {15-RD_ADDR_WIDTH{1'b0}}; | 
|  | assign WR_ADDR_CMPL = {15-WR_ADDR_WIDTH{1'b0}}; | 
|  |  | 
|  | assign RD_ADDR_TOTAL = {RD_ADDR_CMPL, RD_ADDR}; | 
|  | assign WR_ADDR_TOTAL = {WR_ADDR_CMPL, WR_ADDR}; | 
|  |  | 
|  | assign WR_DATA_TOTAL = {WR_DATA_CMPL, WR_DATA}; | 
|  |  | 
|  | // Assign parameters | 
|  | case (RD_DATA_WIDTH) | 
|  | 1: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | endcase | 
|  | end | 
|  | 2: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 4: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 8, 9: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 16, 18: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 32, 36: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | default: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | endcase | 
|  | end | 
|  | endcase | 
|  |  | 
|  | // Apply shift | 
|  | case (RD_DATA_WIDTH) | 
|  | 1: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL; | 
|  | end | 
|  | 2: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1; | 
|  | end | 
|  | 4: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2; | 
|  | end | 
|  | 8, 9: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3; | 
|  | end | 
|  | 16, 18: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4; | 
|  | end | 
|  | 32, 36: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5; | 
|  | end | 
|  | default: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL; | 
|  | end | 
|  | 2: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1; | 
|  | end | 
|  | 4: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2; | 
|  | end | 
|  | 8, 9: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3; | 
|  | end | 
|  | 16, 18: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4; | 
|  | end | 
|  | 32, 36: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5; | 
|  | end | 
|  | default: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | assign FLUSH1 = 1'b0; | 
|  | assign FLUSH2 = 1'b0; | 
|  |  | 
|  | // TODO configure per width | 
|  | wire [17:0] PORT_A1_RDATA; | 
|  | wire [17:0] PORT_A2_RDATA; | 
|  | always @(PORT_A1_RDATA, PORT_A2_RDATA) begin | 
|  | if (RD_DATA_WIDTH > 18) | 
|  | {RD_DATA_CMPL, RD_DATA} <= {PORT_A2_RDATA[17 - (READ_DATA_BITS_TO_SKIP / 2):17 - (READ_DATA_BITS_TO_SKIP / 2)], PORT_A1_RDATA[17 - (READ_DATA_BITS_TO_SKIP / 2):17 - (READ_DATA_BITS_TO_SKIP / 2)],PORT_A2_RDATA[17 - (READ_DATA_BITS_TO_SKIP / 2):0], PORT_A1_RDATA[17 - (READ_DATA_BITS_TO_SKIP / 2):0]}; | 
|  | else | 
|  | {RD_DATA_CMPL, RD_DATA} <= {PORT_A1_RDATA[17 - (READ_DATA_BITS_TO_SKIP-18):17 - (READ_DATA_BITS_TO_SKIP-18)], PORT_A1_RDATA[17 - (READ_DATA_BITS_TO_SKIP-18):0]}; | 
|  | end | 
|  |  | 
|  | wire [17:0] PORT_A1_WDATA = {WR_DATA_CMPL, WR_DATA[15:0]}; | 
|  | wire [17:0] PORT_A2_WDATA = {WR_DATA_CMPL, WR_DATA[31:16]}; | 
|  | // TODO configure per width | 
|  |  | 
|  | wire PORT_A1_CLK = RD_CLK; | 
|  | wire PORT_A2_CLK = RD_CLK; | 
|  |  | 
|  | wire PORT_A1_REN = RD_EN; | 
|  | wire PORT_A1_WEN = WR_EN; | 
|  | wire [1:0] PORT_A1_BE = {PORT_A1_WEN, PORT_A1_WEN}; | 
|  |  | 
|  | wire PORT_A2_REN = RD_EN; | 
|  | wire PORT_A2_WEN = WR_EN; | 
|  | wire [1:0] PORT_A2_BE = {PORT_A2_WEN, PORT_A2_WEN}; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | (* rd_data_width = RD_DATA_WIDTH *) | 
|  | (* wr_data_width = WR_DATA_WIDTH *) | 
|  | TDP36K _TECHMAP_REPLACE_ ( | 
|  | .RESET_ni(1'b1), | 
|  |  | 
|  | .WDATA_A1_i(PORT_A1_WDATA), | 
|  | .RDATA_A1_o(), | 
|  | .ADDR_A1_i(WR_ADDR_SHIFTED), | 
|  | .CLK_A1_i(PORT_A1_CLK), | 
|  | .REN_A1_i(1'b0), | 
|  | .WEN_A1_i(PORT_A1_WEN), | 
|  | .BE_A1_i(PORT_A1_BE), | 
|  |  | 
|  | .WDATA_B1_i(), | 
|  | .RDATA_B1_o(PORT_A1_RDATA), | 
|  | .ADDR_B1_i(RD_ADDR_SHIFTED), | 
|  | .CLK_B1_i(PORT_A1_CLK), | 
|  | .REN_B1_i(PORT_A1_REN), | 
|  | .WEN_B1_i(1'b0), | 
|  | .BE_B1_i(PORT_A1_BE), | 
|  |  | 
|  | .WDATA_A2_i(PORT_A2_WDATA), | 
|  | .RDATA_A2_o(), | 
|  | .ADDR_A2_i(WR_ADDR_SHIFTED), | 
|  | .CLK_A2_i(PORT_A2_CLK), | 
|  | .REN_A2_i(1'b0), | 
|  | .WEN_A2_i(PORT_A2_WEN), | 
|  | .BE_A2_i(PORT_A2_BE), | 
|  |  | 
|  | .WDATA_B2_i(), | 
|  | .RDATA_B2_o(PORT_A2_RDATA), | 
|  | .ADDR_B2_i(RD_ADDR_SHIFTED), | 
|  | .CLK_B2_i(PORT_A2_CLK), | 
|  | .REN_B2_i(PORT_A2_REN), | 
|  | .WEN_B2_i(1'b0), | 
|  | .BE_B2_i(PORT_A2_BE), | 
|  |  | 
|  | .FLUSH1_i(FLUSH1), | 
|  | .FLUSH2_i(FLUSH2) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | module SFIFO_36K_BLK ( | 
|  | DIN, | 
|  | PUSH, | 
|  | POP, | 
|  | CLK, | 
|  | Async_Flush, | 
|  | Overrun_Error, | 
|  | Full_Watermark, | 
|  | Almost_Full, | 
|  | Full, | 
|  | Underrun_Error, | 
|  | Empty_Watermark, | 
|  | Almost_Empty, | 
|  | Empty, | 
|  | DOUT | 
|  | ); | 
|  |  | 
|  | parameter WR_DATA_WIDTH = 36; | 
|  | parameter RD_DATA_WIDTH = 36; | 
|  | parameter UPAE_DBITS = 12'd10; | 
|  | parameter UPAF_DBITS = 12'd10; | 
|  |  | 
|  | input wire CLK; | 
|  | input wire PUSH, POP; | 
|  | input wire [WR_DATA_WIDTH-1:0] DIN; | 
|  | input wire Async_Flush; | 
|  | output wire [RD_DATA_WIDTH-1:0] DOUT; | 
|  | output wire Almost_Full, Almost_Empty; | 
|  | output wire Full, Empty; | 
|  | output wire Full_Watermark, Empty_Watermark; | 
|  | output wire Overrun_Error, Underrun_Error; | 
|  |  | 
|  | wire [35:0] in_reg; | 
|  | wire [35:0] out_reg; | 
|  | wire [17:0] fifo_flags; | 
|  |  | 
|  | wire [35:0] RD_DATA_CMPL; | 
|  | wire [35:WR_DATA_WIDTH] WR_DATA_CMPL; | 
|  |  | 
|  | wire Push_Clk, Pop_Clk; | 
|  |  | 
|  | assign Push_Clk = CLK; | 
|  | assign Pop_Clk = CLK; | 
|  |  | 
|  | assign Overrun_Error = fifo_flags[0]; | 
|  | assign Full_Watermark = fifo_flags[1]; | 
|  | assign Almost_Full = fifo_flags[2]; | 
|  | assign Full = fifo_flags[3]; | 
|  | assign Underrun_Error = fifo_flags[4]; | 
|  | assign Empty_Watermark = fifo_flags[5]; | 
|  | assign Almost_Empty = fifo_flags[6]; | 
|  | assign Empty = fifo_flags[7]; | 
|  |  | 
|  | generate | 
|  | if (WR_DATA_WIDTH == 36) begin | 
|  | assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0]; | 
|  | end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin | 
|  | assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16]; | 
|  | assign in_reg[17:0] = {2'b00,DIN[15:0]}; | 
|  | end else if (WR_DATA_WIDTH == 9) begin | 
|  | assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]}; | 
|  | end else begin | 
|  | assign in_reg[35:WR_DATA_WIDTH]  = 0; | 
|  | assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | generate | 
|  | if (RD_DATA_WIDTH == 36) begin | 
|  | assign RD_DATA_CMPL = out_reg; | 
|  | end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin | 
|  | assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]}; | 
|  | end else if (RD_DATA_WIDTH == 9) begin | 
|  | assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]}; | 
|  | end else begin | 
|  | assign RD_DATA_CMPL = {18'h0, out_reg[17:0]}; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | case (RD_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 16, 18: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 32, 36: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b1 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b1 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | default: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | endcase | 
|  |  | 
|  | (* is_fifo = 1 *) | 
|  | (* sync_fifo = 1 *) | 
|  | (* rd_data_width = RD_DATA_WIDTH *) | 
|  | (* wr_data_width = WR_DATA_WIDTH *) | 
|  | TDP36K U1 ( | 
|  | .RESET_ni(1'b1), | 
|  | .WDATA_A1_i(in_reg[17:0]), | 
|  | .WDATA_A2_i(in_reg[35:18]), | 
|  | .RDATA_A1_o(fifo_flags), | 
|  | .RDATA_A2_o(), | 
|  | .ADDR_A1_i(14'h0), | 
|  | .ADDR_A2_i(14'h0), | 
|  | .CLK_A1_i(Push_Clk), | 
|  | .CLK_A2_i(1'b0), | 
|  | .REN_A1_i(1'b1), | 
|  | .REN_A2_i(1'b0), | 
|  | .WEN_A1_i(PUSH), | 
|  | .WEN_A2_i(1'b0), | 
|  | .BE_A1_i(2'b11), | 
|  | .BE_A2_i(2'b11), | 
|  |  | 
|  | .WDATA_B1_i(18'h0), | 
|  | .WDATA_B2_i(18'h0), | 
|  | .RDATA_B1_o(out_reg[17:0]), | 
|  | .RDATA_B2_o(out_reg[35:18]), | 
|  | .ADDR_B1_i(14'h0), | 
|  | .ADDR_B2_i(14'h0), | 
|  | .CLK_B1_i(Pop_Clk), | 
|  | .CLK_B2_i(1'b0), | 
|  | .REN_B1_i(POP), | 
|  | .REN_B2_i(1'b0), | 
|  | .WEN_B1_i(1'b0), | 
|  | .WEN_B2_i(1'b0), | 
|  | .BE_B1_i(2'b11), | 
|  | .BE_B2_i(2'b11), | 
|  |  | 
|  | .FLUSH1_i(Async_Flush), | 
|  | .FLUSH2_i(1'b0) | 
|  | ); | 
|  |  | 
|  | assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0]; | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module AFIFO_36K_BLK ( | 
|  | DIN, | 
|  | PUSH, | 
|  | POP, | 
|  | Push_Clk, | 
|  | Pop_Clk, | 
|  | Async_Flush, | 
|  | Overrun_Error, | 
|  | Full_Watermark, | 
|  | Almost_Full, | 
|  | Full, | 
|  | Underrun_Error, | 
|  | Empty_Watermark, | 
|  | Almost_Empty, | 
|  | Empty, | 
|  | DOUT | 
|  | ); | 
|  |  | 
|  | parameter WR_DATA_WIDTH = 36; | 
|  | parameter RD_DATA_WIDTH = 36; | 
|  | parameter UPAE_DBITS = 12'd10; | 
|  | parameter UPAF_DBITS = 12'd10; | 
|  |  | 
|  | input wire Push_Clk, Pop_Clk; | 
|  | input wire PUSH, POP; | 
|  | input wire [WR_DATA_WIDTH-1:0] DIN; | 
|  | input wire Async_Flush; | 
|  | output wire [RD_DATA_WIDTH-1:0] DOUT; | 
|  | output wire Almost_Full, Almost_Empty; | 
|  | output wire Full, Empty; | 
|  | output wire Full_Watermark, Empty_Watermark; | 
|  | output wire Overrun_Error, Underrun_Error; | 
|  |  | 
|  | wire [35:0] in_reg; | 
|  | wire [35:0] out_reg; | 
|  | wire [17:0] fifo_flags; | 
|  |  | 
|  | wire [35:0] RD_DATA_CMPL; | 
|  | wire [35:WR_DATA_WIDTH] WR_DATA_CMPL; | 
|  |  | 
|  | assign Overrun_Error = fifo_flags[0]; | 
|  | assign Full_Watermark = fifo_flags[1]; | 
|  | assign Almost_Full = fifo_flags[2]; | 
|  | assign Full = fifo_flags[3]; | 
|  | assign Underrun_Error = fifo_flags[4]; | 
|  | assign Empty_Watermark = fifo_flags[5]; | 
|  | assign Almost_Empty = fifo_flags[6]; | 
|  | assign Empty = fifo_flags[7]; | 
|  |  | 
|  | generate | 
|  | if (WR_DATA_WIDTH == 36) begin | 
|  | assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0]; | 
|  | end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin | 
|  | assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16]; | 
|  | assign in_reg[17:0] = {2'b00,DIN[15:0]}; | 
|  | end else if (WR_DATA_WIDTH == 9) begin | 
|  | assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]}; | 
|  | end else begin | 
|  | assign in_reg[35:WR_DATA_WIDTH]  = 0; | 
|  | assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | generate | 
|  | if (RD_DATA_WIDTH == 36) begin | 
|  | assign RD_DATA_CMPL = out_reg; | 
|  | end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin | 
|  | assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]}; | 
|  | end else if (RD_DATA_WIDTH == 9) begin | 
|  | assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]}; | 
|  | end else begin | 
|  | assign RD_DATA_CMPL = {18'h0, out_reg[17:0]}; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | case (RD_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 16, 18: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 32, 36: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | default: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 8, 9: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0, | 
|  | UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | endcase | 
|  |  | 
|  | (* is_fifo = 1 *) | 
|  | (* sync_fifo = 0 *) | 
|  | (* rd_data_width = RD_DATA_WIDTH *) | 
|  | (* wr_data_width = WR_DATA_WIDTH *) | 
|  | TDP36K U1 ( | 
|  | .RESET_ni(1'b1), | 
|  | .WDATA_A1_i(in_reg[17:0]), | 
|  | .WDATA_A2_i(in_reg[35:18]), | 
|  | .RDATA_A1_o(fifo_flags), | 
|  | .RDATA_A2_o(), | 
|  | .ADDR_A1_i(14'h0), | 
|  | .ADDR_A2_i(14'h0), | 
|  | .CLK_A1_i(Push_Clk), | 
|  | .CLK_A2_i(1'b0), | 
|  | .REN_A1_i(1'b1), | 
|  | .REN_A2_i(1'b0), | 
|  | .WEN_A1_i(PUSH), | 
|  | .WEN_A2_i(1'b0), | 
|  | .BE_A1_i(2'b11), | 
|  | .BE_A2_i(2'b11), | 
|  |  | 
|  | .WDATA_B1_i(18'h0), | 
|  | .WDATA_B2_i(18'h0), | 
|  | .RDATA_B1_o(out_reg[17:0]), | 
|  | .RDATA_B2_o(out_reg[35:18]), | 
|  | .ADDR_B1_i(14'h0), | 
|  | .ADDR_B2_i(14'h0), | 
|  | .CLK_B1_i(Pop_Clk), | 
|  | .CLK_B2_i(1'b0), | 
|  | .REN_B1_i(POP), | 
|  | .REN_B2_i(1'b0), | 
|  | .WEN_B1_i(1'b0), | 
|  | .WEN_B2_i(1'b0), | 
|  | .BE_B1_i(2'b11), | 
|  | .BE_B2_i(2'b11), | 
|  |  | 
|  | .FLUSH1_i(Async_Flush), | 
|  | .FLUSH2_i(1'b0) | 
|  | ); | 
|  |  | 
|  | assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0]; | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module SFIFO_18K_BLK ( | 
|  | DIN, | 
|  | PUSH, | 
|  | POP, | 
|  | CLK, | 
|  | Async_Flush, | 
|  | Overrun_Error, | 
|  | Full_Watermark, | 
|  | Almost_Full, | 
|  | Full, | 
|  | Underrun_Error, | 
|  | Empty_Watermark, | 
|  | Almost_Empty, | 
|  | Empty, | 
|  | DOUT | 
|  | ); | 
|  |  | 
|  | parameter WR_DATA_WIDTH = 18; | 
|  | parameter RD_DATA_WIDTH = 18; | 
|  | parameter UPAE_DBITS = 11'd10; | 
|  | parameter UPAF_DBITS = 11'd10; | 
|  |  | 
|  | input wire CLK; | 
|  | input wire PUSH, POP; | 
|  | input wire [WR_DATA_WIDTH-1:0] DIN; | 
|  | input wire Async_Flush; | 
|  | output wire [RD_DATA_WIDTH-1:0] DOUT; | 
|  | output wire Almost_Full, Almost_Empty; | 
|  | output wire Full, Empty; | 
|  | output wire Full_Watermark, Empty_Watermark; | 
|  | output wire Overrun_Error, Underrun_Error; | 
|  |  | 
|  | BRAM2x18_SFIFO  #( | 
|  | .WR_DATA_WIDTH(WR_DATA_WIDTH), | 
|  | .RD_DATA_WIDTH(RD_DATA_WIDTH), | 
|  | .UPAE_DBITS1(UPAE_DBITS), | 
|  | .UPAF_DBITS1(UPAF_DBITS), | 
|  | .UPAE_DBITS2(), | 
|  | .UPAF_DBITS2() | 
|  | ) U1 | 
|  | ( | 
|  | .DIN1(DIN), | 
|  | .PUSH1(PUSH), | 
|  | .POP1(POP), | 
|  | .CLK1(CLK), | 
|  | .Async_Flush1(Async_Flush), | 
|  | .Overrun_Error1(Overrun_Error), | 
|  | .Full_Watermark1(Full_Watermark), | 
|  | .Almost_Full1(Almost_Full), | 
|  | .Full1(Full), | 
|  | .Underrun_Error1(Underrun_Error), | 
|  | .Empty_Watermark1(Empty_Watermark), | 
|  | .Almost_Empty1(Almost_Empty), | 
|  | .Empty1(Empty), | 
|  | .DOUT1(DOUT), | 
|  |  | 
|  | .DIN2(), | 
|  | .PUSH2(), | 
|  | .POP2(), | 
|  | .CLK2(), | 
|  | .Async_Flush2(), | 
|  | .Overrun_Error2(), | 
|  | .Full_Watermark2(), | 
|  | .Almost_Full2(), | 
|  | .Full2(), | 
|  | .Underrun_Error2(), | 
|  | .Empty_Watermark2(), | 
|  | .Almost_Empty2(), | 
|  | .Empty2(), | 
|  | .DOUT2() | 
|  | ); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module AFIFO_18K_BLK ( | 
|  | DIN, | 
|  | PUSH, | 
|  | POP, | 
|  | Push_Clk, | 
|  | Pop_Clk, | 
|  | Async_Flush, | 
|  | Overrun_Error, | 
|  | Full_Watermark, | 
|  | Almost_Full, | 
|  | Full, | 
|  | Underrun_Error, | 
|  | Empty_Watermark, | 
|  | Almost_Empty, | 
|  | Empty, | 
|  | DOUT | 
|  | ); | 
|  |  | 
|  | parameter WR_DATA_WIDTH = 18; | 
|  | parameter RD_DATA_WIDTH = 18; | 
|  | parameter UPAE_DBITS = 11'd10; | 
|  | parameter UPAF_DBITS = 11'd10; | 
|  |  | 
|  | input wire Push_Clk, Pop_Clk; | 
|  | input wire PUSH, POP; | 
|  | input wire [WR_DATA_WIDTH-1:0] DIN; | 
|  | input wire Async_Flush; | 
|  | output wire [RD_DATA_WIDTH-1:0] DOUT; | 
|  | output wire Almost_Full, Almost_Empty; | 
|  | output wire Full, Empty; | 
|  | output wire Full_Watermark, Empty_Watermark; | 
|  | output wire Overrun_Error, Underrun_Error; | 
|  |  | 
|  | BRAM2x18_AFIFO  #( | 
|  | .WR_DATA_WIDTH(WR_DATA_WIDTH), | 
|  | .RD_DATA_WIDTH(RD_DATA_WIDTH), | 
|  | .UPAE_DBITS1(UPAE_DBITS), | 
|  | .UPAF_DBITS1(UPAF_DBITS), | 
|  | .UPAE_DBITS2(), | 
|  | .UPAF_DBITS2() | 
|  | ) U1 | 
|  | ( | 
|  | .DIN1(DIN), | 
|  | .PUSH1(PUSH), | 
|  | .POP1(POP), | 
|  | .Push_Clk1(Push_Clk), | 
|  | .Pop_Clk1(Pop_Clk), | 
|  | .Async_Flush1(Async_Flush), | 
|  | .Overrun_Error1(Overrun_Error), | 
|  | .Full_Watermark1(Full_Watermark), | 
|  | .Almost_Full1(Almost_Full), | 
|  | .Full1(Full), | 
|  | .Underrun_Error1(Underrun_Error), | 
|  | .Empty_Watermark1(Empty_Watermark), | 
|  | .Almost_Empty1(Almost_Empty), | 
|  | .Empty1(Empty), | 
|  | .DOUT1(DOUT), | 
|  |  | 
|  | .DIN2(), | 
|  | .PUSH2(), | 
|  | .POP2(), | 
|  | .Push_Clk2(), | 
|  | .Pop_Clk2(), | 
|  | .Async_Flush2(), | 
|  | .Overrun_Error2(), | 
|  | .Full_Watermark2(), | 
|  | .Almost_Full2(), | 
|  | .Full2(), | 
|  | .Underrun_Error2(), | 
|  | .Empty_Watermark2(), | 
|  | .Almost_Empty2(), | 
|  | .Empty2(), | 
|  | .DOUT2() | 
|  | ); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module RAM_36K_BLK ( | 
|  | WEN_i, | 
|  | REN_i, | 
|  | WR_CLK_i, | 
|  | RD_CLK_i, | 
|  | WR_BE_i, | 
|  | WR_ADDR_i, | 
|  | RD_ADDR_i, | 
|  | WDATA_i, | 
|  | RDATA_o | 
|  | ); | 
|  |  | 
|  | parameter WR_ADDR_WIDTH = 10; | 
|  | parameter RD_ADDR_WIDTH = 10; | 
|  | parameter WR_DATA_WIDTH = 36; | 
|  | parameter RD_DATA_WIDTH = 36; | 
|  | parameter BE_WIDTH = 4; | 
|  |  | 
|  | input wire WEN_i; | 
|  | input wire REN_i; | 
|  | input wire WR_CLK_i; | 
|  | input wire RD_CLK_i; | 
|  | input wire [BE_WIDTH-1:0] WR_BE_i; | 
|  | input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i; | 
|  | input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i; | 
|  | input wire [WR_DATA_WIDTH-1 :0] WDATA_i; | 
|  | output wire [RD_DATA_WIDTH-1 :0] RDATA_o; | 
|  |  | 
|  | wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL; | 
|  | wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL; | 
|  | wire [35:0] RD_DATA_CMPL; | 
|  | wire [35:WR_DATA_WIDTH] WR_DATA_CMPL; | 
|  |  | 
|  | wire [14:0] RD_ADDR_TOTAL; | 
|  | wire [14:0] WR_ADDR_TOTAL; | 
|  |  | 
|  | wire [14:0] RD_ADDR_SHIFTED; | 
|  | wire [14:0] WR_ADDR_SHIFTED; | 
|  |  | 
|  | wire [3:0] WR_BE; | 
|  |  | 
|  | wire FLUSH1; | 
|  | wire FLUSH2; | 
|  |  | 
|  | generate | 
|  | if (WR_ADDR_WIDTH == 15) begin | 
|  | assign WR_ADDR_TOTAL = WR_ADDR_i; | 
|  | end else begin | 
|  | assign WR_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0; | 
|  | assign WR_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR_ADDR_i; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | generate | 
|  | if (RD_ADDR_WIDTH == 15) begin | 
|  | assign RD_ADDR_TOTAL = RD_ADDR_i; | 
|  | end else begin | 
|  | assign RD_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0; | 
|  | assign RD_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD_ADDR_i; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | // Assign parameters | 
|  | case (RD_DATA_WIDTH) | 
|  | 1: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | endcase | 
|  | end | 
|  | 2: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 4: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 8, 9: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 16, 18: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | 32, 36: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | 2: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0 | 
|  | }; | 
|  | end | 
|  | endcase | 
|  | end | 
|  | default: begin | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0 | 
|  | }; | 
|  | end | 
|  | 4: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0 | 
|  | }; | 
|  | end | 
|  | 8, 9: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0 | 
|  | }; | 
|  | end | 
|  | 16, 18: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0 | 
|  | }; | 
|  | end | 
|  | 32, 36: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0, | 
|  | 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0 | 
|  | }; | 
|  | end | 
|  | default: begin | 
|  | defparam BRAM_BLK.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | endcase | 
|  | end | 
|  | endcase | 
|  |  | 
|  | // Apply shift | 
|  | case (RD_DATA_WIDTH) | 
|  | 1: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL; | 
|  | end | 
|  | 2: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1; | 
|  | end | 
|  | 4: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2; | 
|  | end | 
|  | 8, 9: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3; | 
|  | end | 
|  | 16, 18: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4; | 
|  | end | 
|  | 32, 36: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5; | 
|  | end | 
|  | default: begin | 
|  | assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (WR_DATA_WIDTH) | 
|  | 1: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL; | 
|  | end | 
|  | 2: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1; | 
|  | end | 
|  | 4: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2; | 
|  | end | 
|  | 8, 9: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3; | 
|  | end | 
|  | 16, 18: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4; | 
|  | end | 
|  | 32, 36: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5; | 
|  | end | 
|  | default: begin | 
|  | assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (BE_WIDTH) | 
|  | 4: begin | 
|  | assign WR_BE = WR_BE_i[BE_WIDTH-1 :0]; | 
|  | end | 
|  | default: begin | 
|  | assign WR_BE[3:BE_WIDTH] = 0; | 
|  | assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0]; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | assign FLUSH1 = 1'b0; | 
|  | assign FLUSH2 = 1'b0; | 
|  |  | 
|  | // TODO configure per width | 
|  | wire [17:0] PORT_B1_RDATA; | 
|  | wire [17:0] PORT_B2_RDATA; | 
|  | wire [35:0] PORT_A_WDATA; | 
|  |  | 
|  | generate | 
|  | if (WR_DATA_WIDTH == 36) begin | 
|  | assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0]; | 
|  | end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin | 
|  | assign PORT_A_WDATA[WR_DATA_WIDTH+1:18]  = WDATA_i[WR_DATA_WIDTH-1:16]; | 
|  | assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]}; | 
|  | end else if (WR_DATA_WIDTH == 9) begin | 
|  | assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]}; | 
|  | end else begin | 
|  | assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0; | 
|  | assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | generate | 
|  | if (RD_DATA_WIDTH == 36) begin | 
|  | assign RD_DATA_CMPL = {PORT_B2_RDATA, PORT_B1_RDATA}; | 
|  | end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin | 
|  | assign RD_DATA_CMPL  = {2'b00,PORT_B2_RDATA[17:0],PORT_B1_RDATA[15:0]}; | 
|  | end else if (RD_DATA_WIDTH == 9) begin | 
|  | assign RD_DATA_CMPL = { 27'h0, PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]}; | 
|  | end else begin | 
|  | assign RD_DATA_CMPL = {18'h0, PORT_B1_RDATA}; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | assign RDATA_o = RD_DATA_CMPL[RD_DATA_WIDTH-1:0]; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | (* rd_data_width = RD_DATA_WIDTH *) | 
|  | (* wr_data_width = WR_DATA_WIDTH *) | 
|  | TDP36K BRAM_BLK ( | 
|  | .RESET_ni(1'b1), | 
|  |  | 
|  | .WDATA_A1_i(PORT_A_WDATA[17:0]), | 
|  | .RDATA_A1_o(), | 
|  | .ADDR_A1_i(WR_ADDR_SHIFTED), | 
|  | .CLK_A1_i(WR_CLK_i), | 
|  | .REN_A1_i(1'b0), | 
|  | .WEN_A1_i(WEN_i), | 
|  | .BE_A1_i(WR_BE[1:0]), | 
|  |  | 
|  | .WDATA_B1_i(18'h0), | 
|  | .RDATA_B1_o(PORT_B1_RDATA[17:0]), | 
|  | .ADDR_B1_i(RD_ADDR_SHIFTED), | 
|  | .CLK_B1_i(RD_CLK_i), | 
|  | .REN_B1_i(REN_i), | 
|  | .WEN_B1_i(1'b0), | 
|  | .BE_B1_i({REN_i,REN_i}), | 
|  |  | 
|  | .WDATA_A2_i(PORT_A_WDATA[35:18]), | 
|  | .RDATA_A2_o(), | 
|  | .ADDR_A2_i(WR_ADDR_SHIFTED), | 
|  | .CLK_A2_i(WR_CLK_i), | 
|  | .REN_A2_i(1'b0), | 
|  | .WEN_A2_i(WEN_i), | 
|  | .BE_A2_i(WR_BE[3:2]), | 
|  |  | 
|  | .WDATA_B2_i(18'h0), | 
|  | .RDATA_B2_o(PORT_B2_RDATA[17:0]), | 
|  | .ADDR_B2_i(RD_ADDR_SHIFTED), | 
|  | .CLK_B2_i(RD_CLK_i), | 
|  | .REN_B2_i(REN_i), | 
|  | .WEN_B2_i(1'b0), | 
|  | .BE_B2_i({REN_i,REN_i}), | 
|  |  | 
|  | .FLUSH1_i(FLUSH1), | 
|  | .FLUSH2_i(FLUSH2) | 
|  | ); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module RAM_18K_BLK ( | 
|  | WEN_i, | 
|  | REN_i, | 
|  | WR_CLK_i, | 
|  | RD_CLK_i, | 
|  | WR_BE_i, | 
|  | WR_ADDR_i, | 
|  | RD_ADDR_i, | 
|  | WDATA_i, | 
|  | RDATA_o | 
|  | ); | 
|  |  | 
|  | parameter WR_ADDR_WIDTH = 10; | 
|  | parameter RD_ADDR_WIDTH = 10; | 
|  | parameter WR_DATA_WIDTH = 18; | 
|  | parameter RD_DATA_WIDTH = 18; | 
|  | parameter BE_WIDTH = 2; | 
|  |  | 
|  | input wire WEN_i; | 
|  | input wire REN_i; | 
|  | input wire WR_CLK_i; | 
|  | input wire RD_CLK_i; | 
|  | input wire [BE_WIDTH-1:0] WR_BE_i; | 
|  | input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i; | 
|  | input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i; | 
|  | input wire [WR_DATA_WIDTH-1 :0] WDATA_i; | 
|  | output wire [RD_DATA_WIDTH-1 :0] RDATA_o; | 
|  |  | 
|  | BRAM2x18_SP  #( | 
|  | .WR_ADDR_WIDTH(WR_ADDR_WIDTH), | 
|  | .RD_ADDR_WIDTH(RD_ADDR_WIDTH), | 
|  | .WR_DATA_WIDTH(WR_DATA_WIDTH), | 
|  | .RD_DATA_WIDTH(RD_DATA_WIDTH), | 
|  | .BE1_WIDTH(BE_WIDTH), | 
|  | .BE2_WIDTH() | 
|  | ) U1 | 
|  | ( | 
|  | .RESET_ni(1'b1), | 
|  |  | 
|  | .WEN1_i(WEN_i), | 
|  | .REN1_i(REN_i), | 
|  | .WR1_CLK_i(WR_CLK_i), | 
|  | .RD1_CLK_i(RD_CLK_i), | 
|  | .WR1_BE_i(WR_BE_i), | 
|  | .WR1_ADDR_i(WR_ADDR_i), | 
|  | .RD1_ADDR_i(RD_ADDR_i), | 
|  | .WDATA1_i(WDATA_i), | 
|  | .RDATA1_o(RDATA_o), | 
|  |  | 
|  | .WEN2_i(), | 
|  | .REN2_i(), | 
|  | .WR2_CLK_i(), | 
|  | .RD2_CLK_i(), | 
|  | .WR2_BE_i(), | 
|  | .WR2_ADDR_i(), | 
|  | .RD2_ADDR_i(), | 
|  | .WDATA2_i(), | 
|  | .RDATA2_o() | 
|  | ); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module DPRAM_36K_BLK ( | 
|  | CLK1_i, | 
|  | WEN1_i, | 
|  | WR1_BE_i, | 
|  | REN1_i, | 
|  | WR1_ADDR_i, | 
|  | RD1_ADDR_i, | 
|  | WDATA1_i, | 
|  | RDATA1_o, | 
|  |  | 
|  | CLK2_i, | 
|  | WEN2_i, | 
|  | WR2_BE_i, | 
|  | REN2_i, | 
|  | WR2_ADDR_i, | 
|  | RD2_ADDR_i, | 
|  | WDATA2_i, | 
|  | RDATA2_o | 
|  | ); | 
|  |  | 
|  | parameter ADDR_WIDTH = 10; | 
|  | parameter DATA_WIDTH = 36; | 
|  | parameter BE1_WIDTH = 4; | 
|  | parameter BE2_WIDTH = 4; | 
|  |  | 
|  | input wire CLK1_i; | 
|  | input wire WEN1_i; | 
|  | input wire [BE1_WIDTH-1 :0] WR1_BE_i; | 
|  | input wire REN1_i; | 
|  | input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i; | 
|  | input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i; | 
|  | input wire [DATA_WIDTH-1 :0] WDATA1_i; | 
|  | output wire [DATA_WIDTH-1 :0] RDATA1_o; | 
|  |  | 
|  | input wire CLK2_i; | 
|  | input wire WEN2_i; | 
|  | input wire [BE2_WIDTH-1 :0] WR2_BE_i; | 
|  | input wire REN2_i; | 
|  | input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i; | 
|  | input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i; | 
|  | input wire [DATA_WIDTH-1 :0] WDATA2_i; | 
|  | output wire [DATA_WIDTH-1 :0] RDATA2_o; | 
|  |  | 
|  | wire FLUSH1; | 
|  | wire FLUSH2; | 
|  |  | 
|  | wire [14:0] A1ADDR_TOTAL; | 
|  | wire [14:0] B1ADDR_TOTAL; | 
|  | wire [14:0] C1ADDR_TOTAL; | 
|  | wire [14:0] D1ADDR_TOTAL; | 
|  |  | 
|  | generate | 
|  | if (ADDR_WIDTH == 15) begin | 
|  | assign A1ADDR_TOTAL = RD1_ADDR_i; | 
|  | assign B1ADDR_TOTAL = WR1_ADDR_i; | 
|  | assign C1ADDR_TOTAL = RD2_ADDR_i; | 
|  | assign D1ADDR_TOTAL = WR2_ADDR_i; | 
|  | end else begin | 
|  | assign A1ADDR_TOTAL[14:ADDR_WIDTH] = 0; | 
|  | assign A1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD1_ADDR_i; | 
|  | assign B1ADDR_TOTAL[14:ADDR_WIDTH] = 0; | 
|  | assign B1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR1_ADDR_i; | 
|  | assign C1ADDR_TOTAL[14:ADDR_WIDTH] = 0; | 
|  | assign C1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD2_ADDR_i; | 
|  | assign D1ADDR_TOTAL[14:ADDR_WIDTH] = 0; | 
|  | assign D1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR2_ADDR_i; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | wire [35:DATA_WIDTH] A1DATA_CMPL; | 
|  | wire [35:DATA_WIDTH] B1DATA_CMPL; | 
|  | wire [35:DATA_WIDTH] C1DATA_CMPL; | 
|  | wire [35:DATA_WIDTH] D1DATA_CMPL; | 
|  |  | 
|  | wire [35:0] A1DATA_TOTAL; | 
|  | wire [35:0] B1DATA_TOTAL; | 
|  | wire [35:0] C1DATA_TOTAL; | 
|  | wire [35:0] D1DATA_TOTAL; | 
|  |  | 
|  | wire [14:0] PORT_A_ADDR; | 
|  | wire [14:0] PORT_B_ADDR; | 
|  |  | 
|  | wire [3:0] WR1_BE; | 
|  | wire [3:0] WR2_BE; | 
|  |  | 
|  | generate | 
|  | if (BE1_WIDTH == 4) begin | 
|  | assign WR1_BE = WR1_BE_i; | 
|  | end else begin | 
|  | assign WR1_BE[3:BE1_WIDTH] = 0; | 
|  | assign WR1_BE[BE1_WIDTH-1:0] = WR1_BE_i[BE1_WIDTH-1:0]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | generate | 
|  | if (BE2_WIDTH == 4) begin | 
|  | assign WR2_BE = WR2_BE_i; | 
|  | end else begin | 
|  | assign WR2_BE[3:BE2_WIDTH] = 0; | 
|  | assign WR2_BE[BE2_WIDTH-1:0] = WR2_BE_i[BE2_WIDTH-1:0]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | // 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 (DATA_WIDTH) | 
|  | 9: begin | 
|  | assign RDATA1_o = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]}; | 
|  | assign RDATA2_o = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]}; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], WDATA1_i[8], B1DATA_CMPL[16:9], WDATA1_i[7:0]}; | 
|  | assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], WDATA2_i[8], D1DATA_CMPL[16:9], WDATA2_i[7:0]}; | 
|  | end | 
|  | default: begin | 
|  | assign RDATA1_o = A1DATA_TOTAL[DATA_WIDTH-1:0]; | 
|  | assign RDATA2_o = C1DATA_TOTAL[DATA_WIDTH-1:0]; | 
|  | assign B1DATA_TOTAL = {B1DATA_CMPL, WDATA1_i}; | 
|  | assign D1DATA_TOTAL = {D1DATA_CMPL, WDATA2_i}; | 
|  | end | 
|  | endcase | 
|  |  | 
|  | case (DATA_WIDTH) | 
|  | 1: begin | 
|  | assign PORT_A_ADDR = REN1_i ? A1ADDR_TOTAL : (WEN1_i ? B1ADDR_TOTAL : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? C1ADDR_TOTAL : (WEN2_i ? D1ADDR_TOTAL : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 1) : (WEN1_i ? (B1ADDR_TOTAL << 1) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 1) : (WEN2_i ? (D1ADDR_TOTAL << 1) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 2) : (WEN1_i ? (B1ADDR_TOTAL << 2) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 2) : (WEN2_i ? (D1ADDR_TOTAL << 2) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 3) : (WEN1_i ? (B1ADDR_TOTAL << 3) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 3) : (WEN2_i ? (D1ADDR_TOTAL << 3) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 4) : (WEN1_i ? (B1ADDR_TOTAL << 4) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 4) : (WEN2_i ? (D1ADDR_TOTAL << 4) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  |  | 
|  | 32, 36: begin | 
|  | assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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 | 
|  | default: begin | 
|  | assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0); | 
|  | assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0); | 
|  | defparam U1.MODE_BITS = { 1'b0, | 
|  | 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; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | (* rd_data_width = DATA_WIDTH *) | 
|  | (* wr_data_width = DATA_WIDTH *) | 
|  | TDP36K U1 ( | 
|  | .RESET_ni(1'b1), | 
|  | .WDATA_A1_i(B1DATA_TOTAL[17:0]), | 
|  | .WDATA_A2_i(B1DATA_TOTAL[35:18]), | 
|  | .RDATA_A1_o(A1DATA_TOTAL[17:0]), | 
|  | .RDATA_A2_o(A1DATA_TOTAL[35:18]), | 
|  | .ADDR_A1_i(PORT_A_ADDR), | 
|  | .ADDR_A2_i(PORT_A_ADDR), | 
|  | .CLK_A1_i(CLK1_i), | 
|  | .CLK_A2_i(CLK1_i), | 
|  | .REN_A1_i(REN1_i), | 
|  | .REN_A2_i(REN1_i), | 
|  | .WEN_A1_i(WEN1_i), | 
|  | .WEN_A2_i(WEN1_i), | 
|  | .BE_A1_i(WR1_BE[1:0]), | 
|  | .BE_A2_i(WR1_BE[3:0]), | 
|  |  | 
|  | .WDATA_B1_i(D1DATA_TOTAL[17:0]), | 
|  | .WDATA_B2_i(D1DATA_TOTAL[35:18]), | 
|  | .RDATA_B1_o(C1DATA_TOTAL[17:0]), | 
|  | .RDATA_B2_o(C1DATA_TOTAL[35:18]), | 
|  | .ADDR_B1_i(PORT_B_ADDR), | 
|  | .ADDR_B2_i(PORT_B_ADDR), | 
|  | .CLK_B1_i(CLK2_i), | 
|  | .CLK_B2_i(CLK2_i), | 
|  | .REN_B1_i(REN2_i), | 
|  | .REN_B2_i(REN2_i), | 
|  | .WEN_B1_i(WEN2_i), | 
|  | .WEN_B2_i(WEN2_i), | 
|  | .BE_B1_i(WR2_BE[1:0]), | 
|  | .BE_B2_i(WR2_BE[3:0]), | 
|  |  | 
|  | .FLUSH1_i(FLUSH1), | 
|  | .FLUSH2_i(FLUSH2) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | module DPRAM_18K_BLK ( | 
|  | CLK1_i, | 
|  | WEN1_i, | 
|  | REN1_i, | 
|  | WR1_ADDR_i, | 
|  | RD1_ADDR_i, | 
|  | WDATA1_i, | 
|  | RDATA1_o, | 
|  |  | 
|  | CLK2_i, | 
|  | WEN2_i, | 
|  | REN2_i, | 
|  | WR2_ADDR_i, | 
|  | RD2_ADDR_i, | 
|  | WDATA2_i, | 
|  | RDATA2_o | 
|  | ); | 
|  |  | 
|  | parameter ADDR_WIDTH = 10; | 
|  | parameter DATA_WIDTH = 18; | 
|  | parameter BE1_WIDTH = 2; | 
|  | parameter BE2_WIDTH = 2; | 
|  |  | 
|  | input wire CLK1_i; | 
|  | input wire WEN1_i; | 
|  | input wire REN1_i; | 
|  | input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i; | 
|  | input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i; | 
|  | input wire [DATA_WIDTH-1 :0] WDATA1_i; | 
|  | output wire [DATA_WIDTH-1 :0] RDATA1_o; | 
|  |  | 
|  | input wire CLK2_i; | 
|  | input wire WEN2_i; | 
|  | input wire REN2_i; | 
|  | input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i; | 
|  | input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i; | 
|  | input wire [DATA_WIDTH-1 :0] WDATA2_i; | 
|  | output wire [DATA_WIDTH-1 :0] RDATA2_o; | 
|  |  | 
|  | (* is_inferred = 1 *) | 
|  | BRAM2x18_DP #( | 
|  | .CFG_ABITS(ADDR_WIDTH), | 
|  | .CFG_DBITS(DATA_WIDTH), | 
|  | .CFG_ENABLE_B(BE1_WIDTH), | 
|  | .CFG_ENABLE_D(BE2_WIDTH) | 
|  | ) bram2x18_inst ( | 
|  | .A1ADDR(RD1_ADDR_i), | 
|  | .A1DATA(RDATA1_o), | 
|  | .A1EN(REN1_i), | 
|  | .B1ADDR(WR1_ADDR_i), | 
|  | .B1DATA(WDATA1_i), | 
|  | .B1EN({WEN1_i,WEN1_i}), | 
|  | .CLK1(CLK1_i), | 
|  |  | 
|  | .C1ADDR(RD2_ADDR_i), | 
|  | .C1DATA(RDATA2_o), | 
|  | .C1EN(REN2_i), | 
|  | .D1ADDR(WR2_ADDR_i), | 
|  | .D1DATA(WDATA2_i), | 
|  | .D1EN({WEN2_i,WEN2_i}), | 
|  | .CLK2(CLK2_i), | 
|  |  | 
|  | .E1ADDR(), | 
|  | .E1DATA(), | 
|  | .E1EN(), | 
|  | .F1ADDR(), | 
|  | .F1DATA(), | 
|  | .F1EN(), | 
|  | .CLK3(), | 
|  |  | 
|  | .G1ADDR(), | 
|  | .G1DATA(), | 
|  | .G1EN(), | 
|  | .H1ADDR(), | 
|  | .H1DATA(), | 
|  | .H1EN(), | 
|  | .CLK4() | 
|  | ); | 
|  | endmodule | 
|  |  |