|  | // 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 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 |