2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 // See Xilinx UG953 and UG474 for a description of the cell types below.
21 // http://www.xilinx.com/support/documentation/user_guides/ug474_7Series_CLB.pdf
22 // http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_4/ug953-vivado-7series-libraries.pdf
34 (* iopad_external_pin *)
36 parameter IOSTANDARD = "default";
37 parameter IBUF_LOW_PWR = 0;
46 (* iopad_external_pin *)
48 parameter CAPACITANCE = "DONT_CARE";
49 parameter IBUF_DELAY_VALUE = "0";
50 parameter IBUF_LOW_PWR = "TRUE";
51 parameter IOSTANDARD = "DEFAULT";
56 (* iopad_external_pin *)
59 parameter IOSTANDARD = "default";
61 parameter SLEW = "SLOW";
69 (* iopad_external_pin *)
75 parameter integer DRIVE = 12;
76 parameter IBUF_LOW_PWR = "TRUE";
77 parameter IOSTANDARD = "DEFAULT";
78 parameter SLEW = "SLOW";
79 assign IO = T ? 1'bz : I;
88 (* iopad_external_pin *)
93 parameter CAPACITANCE = "DONT_CARE";
94 parameter integer DRIVE = 12;
95 parameter IOSTANDARD = "DEFAULT";
96 parameter SLEW = "SLOW";
97 assign O = T ? 1'bz : I;
109 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/CLK_BUFG_TOP_R.sdf#L11
118 (* invertible_pin = "IS_S0_INVERTED" *)
120 (* invertible_pin = "IS_S1_INVERTED" *)
122 (* invertible_pin = "IS_CE0_INVERTED" *)
124 (* invertible_pin = "IS_CE1_INVERTED" *)
126 (* invertible_pin = "IS_IGNORE0_INVERTED" *)
128 (* invertible_pin = "IS_IGNORE1_INVERTED" *)
131 parameter [0:0] INIT_OUT = 1'b0;
132 parameter PRESELECT_I0 = "FALSE";
133 parameter PRESELECT_I1 = "FALSE";
134 parameter [0:0] IS_CE0_INVERTED = 1'b0;
135 parameter [0:0] IS_CE1_INVERTED = 1'b0;
136 parameter [0:0] IS_S0_INVERTED = 1'b0;
137 parameter [0:0] IS_S1_INVERTED = 1'b0;
138 parameter [0:0] IS_IGNORE0_INVERTED = 1'b0;
139 parameter [0:0] IS_IGNORE1_INVERTED = 1'b0;
141 wire I0_internal = ((CE0 ^ IS_CE0_INVERTED) ? I0 : INIT_OUT);
142 wire I1_internal = ((CE1 ^ IS_CE1_INVERTED) ? I1 : INIT_OUT);
143 wire S0_true = (S0 ^ IS_S0_INVERTED);
144 wire S1_true = (S1 ^ IS_S1_INVERTED);
146 assign O = S0_true ? I0_internal : (S1_true ? I1_internal : INIT_OUT);
154 (* invertible_pin = "IS_CE_INVERTED" *)
157 parameter [0:0] INIT_OUT = 1'b0;
158 parameter CE_TYPE = "SYNC";
159 parameter [0:0] IS_CE_INVERTED = 1'b0;
161 assign O = ((CE ^ IS_CE_INVERTED) ? I : INIT_OUT);
165 // module OBUFT(output O, input I, T);
166 // assign O = T ? 1'bz : I;
169 // module IOBUF(inout IO, output O, input I, T);
170 // assign O = IO, IO = T ? 1'bz : I;
174 (* clkbuf_inv = "I" *)
185 module LUT1(output O, input I0);
186 parameter [1:0] INIT = 0;
187 assign O = I0 ? INIT[1] : INIT[0];
194 module LUT2(output O, input I0, I1);
195 parameter [3:0] INIT = 0;
196 wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0];
197 assign O = I0 ? s1[1] : s1[0];
205 module LUT3(output O, input I0, I1, I2);
206 parameter [7:0] INIT = 0;
207 wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0];
208 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
209 assign O = I0 ? s1[1] : s1[0];
218 module LUT4(output O, input I0, I1, I2, I3);
219 parameter [15:0] INIT = 0;
220 wire [ 7: 0] s3 = I3 ? INIT[15: 8] : INIT[ 7: 0];
221 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
222 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
223 assign O = I0 ? s1[1] : s1[0];
233 module LUT5(output O, input I0, I1, I2, I3, I4);
234 parameter [31:0] INIT = 0;
235 wire [15: 0] s4 = I4 ? INIT[31:16] : INIT[15: 0];
236 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
237 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
238 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
239 assign O = I0 ? s1[1] : s1[0];
249 // This is a placeholder for ABC9 to extract the area/delay
250 // cost of 3-input LUTs and is not intended to be instantiated
253 module LUT6(output O, input I0, I1, I2, I3, I4, I5);
254 parameter [63:0] INIT = 0;
255 wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
256 wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
257 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
258 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
259 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
260 assign O = I0 ? s1[1] : s1[0];
271 module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5);
272 parameter [63:0] INIT = 0;
273 wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
274 wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
275 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
276 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
277 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
278 assign O6 = I0 ? s1[1] : s1[0];
280 wire [15: 0] s5_4 = I4 ? INIT[31:16] : INIT[15: 0];
281 wire [ 7: 0] s5_3 = I3 ? s5_4[15: 8] : s5_4[ 7: 0];
282 wire [ 3: 0] s5_2 = I2 ? s5_3[ 7: 4] : s5_3[ 3: 0];
283 wire [ 1: 0] s5_1 = I1 ? s5_2[ 3: 2] : s5_2[ 1: 0];
284 assign O5 = I0 ? s5_1[1] : s5_1[0];
287 // This is a placeholder for ABC9 to extract the area/delay
288 // cost of 3-input LUTs and is not intended to be instantiated
290 module \$__ABC9_LUT7 (output O, input I0, I1, I2, I3, I4, I5, I6);
293 // https://github.com/SymbiFlow/prjxray-db/blob/1c85daf1b115da4d27ca83c6b89f53a94de39748/artix7/timings/slicel.sdf#L867
294 (I0 => O) = 642 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
295 (I1 => O) = 631 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
296 (I2 => O) = 472 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
297 (I3 => O) = 407 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
298 (I4 => O) = 238 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
299 (I5 => O) = 127 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
300 (I6 => O) = 0 + 296 /* to select F7BMUX */ + 174 /* CMUX */;
305 // This is a placeholder for ABC9 to extract the area/delay
306 // cost of 3-input LUTs and is not intended to be instantiated
308 module \$__ABC9_LUT8 (output O, input I0, I1, I2, I3, I4, I5, I6, I7);
311 // https://github.com/SymbiFlow/prjxray-db/blob/1c85daf1b115da4d27ca83c6b89f53a94de39748/artix7/timings/slicel.sdf#L716
312 (I0 => O) = 642 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
313 (I1 => O) = 631 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
314 (I2 => O) = 472 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
315 (I3 => O) = 407 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
316 (I4 => O) = 238 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
317 (I5 => O) = 127 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
318 (I6 => O) = 0 + 296 /* to select F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
319 (I7 => O) = 0 + 0 + 273 /* to select F8MUX */ + 192 /* BMUX */;
324 module MUXCY(output O, input CI, DI, S);
325 assign O = S ? CI : DI;
328 module MUXF5(output O, input I0, I1, S);
329 assign O = S ? I1 : I0;
332 module MUXF6(output O, input I0, I1, S);
333 assign O = S ? I1 : I0;
336 (* abc9_box, lib_whitebox *)
337 module MUXF7(output O, input I0, I1, S);
338 assign O = S ? I1 : I0;
340 // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L451-L453
347 (* abc9_box, lib_whitebox *)
348 module MUXF8(output O, input I0, I1, S);
349 assign O = S ? I1 : I0;
351 // Max delays from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L462-L464
358 module MUXF9(output O, input I0, I1, S);
359 assign O = S ? I1 : I0;
362 module XORCY(output O, input CI, LI);
366 (* abc9_box, lib_whitebox *)
376 assign O = S ^ {CO[2:0], CI | CYINIT};
377 assign CO[0] = S[0] ? CI | CYINIT : DI[0];
378 assign CO[1] = S[1] ? CO[0] : DI[1];
379 assign CO[2] = S[2] ? CO[1] : DI[2];
380 assign CO[3] = S[3] ? CO[2] : DI[3];
382 // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L11-L46
383 (CYINIT => O[0]) = 482;
384 (S[0] => O[0]) = 223;
386 (CYINIT => O[1]) = 598;
387 (DI[0] => O[1]) = 407;
388 (S[0] => O[1]) = 400;
389 (S[1] => O[1]) = 205;
391 (CYINIT => O[2]) = 584;
392 (DI[0] => O[2]) = 556;
393 (DI[1] => O[2]) = 537;
394 (S[0] => O[2]) = 523;
395 (S[1] => O[2]) = 558;
396 (S[2] => O[2]) = 226;
398 (CYINIT => O[3]) = 642;
399 (DI[0] => O[3]) = 615;
400 (DI[1] => O[3]) = 596;
401 (DI[2] => O[3]) = 438;
402 (S[0] => O[3]) = 582;
403 (S[1] => O[3]) = 618;
404 (S[2] => O[3]) = 330;
405 (S[3] => O[3]) = 227;
407 (CYINIT => CO[0]) = 536;
408 (DI[0] => CO[0]) = 379;
409 (S[0] => CO[0]) = 340;
411 (CYINIT => CO[1]) = 494;
412 (DI[0] => CO[1]) = 465;
413 (DI[1] => CO[1]) = 445;
414 (S[0] => CO[1]) = 433;
415 (S[1] => CO[1]) = 469;
417 (CYINIT => CO[2]) = 592;
418 (DI[0] => CO[2]) = 540;
419 (DI[1] => CO[2]) = 520;
420 (DI[2] => CO[2]) = 356;
421 (S[0] => CO[2]) = 512;
422 (S[1] => CO[2]) = 548;
423 (S[2] => CO[2]) = 292;
425 (CYINIT => CO[3]) = 580;
426 (DI[0] => CO[3]) = 526;
427 (DI[1] => CO[3]) = 507;
428 (DI[2] => CO[3]) = 398;
429 (DI[3] => CO[3]) = 385;
430 (S[0] => CO[3]) = 508;
431 (S[1] => CO[3]) = 528;
432 (S[2] => CO[3]) = 378;
433 (S[3] => CO[3]) = 380;
445 parameter CARRY_TYPE = "SINGLE_CY8";
446 wire CI4 = (CARRY_TYPE == "DUAL_CY4" ? CI_TOP : CO[3]);
447 assign O = S ^ {CO[6:4], CI4, CO[2:0], CI};
448 assign CO[0] = S[0] ? CI : DI[0];
449 assign CO[1] = S[1] ? CO[0] : DI[1];
450 assign CO[2] = S[2] ? CO[1] : DI[2];
451 assign CO[3] = S[3] ? CO[2] : DI[3];
452 assign CO[4] = S[4] ? CI4 : DI[4];
453 assign CO[5] = S[5] ? CO[4] : DI[5];
454 assign CO[6] = S[6] ? CO[5] : DI[6];
455 assign CO[7] = S[7] ? CO[6] : DI[7];
458 module ORCY (output O, input CI, I);
462 module MULT_AND (output LO, input I0, I1);
466 // Flip-flops and latches.
468 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L238-L250
470 (* abc9_flop, lib_whitebox *)
474 (* invertible_pin = "IS_C_INVERTED" *)
477 (* invertible_pin = "IS_D_INVERTED" *)
479 (* invertible_pin = "IS_R_INVERTED" *)
482 parameter [0:0] INIT = 1'b0;
483 parameter [0:0] IS_C_INVERTED = 1'b0;
484 parameter [0:0] IS_D_INVERTED = 1'b0;
485 parameter [0:0] IS_R_INVERTED = 1'b0;
488 case (|IS_C_INVERTED)
489 1'b0: always @(posedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
490 1'b1: always @(negedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
494 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
495 $setup(D , posedge C &&& CE && !IS_C_INVERTED , /*-46*/ 0); // Negative times not currently supported
496 $setup(D , negedge C &&& CE && IS_C_INVERTED , /*-46*/ 0); // Negative times not currently supported
497 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
498 $setup(CE, posedge C &&& !IS_C_INVERTED, 109);
499 $setup(CE, negedge C &&& IS_C_INVERTED, 109);
500 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
501 $setup(R , posedge C &&& !IS_C_INVERTED, 404);
502 $setup(R , negedge C &&& IS_C_INVERTED, 404);
503 // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
504 if (!IS_C_INVERTED && R != IS_R_INVERTED) (posedge C => (Q : 1'b0)) = 303;
505 if ( IS_C_INVERTED && R != IS_R_INVERTED) (negedge C => (Q : 1'b0)) = 303;
506 if (!IS_C_INVERTED && R == IS_R_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
507 if ( IS_C_INVERTED && R == IS_R_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
511 (* abc9_flop, lib_whitebox *)
520 parameter [0:0] INIT = 1'b0;
522 always @(negedge C) if (R) Q <= 1'b0; else if (CE) Q <= D;
524 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
525 $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
526 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
527 $setup(CE, negedge C, 109);
528 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
529 $setup(R , negedge C, 404); // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
530 if (R) (negedge C => (Q : 1'b0)) = 303;
531 if (!R && CE) (negedge C => (Q : D)) = 303;
535 (* abc9_flop, lib_whitebox *)
539 (* invertible_pin = "IS_C_INVERTED" *)
542 (* invertible_pin = "IS_D_INVERTED" *)
544 (* invertible_pin = "IS_S_INVERTED" *)
547 parameter [0:0] INIT = 1'b1;
548 parameter [0:0] IS_C_INVERTED = 1'b0;
549 parameter [0:0] IS_D_INVERTED = 1'b0;
550 parameter [0:0] IS_S_INVERTED = 1'b0;
553 case (|IS_C_INVERTED)
554 1'b0: always @(posedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
555 1'b1: always @(negedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
559 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
560 $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
561 $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
562 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
563 $setup(CE, posedge C &&& !IS_C_INVERTED, 109);
564 $setup(CE, negedge C &&& IS_C_INVERTED, 109);
565 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
566 $setup(S , posedge C &&& !IS_C_INVERTED, 404);
567 $setup(S , negedge C &&& IS_C_INVERTED, 404);
568 // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
569 if (!IS_C_INVERTED && S != IS_S_INVERTED) (posedge C => (Q : 1'b1)) = 303;
570 if ( IS_C_INVERTED && S != IS_S_INVERTED) (negedge C => (Q : 1'b1)) = 303;
571 if (!IS_C_INVERTED && S == IS_S_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
572 if ( IS_C_INVERTED && S == IS_S_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
576 (* abc9_flop, lib_whitebox *)
585 parameter [0:0] INIT = 1'b1;
587 always @(negedge C) if (S) Q <= 1'b1; else if (CE) Q <= D;
589 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
590 $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
591 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
592 $setup(CE, negedge C, 109);
593 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
594 $setup(S , negedge C, 404);
595 // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
596 if (S) (negedge C => (Q : 1'b1)) = 303;
597 if (!S && CE) (negedge C => (Q : D)) = 303;
604 (* invertible_pin = "IS_C_INVERTED" *)
606 (* invertible_pin = "IS_CE_INVERTED" *)
608 (* invertible_pin = "IS_D_INVERTED" *)
610 (* invertible_pin = "IS_R_INVERTED" *)
612 (* invertible_pin = "IS_S_INVERTED" *)
615 parameter [0:0] INIT = 1'b0;
616 parameter [0:0] IS_C_INVERTED = 1'b0;
617 parameter [0:0] IS_CE_INVERTED = 1'b0;
618 parameter [0:0] IS_D_INVERTED = 1'b0;
619 parameter [0:0] IS_R_INVERTED = 1'b0;
620 parameter [0:0] IS_S_INVERTED = 1'b0;
622 wire c = C ^ IS_C_INVERTED;
623 wire ce = CE ^ IS_CE_INVERTED;
624 wire d = D ^ IS_D_INVERTED;
625 wire r = R ^ IS_R_INVERTED;
626 wire s = S ^ IS_S_INVERTED;
639 (* invertible_pin = "IS_C_INVERTED" *)
641 (* invertible_pin = "IS_CE_INVERTED" *)
643 (* invertible_pin = "IS_D_INVERTED" *)
645 (* invertible_pin = "IS_R_INVERTED" *)
647 (* invertible_pin = "IS_S_INVERTED" *)
650 parameter [0:0] INIT = 1'b0;
651 parameter [0:0] IS_C_INVERTED = 1'b0;
652 parameter [0:0] IS_CE_INVERTED = 1'b0;
653 parameter [0:0] IS_D_INVERTED = 1'b0;
654 parameter [0:0] IS_R_INVERTED = 1'b0;
655 parameter [0:0] IS_S_INVERTED = 1'b0;
657 wire c = C ^ IS_C_INVERTED;
658 wire ce = CE ^ IS_CE_INVERTED;
659 wire d = D ^ IS_D_INVERTED;
660 wire r = R ^ IS_R_INVERTED;
661 wire s = S ^ IS_S_INVERTED;
671 (* abc9_box, lib_whitebox *)
675 (* invertible_pin = "IS_C_INVERTED" *)
678 (* invertible_pin = "IS_CLR_INVERTED" *)
680 (* invertible_pin = "IS_D_INVERTED" *)
683 parameter [0:0] INIT = 1'b0;
684 parameter [0:0] IS_C_INVERTED = 1'b0;
685 parameter [0:0] IS_D_INVERTED = 1'b0;
686 parameter [0:0] IS_CLR_INVERTED = 1'b0;
689 case ({|IS_C_INVERTED, |IS_CLR_INVERTED})
690 2'b00: always @(posedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
691 2'b01: always @(posedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
692 2'b10: always @(negedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
693 2'b11: always @(negedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
697 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
698 $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
699 $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
700 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
701 $setup(CE , posedge C &&& !IS_C_INVERTED, 109);
702 $setup(CE , negedge C &&& IS_C_INVERTED, 109);
703 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
704 $setup(CLR, posedge C &&& !IS_C_INVERTED, 404);
705 $setup(CLR, negedge C &&& IS_C_INVERTED, 404);
706 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
708 if (!IS_CLR_INVERTED) (posedge CLR => (Q : 1'b0)) = 764;
709 if ( IS_CLR_INVERTED) (negedge CLR => (Q : 1'b0)) = 764;
711 if (IS_CLR_INVERTED != CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
712 // but for facilitating a bypass box, let's pretend it's
715 if (!IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
716 if ( IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
720 (* abc9_box, lib_whitebox *)
729 parameter [0:0] INIT = 1'b0;
731 always @(negedge C, posedge CLR) if (CLR) Q <= 1'b0; else if (CE) Q <= D;
733 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
734 $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
735 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
736 $setup(CE , negedge C, 109);
737 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
738 $setup(CLR, negedge C, 404);
739 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
741 (posedge CLR => (Q : 1'b0)) = 764;
743 if (CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
744 // but for facilitating a bypass box, let's pretend it's
747 if (!CLR && CE) (negedge C => (Q : D)) = 303;
751 (* abc9_box, lib_whitebox *)
755 (* invertible_pin = "IS_C_INVERTED" *)
758 (* invertible_pin = "IS_D_INVERTED" *)
760 (* invertible_pin = "IS_PRE_INVERTED" *)
763 parameter [0:0] INIT = 1'b1;
764 parameter [0:0] IS_C_INVERTED = 1'b0;
765 parameter [0:0] IS_D_INVERTED = 1'b0;
766 parameter [0:0] IS_PRE_INVERTED = 1'b0;
768 generate case ({|IS_C_INVERTED, |IS_PRE_INVERTED})
769 2'b00: always @(posedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
770 2'b01: always @(posedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
771 2'b10: always @(negedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
772 2'b11: always @(negedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
776 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
777 $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
778 $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
779 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
780 $setup(CE , posedge C &&& !IS_C_INVERTED, 109);
781 $setup(CE , negedge C &&& IS_C_INVERTED, 109);
782 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
783 $setup(PRE, posedge C &&& !IS_C_INVERTED, 404);
784 $setup(PRE, negedge C &&& IS_C_INVERTED, 404);
785 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
787 if (!IS_PRE_INVERTED) (posedge PRE => (Q : 1'b1)) = 764;
788 if ( IS_PRE_INVERTED) (negedge PRE => (Q : 1'b1)) = 764;
790 if (IS_PRE_INVERTED != PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
791 // but for facilitating a bypass box, let's pretend it's
794 if (!IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
795 if ( IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
799 (* abc9_box, lib_whitebox *)
808 parameter [0:0] INIT = 1'b1;
810 always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;
812 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
813 $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
814 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
815 $setup(CE , negedge C, 109);
816 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
817 $setup(PRE, negedge C, 404);
818 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
820 (posedge PRE => (Q : 1'b1)) = 764;
822 if (PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
823 // but for facilitating a bypass box, let's pretend it's
826 if (!PRE && CE) (negedge C => (Q : D)) = 303;
833 (* invertible_pin = "IS_C_INVERTED" *)
836 (* invertible_pin = "IS_CLR_INVERTED" *)
839 (* invertible_pin = "IS_PRE_INVERTED" *)
842 parameter [0:0] INIT = 1'b0;
843 parameter [0:0] IS_C_INVERTED = 1'b0;
844 parameter [0:0] IS_CLR_INVERTED = 1'b0;
845 parameter [0:0] IS_PRE_INVERTED = 1'b0;
846 wire c = C ^ IS_C_INVERTED;
847 wire clr = CLR ^ IS_CLR_INVERTED;
848 wire pre = PRE ^ IS_PRE_INVERTED;
849 // Hacky model to avoid simulation-synthesis mismatches.
854 always @(posedge c, posedge clr) begin
860 always @(posedge c, posedge pre) begin
872 assign Q = qs ? qp : qc;
878 (* invertible_pin = "IS_C_INVERTED" *)
881 (* invertible_pin = "IS_CLR_INVERTED" *)
884 (* invertible_pin = "IS_PRE_INVERTED" *)
887 parameter [0:0] INIT = 1'b0;
888 parameter [0:0] IS_C_INVERTED = 1'b0;
889 parameter [0:0] IS_CLR_INVERTED = 1'b0;
890 parameter [0:0] IS_PRE_INVERTED = 1'b0;
891 wire c = C ^ IS_C_INVERTED;
892 wire clr = CLR ^ IS_CLR_INVERTED;
893 wire pre = PRE ^ IS_PRE_INVERTED;
894 // Hacky model to avoid simulation-synthesis mismatches.
899 always @(negedge c, posedge clr) begin
905 always @(negedge c, posedge pre) begin
917 assign Q = qs ? qp : qc;
922 (* invertible_pin = "IS_CLR_INVERTED" *)
925 (* invertible_pin = "IS_G_INVERTED" *)
929 parameter [0:0] INIT = 1'b0;
930 parameter [0:0] IS_CLR_INVERTED = 1'b0;
931 parameter [0:0] IS_G_INVERTED = 1'b0;
932 parameter MSGON = "TRUE";
933 parameter XON = "TRUE";
935 wire clr = CLR ^ IS_CLR_INVERTED;
936 wire g = G ^ IS_G_INVERTED;
939 else if (GE && g) Q <= D;
945 (* invertible_pin = "IS_G_INVERTED" *)
948 (* invertible_pin = "IS_PRE_INVERTED" *)
951 parameter [0:0] INIT = 1'b1;
952 parameter [0:0] IS_G_INVERTED = 1'b0;
953 parameter [0:0] IS_PRE_INVERTED = 1'b0;
954 parameter MSGON = "TRUE";
955 parameter XON = "TRUE";
957 wire g = G ^ IS_G_INVERTED;
958 wire pre = PRE ^ IS_PRE_INVERTED;
961 else if (GE && g) Q <= D;
966 (* invertible_pin = "IS_CLR_INVERTED" *)
968 (* invertible_pin = "IS_D_INVERTED" *)
970 (* invertible_pin = "IS_G_INVERTED" *)
972 (* invertible_pin = "IS_GE_INVERTED" *)
974 (* invertible_pin = "IS_PRE_INVERTED" *)
977 parameter [0:0] INIT = 1'b1;
978 parameter [0:0] IS_CLR_INVERTED = 1'b0;
979 parameter [0:0] IS_D_INVERTED = 1'b0;
980 parameter [0:0] IS_G_INVERTED = 1'b0;
981 parameter [0:0] IS_GE_INVERTED = 1'b0;
982 parameter [0:0] IS_PRE_INVERTED = 1'b0;
984 wire d = D ^ IS_D_INVERTED;
985 wire g = G ^ IS_G_INVERTED;
986 wire ge = GE ^ IS_GE_INVERTED;
987 wire clr = CLR ^ IS_CLR_INVERTED;
988 wire pre = PRE ^ IS_PRE_INVERTED;
991 else if (pre) Q <= 1'b1;
992 else if (ge && g) Q <= d;
998 (* invertible_pin = "IS_SRI_INVERTED" *)
1001 parameter [0:0] IS_SRI_INVERTED = 1'b0;
1002 assign O = DI & ~(SRI ^ IS_SRI_INVERTED);
1008 (* invertible_pin = "IS_SRI_INVERTED" *)
1011 parameter [0:0] IS_SRI_INVERTED = 1'b0;
1012 assign O = DI | (SRI ^ IS_SRI_INVERTED);
1021 input A0, A1, A2, A3,
1024 (* invertible_pin = "IS_WCLK_INVERTED" *)
1028 parameter [15:0] INIT = 16'h0000;
1029 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1030 wire [3:0] a = {A3, A2, A1, A0};
1031 reg [15:0] mem = INIT;
1033 wire clk = WCLK ^ IS_WCLK_INVERTED;
1034 always @(posedge clk) if (WE) mem[a] <= D;
1039 input A0, A1, A2, A3,
1042 (* invertible_pin = "IS_WCLK_INVERTED" *)
1046 parameter [15:0] INIT = 16'h0000;
1047 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1048 wire [3:0] a = {A3, A2, A1, A0};
1049 reg [15:0] mem = INIT;
1051 wire clk = WCLK ^ IS_WCLK_INVERTED;
1052 always @(negedge clk) if (WE) mem[a] <= D;
1057 input A0, A1, A2, A3, A4,
1060 (* invertible_pin = "IS_WCLK_INVERTED" *)
1064 parameter [31:0] INIT = 32'h00000000;
1065 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1066 wire [4:0] a = {A4, A3, A2, A1, A0};
1067 reg [31:0] mem = INIT;
1069 wire clk = WCLK ^ IS_WCLK_INVERTED;
1070 always @(posedge clk) if (WE) mem[a] <= D;
1075 input A0, A1, A2, A3, A4,
1078 (* invertible_pin = "IS_WCLK_INVERTED" *)
1082 parameter [31:0] INIT = 32'h00000000;
1083 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1084 wire [4:0] a = {A4, A3, A2, A1, A0};
1085 reg [31:0] mem = INIT;
1087 wire clk = WCLK ^ IS_WCLK_INVERTED;
1088 always @(negedge clk) if (WE) mem[a] <= D;
1093 input A0, A1, A2, A3, A4, A5,
1096 (* invertible_pin = "IS_WCLK_INVERTED" *)
1100 parameter [63:0] INIT = 64'h0000000000000000;
1101 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1102 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1103 reg [63:0] mem = INIT;
1105 wire clk = WCLK ^ IS_WCLK_INVERTED;
1106 always @(posedge clk) if (WE) mem[a] <= D;
1111 input A0, A1, A2, A3, A4, A5,
1114 (* invertible_pin = "IS_WCLK_INVERTED" *)
1118 parameter [63:0] INIT = 64'h0000000000000000;
1119 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1120 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1121 reg [63:0] mem = INIT;
1123 wire clk = WCLK ^ IS_WCLK_INVERTED;
1124 always @(negedge clk) if (WE) mem[a] <= D;
1129 input A0, A1, A2, A3, A4, A5, A6,
1132 (* invertible_pin = "IS_WCLK_INVERTED" *)
1136 parameter [127:0] INIT = 128'h00000000000000000000000000000000;
1137 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1138 wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
1139 reg [127:0] mem = INIT;
1141 wire clk = WCLK ^ IS_WCLK_INVERTED;
1142 always @(posedge clk) if (WE) mem[a] <= D;
1145 module RAM128X1S_1 (
1147 input A0, A1, A2, A3, A4, A5, A6,
1150 (* invertible_pin = "IS_WCLK_INVERTED" *)
1154 parameter [127:0] INIT = 128'h00000000000000000000000000000000;
1155 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1156 wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
1157 reg [127:0] mem = INIT;
1159 wire clk = WCLK ^ IS_WCLK_INVERTED;
1160 always @(negedge clk) if (WE) mem[a] <= D;
1168 (* invertible_pin = "IS_WCLK_INVERTED" *)
1172 parameter [255:0] INIT = 256'h0;
1173 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1174 reg [255:0] mem = INIT;
1176 wire clk = WCLK ^ IS_WCLK_INVERTED;
1177 always @(posedge clk) if (WE) mem[A] <= D;
1185 (* invertible_pin = "IS_WCLK_INVERTED" *)
1189 parameter [511:0] INIT = 512'h0;
1190 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1191 reg [511:0] mem = INIT;
1193 wire clk = WCLK ^ IS_WCLK_INVERTED;
1194 always @(posedge clk) if (WE) mem[A] <= D;
1197 // Single port, wide.
1201 input A0, A1, A2, A3,
1204 (* invertible_pin = "IS_WCLK_INVERTED" *)
1208 parameter [15:0] INIT_00 = 16'h0000;
1209 parameter [15:0] INIT_01 = 16'h0000;
1210 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1211 wire [3:0] a = {A3, A2, A1, A0};
1212 wire clk = WCLK ^ IS_WCLK_INVERTED;
1213 reg [15:0] mem0 = INIT_00;
1214 reg [15:0] mem1 = INIT_01;
1215 assign O0 = mem0[a];
1216 assign O1 = mem1[a];
1217 always @(posedge clk)
1226 input A0, A1, A2, A3, A4,
1229 (* invertible_pin = "IS_WCLK_INVERTED" *)
1233 parameter [31:0] INIT_00 = 32'h00000000;
1234 parameter [31:0] INIT_01 = 32'h00000000;
1235 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1236 wire [4:0] a = {A4, A3, A2, A1, A0};
1237 wire clk = WCLK ^ IS_WCLK_INVERTED;
1238 reg [31:0] mem0 = INIT_00;
1239 reg [31:0] mem1 = INIT_01;
1240 assign O0 = mem0[a];
1241 assign O1 = mem1[a];
1242 always @(posedge clk)
1251 input A0, A1, A2, A3, A4, A5,
1254 (* invertible_pin = "IS_WCLK_INVERTED" *)
1258 parameter [63:0] INIT_00 = 64'h0000000000000000;
1259 parameter [63:0] INIT_01 = 64'h0000000000000000;
1260 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1261 wire [5:0] a = {A5, A3, A2, A1, A0};
1262 wire clk = WCLK ^ IS_WCLK_INVERTED;
1263 reg [63:0] mem0 = INIT_00;
1264 reg [63:0] mem1 = INIT_01;
1265 assign O0 = mem0[a];
1266 assign O1 = mem1[a];
1267 always @(posedge clk)
1275 output O0, O1, O2, O3,
1276 input A0, A1, A2, A3,
1277 input D0, D1, D2, D3,
1279 (* invertible_pin = "IS_WCLK_INVERTED" *)
1283 parameter [15:0] INIT_00 = 16'h0000;
1284 parameter [15:0] INIT_01 = 16'h0000;
1285 parameter [15:0] INIT_02 = 16'h0000;
1286 parameter [15:0] INIT_03 = 16'h0000;
1287 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1288 wire [3:0] a = {A3, A2, A1, A0};
1289 wire clk = WCLK ^ IS_WCLK_INVERTED;
1290 reg [15:0] mem0 = INIT_00;
1291 reg [15:0] mem1 = INIT_01;
1292 reg [15:0] mem2 = INIT_02;
1293 reg [15:0] mem3 = INIT_03;
1294 assign O0 = mem0[a];
1295 assign O1 = mem1[a];
1296 assign O2 = mem2[a];
1297 assign O3 = mem3[a];
1298 always @(posedge clk)
1308 output O0, O1, O2, O3,
1309 input A0, A1, A2, A3, A4,
1310 input D0, D1, D2, D3,
1312 (* invertible_pin = "IS_WCLK_INVERTED" *)
1316 parameter [31:0] INIT_00 = 32'h00000000;
1317 parameter [31:0] INIT_01 = 32'h00000000;
1318 parameter [31:0] INIT_02 = 32'h00000000;
1319 parameter [31:0] INIT_03 = 32'h00000000;
1320 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1321 wire [4:0] a = {A4, A3, A2, A1, A0};
1322 wire clk = WCLK ^ IS_WCLK_INVERTED;
1323 reg [31:0] mem0 = INIT_00;
1324 reg [31:0] mem1 = INIT_01;
1325 reg [31:0] mem2 = INIT_02;
1326 reg [31:0] mem3 = INIT_03;
1327 assign O0 = mem0[a];
1328 assign O1 = mem1[a];
1329 assign O2 = mem2[a];
1330 assign O3 = mem3[a];
1331 always @(posedge clk)
1342 input A0, A1, A2, A3,
1345 (* invertible_pin = "IS_WCLK_INVERTED" *)
1349 parameter [15:0] INIT_00 = 16'h0000;
1350 parameter [15:0] INIT_01 = 16'h0000;
1351 parameter [15:0] INIT_02 = 16'h0000;
1352 parameter [15:0] INIT_03 = 16'h0000;
1353 parameter [15:0] INIT_04 = 16'h0000;
1354 parameter [15:0] INIT_05 = 16'h0000;
1355 parameter [15:0] INIT_06 = 16'h0000;
1356 parameter [15:0] INIT_07 = 16'h0000;
1357 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1358 wire [3:0] a = {A3, A2, A1, A0};
1359 wire clk = WCLK ^ IS_WCLK_INVERTED;
1360 reg [15:0] mem0 = INIT_00;
1361 reg [15:0] mem1 = INIT_01;
1362 reg [15:0] mem2 = INIT_02;
1363 reg [15:0] mem3 = INIT_03;
1364 reg [15:0] mem4 = INIT_04;
1365 reg [15:0] mem5 = INIT_05;
1366 reg [15:0] mem6 = INIT_06;
1367 reg [15:0] mem7 = INIT_07;
1368 assign O[0] = mem0[a];
1369 assign O[1] = mem1[a];
1370 assign O[2] = mem2[a];
1371 assign O[3] = mem3[a];
1372 assign O[4] = mem4[a];
1373 assign O[5] = mem5[a];
1374 assign O[6] = mem6[a];
1375 assign O[7] = mem7[a];
1376 always @(posedge clk)
1391 input A0, A1, A2, A3, A4,
1394 (* invertible_pin = "IS_WCLK_INVERTED" *)
1398 parameter [31:0] INIT_00 = 32'h00000000;
1399 parameter [31:0] INIT_01 = 32'h00000000;
1400 parameter [31:0] INIT_02 = 32'h00000000;
1401 parameter [31:0] INIT_03 = 32'h00000000;
1402 parameter [31:0] INIT_04 = 32'h00000000;
1403 parameter [31:0] INIT_05 = 32'h00000000;
1404 parameter [31:0] INIT_06 = 32'h00000000;
1405 parameter [31:0] INIT_07 = 32'h00000000;
1406 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1407 wire [4:0] a = {A4, A3, A2, A1, A0};
1408 wire clk = WCLK ^ IS_WCLK_INVERTED;
1409 reg [31:0] mem0 = INIT_00;
1410 reg [31:0] mem1 = INIT_01;
1411 reg [31:0] mem2 = INIT_02;
1412 reg [31:0] mem3 = INIT_03;
1413 reg [31:0] mem4 = INIT_04;
1414 reg [31:0] mem5 = INIT_05;
1415 reg [31:0] mem6 = INIT_06;
1416 reg [31:0] mem7 = INIT_07;
1417 assign O[0] = mem0[a];
1418 assign O[1] = mem1[a];
1419 assign O[2] = mem2[a];
1420 assign O[3] = mem3[a];
1421 assign O[4] = mem4[a];
1422 assign O[5] = mem5[a];
1423 assign O[6] = mem6[a];
1424 assign O[7] = mem7[a];
1425 always @(posedge clk)
1444 (* invertible_pin = "IS_WCLK_INVERTED" *)
1447 input A0, A1, A2, A3,
1448 input DPRA0, DPRA1, DPRA2, DPRA3
1450 parameter INIT = 16'h0;
1451 parameter IS_WCLK_INVERTED = 1'b0;
1452 wire [3:0] a = {A3, A2, A1, A0};
1453 wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1454 reg [15:0] mem = INIT;
1455 assign SPO = mem[a];
1456 assign DPO = mem[dpra];
1457 wire clk = WCLK ^ IS_WCLK_INVERTED;
1458 always @(posedge clk) if (WE) mem[a] <= D;
1465 (* invertible_pin = "IS_WCLK_INVERTED" *)
1468 input A0, A1, A2, A3,
1469 input DPRA0, DPRA1, DPRA2, DPRA3
1471 parameter INIT = 16'h0;
1472 parameter IS_WCLK_INVERTED = 1'b0;
1473 wire [3:0] a = {A3, A2, A1, A0};
1474 wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1475 reg [15:0] mem = INIT;
1476 assign SPO = mem[a];
1477 assign DPO = mem[dpra];
1478 wire clk = WCLK ^ IS_WCLK_INVERTED;
1479 always @(negedge clk) if (WE) mem[a] <= D;
1482 (* abc9_box, lib_whitebox *)
1487 (* invertible_pin = "IS_WCLK_INVERTED" *)
1490 input A0, A1, A2, A3, A4,
1491 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1493 parameter INIT = 32'h0;
1494 parameter IS_WCLK_INVERTED = 1'b0;
1495 wire [4:0] a = {A4, A3, A2, A1, A0};
1496 wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1497 reg [31:0] mem = INIT;
1498 assign SPO = mem[a];
1499 assign DPO = mem[dpra];
1500 wire clk = WCLK ^ IS_WCLK_INVERTED;
1501 always @(posedge clk) if (WE) mem[a] <= D;
1503 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1504 $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1505 $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1506 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1507 $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1508 $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1509 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L800
1510 $setup(A0, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1511 $setup(A0, negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1512 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L798
1513 $setup(A1, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1514 $setup(A1, negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1515 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L796
1516 $setup(A2, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1517 $setup(A2, negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1518 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L794
1519 $setup(A3, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1520 $setup(A3, negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1521 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L792
1522 $setup(A4, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1523 $setup(A4, posedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1524 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1525 if (!IS_WCLK_INVERTED) (posedge WCLK => (SPO : D)) = 1153;
1526 if (!IS_WCLK_INVERTED) (posedge WCLK => (DPO : 1'bx)) = 1153;
1527 if ( IS_WCLK_INVERTED) (posedge WCLK => (SPO : D)) = 1153;
1528 if ( IS_WCLK_INVERTED) (negedge WCLK => (DPO : 1'bx)) = 1153;
1529 (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1530 (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1531 (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1532 (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1533 (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1537 (* abc9_box, lib_whitebox *)
1542 (* invertible_pin = "IS_WCLK_INVERTED" *)
1550 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1552 parameter INIT = 32'h0;
1553 parameter IS_WCLK_INVERTED = 1'b0;
1554 wire [4:0] a = {A4, A3, A2, A1, A0};
1555 wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1556 reg [31:0] mem = INIT;
1557 assign SPO = mem[a];
1558 assign DPO = mem[dpra];
1559 wire clk = WCLK ^ IS_WCLK_INVERTED;
1560 always @(negedge clk) if (WE) mem[a] <= D;
1562 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1563 $setup(D , negedge WCLK &&& WE, 453);
1564 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1565 $setup(WE, negedge WCLK, 654);
1566 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L800
1567 $setup(A0, negedge WCLK &&& WE, 245);
1568 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L798
1569 $setup(A1, negedge WCLK &&& WE, 208);
1570 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L796
1571 $setup(A2, negedge WCLK &&& WE, 147);
1572 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L794
1573 $setup(A3, negedge WCLK &&& WE, 68);
1574 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L792
1575 $setup(A4, negedge WCLK &&& WE, 66);
1576 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1577 if (WE) (negedge WCLK => (SPO : D)) = 1153;
1578 if (WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1579 (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1580 (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1581 (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1582 (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1583 (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1587 (* abc9_box, lib_whitebox *)
1592 (* invertible_pin = "IS_WCLK_INVERTED" *)
1595 input A0, A1, A2, A3, A4, A5,
1596 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1598 parameter INIT = 64'h0;
1599 parameter IS_WCLK_INVERTED = 1'b0;
1600 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1601 wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1602 reg [63:0] mem = INIT;
1603 assign SPO = mem[a];
1604 assign DPO = mem[dpra];
1605 wire clk = WCLK ^ IS_WCLK_INVERTED;
1606 always @(posedge clk) if (WE) mem[a] <= D;
1608 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1609 $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1610 $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1611 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1612 $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1613 $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1614 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L828
1615 $setup(A0, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1616 $setup(A0, negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1617 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L826
1618 $setup(A1, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1619 $setup(A1, negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1620 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L824
1621 $setup(A2, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1622 $setup(A2, negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1623 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L822
1624 $setup(A3, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1625 $setup(A3, negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1626 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L820
1627 $setup(A4, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1628 $setup(A4, negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1629 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818
1630 $setup(A5, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1631 $setup(A5, negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1632 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1633 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (SPO : D)) = 1153;
1634 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DPO : 1'bx)) = 1153;
1635 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (SPO : D)) = 1153;
1636 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1637 (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1638 (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1639 (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1640 (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1641 (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1642 (A5 => SPO) = 127; (DPRA5 => DPO) = 127;
1650 (* invertible_pin = "IS_WCLK_INVERTED" *)
1653 input A0, A1, A2, A3, A4, A5,
1654 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1656 parameter INIT = 64'h0;
1657 parameter IS_WCLK_INVERTED = 1'b0;
1658 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1659 wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1660 reg [63:0] mem = INIT;
1661 assign SPO = mem[a];
1662 assign DPO = mem[dpra];
1663 wire clk = WCLK ^ IS_WCLK_INVERTED;
1664 always @(negedge clk) if (WE) mem[a] <= D;
1666 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1667 $setup(D , negedge WCLK &&& WE, 453);
1668 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1669 $setup(WE, negedge WCLK, 654);
1670 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L828
1671 $setup(A0, negedge WCLK &&& WE, 362);
1672 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L826
1673 $setup(A1, negedge WCLK &&& WE, 245);
1674 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L824
1675 $setup(A2, negedge WCLK &&& WE, 208);
1676 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L822
1677 $setup(A3, negedge WCLK &&& WE, 147);
1678 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L820
1679 $setup(A4, negedge WCLK &&& WE, 68);
1680 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818
1681 $setup(A5, negedge WCLK &&& WE, 66);
1682 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1683 if (WE) (negedge WCLK => (SPO : D)) = 1153;
1684 if (WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1685 (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1686 (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1687 (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1688 (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1689 (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1690 (A5 => SPO) = 127; (DPRA5 => DPO) = 127;
1694 (* abc9_box, lib_whitebox *)
1699 (* invertible_pin = "IS_WCLK_INVERTED" *)
1705 parameter INIT = 128'h0;
1706 parameter IS_WCLK_INVERTED = 1'b0;
1707 reg [127:0] mem = INIT;
1708 assign SPO = mem[A];
1709 assign DPO = mem[DPRA];
1710 wire clk = WCLK ^ IS_WCLK_INVERTED;
1711 always @(posedge clk) if (WE) mem[A] <= D;
1713 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1714 $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1715 $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1716 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1717 $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1718 $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1719 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818-830
1720 $setup(A[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 616);
1721 $setup(A[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 616);
1722 $setup(A[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1723 $setup(A[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1724 $setup(A[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1725 $setup(A[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1726 $setup(A[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1727 $setup(A[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1728 $setup(A[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1729 $setup(A[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1730 $setup(A[5], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1731 $setup(A[5], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1732 $setup(A[6], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1733 $setup(A[6], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1735 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1736 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (SPO : D)) = 1153 + 217 /* to cross F7AMUX */ + 175 /* AMUX */;
1737 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DPO : 1'bx)) = 1153 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
1738 (A[0] => SPO) = 642 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1739 (A[1] => SPO) = 631 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1740 (A[2] => SPO) = 472 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1741 (A[3] => SPO) = 407 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1742 (A[4] => SPO) = 238 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1743 (A[5] => SPO) = 127 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1744 (A[6] => SPO) = 0 + 276 /* to select F7AMUX */ + 175 /* AMUX */;
1745 (DPRA[0] => DPO) = 642 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1746 (DPRA[1] => DPO) = 631 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1747 (DPRA[2] => DPO) = 472 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1748 (DPRA[3] => DPO) = 407 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1749 (DPRA[4] => DPO) = 238 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1750 (DPRA[5] => DPO) = 127 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1751 (DPRA[6] => DPO) = 0 + 296 /* to select MUXF7 */ + 174 /* CMUX */;
1760 (* invertible_pin = "IS_WCLK_INVERTED" *)
1765 parameter INIT = 256'h0;
1766 parameter IS_WCLK_INVERTED = 1'b0;
1767 reg [255:0] mem = INIT;
1768 assign SPO = mem[A];
1769 assign DPO = mem[DPRA];
1770 wire clk = WCLK ^ IS_WCLK_INVERTED;
1771 always @(posedge clk) if (WE) mem[A] <= D;
1776 (* abc9_box, lib_whitebox *)
1782 input [4:0] ADDRA, ADDRB, ADDRC,
1789 (* invertible_pin = "IS_WCLK_INVERTED" *)
1793 parameter [63:0] INIT_A = 64'h0000000000000000;
1794 parameter [63:0] INIT_B = 64'h0000000000000000;
1795 parameter [63:0] INIT_C = 64'h0000000000000000;
1796 parameter [63:0] INIT_D = 64'h0000000000000000;
1797 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1798 reg [63:0] mem_a = INIT_A;
1799 reg [63:0] mem_b = INIT_B;
1800 reg [63:0] mem_c = INIT_C;
1801 reg [63:0] mem_d = INIT_D;
1802 assign DOA = mem_a[2*ADDRA+:2];
1803 assign DOB = mem_b[2*ADDRB+:2];
1804 assign DOC = mem_c[2*ADDRC+:2];
1805 assign DOD = mem_d[2*ADDRD+:2];
1806 wire clk = WCLK ^ IS_WCLK_INVERTED;
1807 always @(posedge clk)
1809 mem_a[2*ADDRD+:2] <= DIA;
1810 mem_b[2*ADDRD+:2] <= DIB;
1811 mem_c[2*ADDRD+:2] <= DIC;
1812 mem_d[2*ADDRD+:2] <= DID;
1815 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1816 $setup(ADDRD[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1817 $setup(ADDRD[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1818 $setup(ADDRD[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1819 $setup(ADDRD[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1820 $setup(ADDRD[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1821 $setup(ADDRD[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1822 $setup(ADDRD[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1823 $setup(ADDRD[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1824 $setup(ADDRD[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1825 $setup(ADDRD[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1826 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986-L988
1827 $setup(DIA[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1828 $setup(DIA[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1829 $setup(DIA[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 384);
1830 $setup(DIA[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 384);
1831 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1054-L1056
1832 $setup(DIB[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 461);
1833 $setup(DIB[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 461);
1834 $setup(DIB[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 354);
1835 $setup(DIB[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 354);
1836 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1122-L1124
1837 $setup(DIC[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 457);
1838 $setup(DIC[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 457);
1839 $setup(DIC[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 375);
1840 $setup(DIC[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 375);
1841 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1190-L1192
1842 $setup(DID[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 310);
1843 $setup(DID[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 310);
1844 $setup(DID[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 334);
1845 $setup(DID[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 334);
1846 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1847 $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1848 $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1849 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L889
1850 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA[0] : DIA[0])) = 1153;
1851 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA[0] : DIA[0])) = 1153;
1852 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L857
1853 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA[1] : DIA[1])) = 1188;
1854 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA[1] : DIA[1])) = 1188;
1855 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1856 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB[0] : DIB[0])) = 1161;
1857 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB[0] : DIB[0])) = 1161;
1858 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L925
1859 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB[1] : DIB[1])) = 1187;
1860 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB[1] : DIB[1])) = 1187;
1861 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L993
1862 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC[0] : DIC[0])) = 1158;
1863 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC[0] : DIC[0])) = 1158;
1864 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1025
1865 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC[1] : DIC[1])) = 1180;
1866 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC[1] : DIC[1])) = 1180;
1867 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1093
1868 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD[0] : DID[0])) = 1163;
1869 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD[0] : DID[0])) = 1163;
1870 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1061
1871 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD[1] : DID[1])) = 1190;
1872 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD[1] : DID[1])) = 1190;
1873 (ADDRA[0] *> DOA) = 642; (ADDRB[0] *> DOB) = 642; (ADDRC[0] *> DOC) = 642; (ADDRD[0] *> DOD) = 642;
1874 (ADDRA[1] *> DOA) = 631; (ADDRB[1] *> DOB) = 631; (ADDRC[1] *> DOC) = 631; (ADDRD[1] *> DOD) = 631;
1875 (ADDRA[2] *> DOA) = 472; (ADDRB[2] *> DOB) = 472; (ADDRC[2] *> DOC) = 472; (ADDRD[2] *> DOD) = 472;
1876 (ADDRA[3] *> DOA) = 407; (ADDRB[3] *> DOB) = 407; (ADDRC[3] *> DOC) = 407; (ADDRD[3] *> DOD) = 407;
1877 (ADDRA[4] *> DOA) = 238; (ADDRB[4] *> DOB) = 238; (ADDRC[4] *> DOC) = 238; (ADDRD[4] *> DOD) = 238;
1907 (* invertible_pin = "IS_WCLK_INVERTED" *)
1911 parameter [63:0] INIT_A = 64'h0000000000000000;
1912 parameter [63:0] INIT_B = 64'h0000000000000000;
1913 parameter [63:0] INIT_C = 64'h0000000000000000;
1914 parameter [63:0] INIT_D = 64'h0000000000000000;
1915 parameter [63:0] INIT_E = 64'h0000000000000000;
1916 parameter [63:0] INIT_F = 64'h0000000000000000;
1917 parameter [63:0] INIT_G = 64'h0000000000000000;
1918 parameter [63:0] INIT_H = 64'h0000000000000000;
1919 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1920 reg [63:0] mem_a = INIT_A;
1921 reg [63:0] mem_b = INIT_B;
1922 reg [63:0] mem_c = INIT_C;
1923 reg [63:0] mem_d = INIT_D;
1924 reg [63:0] mem_e = INIT_E;
1925 reg [63:0] mem_f = INIT_F;
1926 reg [63:0] mem_g = INIT_G;
1927 reg [63:0] mem_h = INIT_H;
1928 assign DOA = mem_a[2*ADDRA+:2];
1929 assign DOB = mem_b[2*ADDRB+:2];
1930 assign DOC = mem_c[2*ADDRC+:2];
1931 assign DOD = mem_d[2*ADDRD+:2];
1932 assign DOE = mem_e[2*ADDRE+:2];
1933 assign DOF = mem_f[2*ADDRF+:2];
1934 assign DOG = mem_g[2*ADDRG+:2];
1935 assign DOH = mem_h[2*ADDRH+:2];
1936 wire clk = WCLK ^ IS_WCLK_INVERTED;
1937 always @(posedge clk)
1939 mem_a[2*ADDRH+:2] <= DIA;
1940 mem_b[2*ADDRH+:2] <= DIB;
1941 mem_c[2*ADDRH+:2] <= DIC;
1942 mem_d[2*ADDRH+:2] <= DID;
1943 mem_e[2*ADDRH+:2] <= DIE;
1944 mem_f[2*ADDRH+:2] <= DIF;
1945 mem_g[2*ADDRH+:2] <= DIG;
1946 mem_h[2*ADDRH+:2] <= DIH;
1950 (* abc9_box, lib_whitebox *)
1956 input [5:0] ADDRA, ADDRB, ADDRC,
1963 (* invertible_pin = "IS_WCLK_INVERTED" *)
1967 parameter [63:0] INIT_A = 64'h0000000000000000;
1968 parameter [63:0] INIT_B = 64'h0000000000000000;
1969 parameter [63:0] INIT_C = 64'h0000000000000000;
1970 parameter [63:0] INIT_D = 64'h0000000000000000;
1971 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1972 reg [63:0] mem_a = INIT_A;
1973 reg [63:0] mem_b = INIT_B;
1974 reg [63:0] mem_c = INIT_C;
1975 reg [63:0] mem_d = INIT_D;
1976 assign DOA = mem_a[ADDRA];
1977 assign DOB = mem_b[ADDRB];
1978 assign DOC = mem_c[ADDRC];
1979 assign DOD = mem_d[ADDRD];
1980 wire clk = WCLK ^ IS_WCLK_INVERTED;
1981 always @(posedge clk)
1983 mem_a[ADDRD] <= DIA;
1984 mem_b[ADDRD] <= DIB;
1985 mem_c[ADDRD] <= DIC;
1986 mem_d[ADDRD] <= DID;
1989 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818-L830
1990 $setup(ADDRD[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1991 $setup(ADDRD[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1992 $setup(ADDRD[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1993 $setup(ADDRD[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1994 $setup(ADDRD[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1995 $setup(ADDRD[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1996 $setup(ADDRD[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1997 $setup(ADDRD[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1998 $setup(ADDRD[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1999 $setup(ADDRD[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
2000 $setup(ADDRD[5], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
2001 $setup(ADDRD[5], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
2002 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986-L988
2003 $setup(DIA, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 384);
2004 $setup(DIA, negedge WCLK &&& IS_WCLK_INVERTED && WE, 384);
2005 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1054-L1056
2006 $setup(DIB, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 354);
2007 $setup(DIB, negedge WCLK &&& IS_WCLK_INVERTED && WE, 354);
2008 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1122-L1124
2009 $setup(DIC, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 375);
2010 $setup(DIC, negedge WCLK &&& IS_WCLK_INVERTED && WE, 375);
2011 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1190-L1192
2012 $setup(DID, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 310);
2013 $setup(DID, negedge WCLK &&& IS_WCLK_INVERTED && WE, 310);
2014 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
2015 $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 654);
2016 $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED && WE, 654);
2017 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L889
2018 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA : DIA)) = 1153;
2019 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA : DIA)) = 1153;
2020 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
2021 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB : DIB)) = 1161;
2022 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB : DIB)) = 1161;
2023 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1025
2024 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC : DIC)) = 1158;
2025 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC : DIC)) = 1158;
2026 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1093
2027 if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD : DID)) = 1163;
2028 if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD : DID)) = 1163;
2029 (ADDRA[0] => DOA) = 642; (ADDRB[0] => DOB) = 642; (ADDRC[0] => DOC) = 642; (ADDRD[0] => DOD) = 642;
2030 (ADDRA[1] => DOA) = 631; (ADDRB[1] => DOB) = 631; (ADDRC[1] => DOC) = 631; (ADDRD[1] => DOD) = 631;
2031 (ADDRA[2] => DOA) = 472; (ADDRB[2] => DOB) = 472; (ADDRC[2] => DOC) = 472; (ADDRD[2] => DOD) = 472;
2032 (ADDRA[3] => DOA) = 407; (ADDRB[3] => DOB) = 407; (ADDRC[3] => DOC) = 407; (ADDRD[3] => DOD) = 407;
2033 (ADDRA[4] => DOA) = 238; (ADDRB[4] => DOB) = 238; (ADDRC[4] => DOC) = 238; (ADDRD[4] => DOD) = 238;
2063 (* invertible_pin = "IS_WCLK_INVERTED" *)
2067 parameter [63:0] INIT_A = 64'h0000000000000000;
2068 parameter [63:0] INIT_B = 64'h0000000000000000;
2069 parameter [63:0] INIT_C = 64'h0000000000000000;
2070 parameter [63:0] INIT_D = 64'h0000000000000000;
2071 parameter [63:0] INIT_E = 64'h0000000000000000;
2072 parameter [63:0] INIT_F = 64'h0000000000000000;
2073 parameter [63:0] INIT_G = 64'h0000000000000000;
2074 parameter [63:0] INIT_H = 64'h0000000000000000;
2075 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2076 reg [63:0] mem_a = INIT_A;
2077 reg [63:0] mem_b = INIT_B;
2078 reg [63:0] mem_c = INIT_C;
2079 reg [63:0] mem_d = INIT_D;
2080 reg [63:0] mem_e = INIT_E;
2081 reg [63:0] mem_f = INIT_F;
2082 reg [63:0] mem_g = INIT_G;
2083 reg [63:0] mem_h = INIT_H;
2084 assign DOA = mem_a[ADDRA];
2085 assign DOB = mem_b[ADDRB];
2086 assign DOC = mem_c[ADDRC];
2087 assign DOD = mem_d[ADDRD];
2088 assign DOE = mem_e[ADDRE];
2089 assign DOF = mem_f[ADDRF];
2090 assign DOG = mem_g[ADDRG];
2091 assign DOH = mem_h[ADDRH];
2092 wire clk = WCLK ^ IS_WCLK_INVERTED;
2093 always @(posedge clk)
2095 mem_a[ADDRH] <= DIA;
2096 mem_b[ADDRH] <= DIB;
2097 mem_c[ADDRH] <= DIC;
2098 mem_d[ADDRH] <= DID;
2099 mem_e[ADDRH] <= DIE;
2100 mem_f[ADDRH] <= DIF;
2101 mem_g[ADDRH] <= DIG;
2102 mem_h[ADDRH] <= DIH;
2106 module RAM32X16DR8 (
2115 input [5:0] ADDRA, ADDRB, ADDRC, ADDRD, ADDRE, ADDRF, ADDRG,
2126 (* invertible_pin = "IS_WCLK_INVERTED" *)
2130 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2131 reg [63:0] mem_a, mem_b, mem_c, mem_d, mem_e, mem_f, mem_g, mem_h;
2132 assign DOA = mem_a[ADDRA];
2133 assign DOB = mem_b[ADDRB];
2134 assign DOC = mem_c[ADDRC];
2135 assign DOD = mem_d[ADDRD];
2136 assign DOE = mem_e[ADDRE];
2137 assign DOF = mem_f[ADDRF];
2138 assign DOG = mem_g[ADDRG];
2139 assign DOH = mem_h[2*ADDRH+:2];
2140 wire clk = WCLK ^ IS_WCLK_INVERTED;
2141 always @(posedge clk)
2143 mem_a[2*ADDRH+:2] <= DIA;
2144 mem_b[2*ADDRH+:2] <= DIB;
2145 mem_c[2*ADDRH+:2] <= DIC;
2146 mem_d[2*ADDRH+:2] <= DID;
2147 mem_e[2*ADDRH+:2] <= DIE;
2148 mem_f[2*ADDRH+:2] <= DIF;
2149 mem_g[2*ADDRH+:2] <= DIG;
2150 mem_h[2*ADDRH+:2] <= DIH;
2159 (* invertible_pin = "IS_WCLK_INVERTED" *)
2164 parameter [63:0] INIT_A = 64'h0000000000000000;
2165 parameter [63:0] INIT_B = 64'h0000000000000000;
2166 parameter [63:0] INIT_C = 64'h0000000000000000;
2167 parameter [63:0] INIT_D = 64'h0000000000000000;
2168 parameter [63:0] INIT_E = 64'h0000000000000000;
2169 parameter [63:0] INIT_F = 64'h0000000000000000;
2170 parameter [63:0] INIT_G = 64'h0000000000000000;
2171 parameter [63:0] INIT_H = 64'h0000000000000000;
2172 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2173 reg [63:0] mem_a = INIT_A;
2174 reg [63:0] mem_b = INIT_B;
2175 reg [63:0] mem_c = INIT_C;
2176 reg [63:0] mem_d = INIT_D;
2177 reg [63:0] mem_e = INIT_E;
2178 reg [63:0] mem_f = INIT_F;
2179 reg [63:0] mem_g = INIT_G;
2180 reg [63:0] mem_h = INIT_H;
2181 assign O[7] = mem_a[A];
2182 assign O[6] = mem_b[A];
2183 assign O[5] = mem_c[A];
2184 assign O[4] = mem_d[A];
2185 assign O[3] = mem_e[A];
2186 assign O[2] = mem_f[A];
2187 assign O[1] = mem_g[A];
2188 assign O[0] = mem_h[A];
2189 wire clk = WCLK ^ IS_WCLK_INVERTED;
2190 always @(posedge clk)
2193 3'b111: mem_a[A] <= D;
2194 3'b110: mem_b[A] <= D;
2195 3'b101: mem_c[A] <= D;
2196 3'b100: mem_d[A] <= D;
2197 3'b011: mem_e[A] <= D;
2198 3'b010: mem_f[A] <= D;
2199 3'b001: mem_g[A] <= D;
2200 3'b000: mem_h[A] <= D;
2209 input A0, A1, A2, A3
2211 parameter [15:0] INIT = 16'h0;
2212 assign O = INIT[{A3, A2, A1, A0}];
2217 input A0, A1, A2, A3, A4
2219 parameter [31:0] INIT = 32'h0;
2220 assign O = INIT[{A4, A3, A2, A1, A0}];
2225 input A0, A1, A2, A3, A4, A5
2227 parameter [63:0] INIT = 64'h0;
2228 assign O = INIT[{A5, A4, A3, A2, A1, A0}];
2233 input A0, A1, A2, A3, A4, A5, A6
2235 parameter [127:0] INIT = 128'h0;
2236 assign O = INIT[{A6, A5, A4, A3, A2, A1, A0}];
2241 input A0, A1, A2, A3, A4, A5, A6, A7
2243 parameter [255:0] INIT = 256'h0;
2244 assign O = INIT[{A7, A6, A5, A4, A3, A2, A1, A0}];
2249 (* abc9_box, lib_whitebox *)
2252 input A0, A1, A2, A3,
2257 parameter [15:0] INIT = 16'h0000;
2259 reg [15:0] r = INIT;
2260 assign Q = r[{A3,A2,A1,A0}];
2261 always @(posedge CLK) r <= { r[14:0], D };
2264 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2265 (posedge CLK => (Q : 1'bx)) = 1472;
2266 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2267 $setup(D , posedge CLK, 173);
2275 (* abc9_box, lib_whitebox *)
2278 input A0, A1, A2, A3, CE,
2280 (* invertible_pin = "IS_CLK_INVERTED" *)
2284 parameter [15:0] INIT = 16'h0000;
2285 parameter [0:0] IS_CLK_INVERTED = 1'b0;
2287 reg [15:0] r = INIT;
2288 assign Q = r[{A3,A2,A1,A0}];
2290 if (IS_CLK_INVERTED) begin
2291 always @(negedge CLK) if (CE) r <= { r[14:0], D };
2294 always @(posedge CLK) if (CE) r <= { r[14:0], D };
2297 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2298 $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2299 $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2300 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2301 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : D)) = 1472;
2302 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : D)) = 1472;
2303 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2304 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : 1'bx)) = 1472;
2305 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : 1'bx)) = 1472;
2313 (* abc9_box, lib_whitebox *)
2317 input A0, A1, A2, A3,
2322 parameter [15:0] INIT = 16'h0000;
2324 reg [15:0] r = INIT;
2326 assign Q = r[{A3,A2,A1,A0}];
2327 always @(posedge CLK) r <= { r[14:0], D };
2330 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2331 $setup(D , posedge CLK, 173);
2332 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2333 (posedge CLK => (Q : 1'bx)) = 1472;
2334 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2335 (posedge CLK => (Q15 : 1'bx)) = 1114;
2343 (* abc9_box, lib_whitebox *)
2347 input A0, A1, A2, A3, CE,
2349 (* invertible_pin = "IS_CLK_INVERTED" *)
2353 parameter [15:0] INIT = 16'h0000;
2354 parameter [0:0] IS_CLK_INVERTED = 1'b0;
2356 reg [15:0] r = INIT;
2358 assign Q = r[{A3,A2,A1,A0}];
2360 if (IS_CLK_INVERTED) begin
2361 always @(negedge CLK) if (CE) r <= { r[14:0], D };
2364 always @(posedge CLK) if (CE) r <= { r[14:0], D };
2367 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2368 $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2369 $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2370 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
2371 $setup(CE, posedge CLK &&& !IS_CLK_INVERTED, 109);
2372 $setup(CE, negedge CLK &&& IS_CLK_INVERTED, 109);
2373 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2374 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : D)) = 1472;
2375 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : D)) = 1472;
2376 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2377 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q15 : 1'bx)) = 1114;
2378 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q15 : 1'bx)) = 1114;
2386 (* abc9_box, lib_whitebox *)
2393 (* invertible_pin = "IS_CLK_INVERTED" *)
2397 parameter [31:0] INIT = 32'h00000000;
2398 parameter [0:0] IS_CLK_INVERTED = 1'b0;
2400 reg [31:0] r = INIT;
2404 if (IS_CLK_INVERTED) begin
2405 always @(negedge CLK) if (CE) r <= { r[30:0], D };
2408 always @(posedge CLK) if (CE) r <= { r[30:0], D };
2411 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2412 $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2413 $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2414 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
2415 $setup(CE, posedge CLK &&& !IS_CLK_INVERTED, 109);
2416 $setup(CE, negedge CLK &&& IS_CLK_INVERTED, 109);
2417 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2418 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : 1'bx)) = 1472;
2419 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : 1'bx)) = 1472;
2420 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2421 if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q31 : 1'bx)) = 1114;
2422 if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q31 : 1'bx)) = 1114;
2443 (* invertible_pin = "IS_CLK_INVERTED" *)
2446 parameter [31:0] INIT = 32'h00000000;
2447 parameter [0:0] IS_CLK_INVERTED = 1'b0;
2448 wire clk = CLK ^ IS_CLK_INVERTED;
2449 reg [31:0] r = INIT;
2451 assign O5 = r[{1'b0, I3, I2, I1, I0}];
2452 assign O6 = r[{I4, I3, I2, I1, I0}];
2453 always @(posedge clk) if (CE) r <= {r[30:0], CDI};
2458 // Virtex 2, Virtex 2 Pro, Spartan 3.
2460 // Asynchronous mode.
2463 input signed [17:0] A,
2464 input signed [17:0] B,
2465 output signed [35:0] P
2472 // Synchronous mode.
2475 input signed [17:0] A,
2476 input signed [17:0] B,
2477 output reg signed [35:0] P,
2492 // Spartan 3E, Spartan 3A.
2494 module MULT18X18SIO (
2495 input signed [17:0] A,
2496 input signed [17:0] B,
2497 output signed [35:0] P,
2506 input signed [17:0] BCIN,
2507 output signed [17:0] BCOUT
2510 parameter integer AREG = 1;
2511 parameter integer BREG = 1;
2512 parameter B_INPUT = "DIRECT";
2513 parameter integer PREG = 1;
2516 wire signed [35:0] P_MULT;
2517 wire signed [17:0] A_MULT;
2518 wire signed [17:0] B_MULT;
2519 assign P_MULT = A_MULT * B_MULT;
2521 // The cascade output.
2522 assign BCOUT = B_MULT;
2524 // The B input multiplexer.
2525 wire signed [17:0] B_MUX;
2526 assign B_MUX = (B_INPUT == "DIRECT") ? B : BCIN;
2529 reg signed [17:0] A_REG;
2530 reg signed [17:0] B_REG;
2531 reg signed [35:0] P_REG;
2539 always @(posedge CLK) begin
2556 // The register enables.
2557 assign A_MULT = (AREG == 1) ? A_REG : A;
2558 assign B_MULT = (BREG == 1) ? B_REG : B_MUX;
2559 assign P = (PREG == 1) ? P_REG : P_MULT;
2566 input signed [17:0] A,
2567 input signed [17:0] B,
2568 input signed [47:0] C,
2569 input signed [17:0] D,
2570 input signed [47:0] PCIN,
2573 output signed [47:0] P,
2574 output signed [17:0] BCOUT,
2575 output signed [47:0] PCOUT,
2597 parameter integer A0REG = 0;
2598 parameter integer A1REG = 1;
2599 parameter integer B0REG = 0;
2600 parameter integer B1REG = 1;
2601 parameter integer CREG = 1;
2602 parameter integer DREG = 1;
2603 parameter integer MREG = 1;
2604 parameter integer CARRYINREG = 1;
2605 parameter integer OPMODEREG = 1;
2606 parameter integer PREG = 1;
2607 parameter CARRYINSEL = "CARRYIN";
2608 parameter RSTTYPE = "SYNC";
2610 // This is a strict subset of Spartan 6 -- reuse its model.
2612 /* verilator lint_off PINMISSING */
2621 .CARRYINREG(CARRYINREG),
2623 .OPMODEREG(OPMODEREG),
2625 .CARRYINSEL(CARRYINSEL),
2639 .CARRYOUT(CARRYOUT),
2640 // CARRYOUTF unconnected
2647 .CECARRYIN(CECARRYIN),
2648 .CEOPMODE(CEOPMODE),
2655 .RSTCARRYIN(RSTCARRYIN),
2656 .RSTOPMODE(RSTOPMODE),
2659 /* verilator lint_on PINMISSING */
2666 input signed [17:0] A,
2667 input signed [17:0] B,
2668 input signed [47:0] C,
2669 input signed [17:0] D,
2670 input signed [47:0] PCIN,
2673 output signed [35:0] M,
2674 output signed [47:0] P,
2675 output signed [17:0] BCOUT,
2676 output signed [47:0] PCOUT,
2699 parameter integer A0REG = 0;
2700 parameter integer A1REG = 1;
2701 parameter integer B0REG = 0;
2702 parameter integer B1REG = 1;
2703 parameter integer CREG = 1;
2704 parameter integer DREG = 1;
2705 parameter integer MREG = 1;
2706 parameter integer CARRYINREG = 1;
2707 parameter integer CARRYOUTREG = 1;
2708 parameter integer OPMODEREG = 1;
2709 parameter integer PREG = 1;
2710 parameter CARRYINSEL = "OPMODE5";
2711 parameter RSTTYPE = "SYNC";
2713 wire signed [35:0] M_MULT;
2714 wire signed [47:0] P_IN;
2715 wire signed [17:0] A0_OUT;
2716 wire signed [17:0] B0_OUT;
2717 wire signed [17:0] A1_OUT;
2718 wire signed [17:0] B1_OUT;
2719 wire signed [17:0] B1_IN;
2720 wire signed [47:0] C_OUT;
2721 wire signed [17:0] D_OUT;
2722 wire signed [7:0] OPMODE_OUT;
2726 reg signed [47:0] XMUX;
2727 reg signed [47:0] ZMUX;
2730 reg signed [17:0] A0_REG;
2731 reg signed [17:0] A1_REG;
2732 reg signed [17:0] B0_REG;
2733 reg signed [17:0] B1_REG;
2734 reg signed [47:0] C_REG;
2735 reg signed [17:0] D_REG;
2736 reg signed [35:0] M_REG;
2737 reg signed [47:0] P_REG;
2738 reg [7:0] OPMODE_REG;
2758 if (RSTTYPE == "SYNC") begin
2759 always @(posedge CLK) begin
2763 end else if (CEA) begin
2769 always @(posedge CLK) begin
2773 end else if (CEB) begin
2779 always @(posedge CLK) begin
2782 end else if (CEC) begin
2787 always @(posedge CLK) begin
2790 end else if (CED) begin
2795 always @(posedge CLK) begin
2798 end else if (CEM) begin
2803 always @(posedge CLK) begin
2806 end else if (CEP) begin
2811 always @(posedge CLK) begin
2812 if (RSTOPMODE) begin
2814 end else if (CEOPMODE) begin
2815 OPMODE_REG <= OPMODE;
2819 always @(posedge CLK) begin
2820 if (RSTCARRYIN) begin
2823 end else if (CECARRYIN) begin
2824 CARRYIN_REG <= CARRYIN_IN;
2825 CARRYOUT_REG <= CARRYOUT_IN;
2829 always @(posedge CLK, posedge RSTA) begin
2833 end else if (CEA) begin
2839 always @(posedge CLK, posedge RSTB) begin
2843 end else if (CEB) begin
2849 always @(posedge CLK, posedge RSTC) begin
2852 end else if (CEC) begin
2857 always @(posedge CLK, posedge RSTD) begin
2860 end else if (CED) begin
2865 always @(posedge CLK, posedge RSTM) begin
2868 end else if (CEM) begin
2873 always @(posedge CLK, posedge RSTP) begin
2876 end else if (CEP) begin
2881 always @(posedge CLK, posedge RSTOPMODE) begin
2882 if (RSTOPMODE) begin
2884 end else if (CEOPMODE) begin
2885 OPMODE_REG <= OPMODE;
2889 always @(posedge CLK, posedge RSTCARRYIN) begin
2890 if (RSTCARRYIN) begin
2893 end else if (CECARRYIN) begin
2894 CARRYIN_REG <= CARRYIN_IN;
2895 CARRYOUT_REG <= CARRYOUT_IN;
2902 // The register enables.
2903 assign A0_OUT = (A0REG == 1) ? A0_REG : A;
2904 assign A1_OUT = (A1REG == 1) ? A1_REG : A0_OUT;
2905 assign B0_OUT = (B0REG == 1) ? B0_REG : B;
2906 assign B1_OUT = (B1REG == 1) ? B1_REG : B1_IN;
2907 assign C_OUT = (CREG == 1) ? C_REG : C;
2908 assign D_OUT = (DREG == 1) ? D_REG : D;
2909 assign M = (MREG == 1) ? M_REG : M_MULT;
2910 assign P = (PREG == 1) ? P_REG : P_IN;
2911 assign OPMODE_OUT = (OPMODEREG == 1) ? OPMODE_REG : OPMODE;
2912 assign CARRYIN_OUT = (CARRYINREG == 1) ? CARRYIN_REG : CARRYIN_IN;
2913 assign CARRYOUT = (CARRYOUTREG == 1) ? CARRYOUT_REG : CARRYOUT_IN;
2914 assign CARRYOUTF = CARRYOUT;
2917 wire signed [17:0] PREADDER;
2918 assign B1_IN = OPMODE_OUT[4] ? PREADDER : B0_OUT;
2919 assign PREADDER = OPMODE_OUT[6] ? D_OUT - B0_OUT : D_OUT + B0_OUT;
2922 assign M_MULT = A1_OUT * B1_OUT;
2924 // The carry in selection.
2925 assign CARRYIN_IN = (CARRYINSEL == "OPMODE5") ? OPMODE_OUT[5] : CARRYIN;
2927 // The post-adder inputs.
2929 case (OPMODE_OUT[1:0])
2933 2'b11: XMUX <= {D_OUT[11:0], A1_OUT, B1_OUT};
2934 default: XMUX <= 48'hxxxxxxxxxxxx;
2939 case (OPMODE_OUT[3:2])
2941 2'b01: ZMUX <= PCIN;
2943 2'b11: ZMUX <= C_OUT;
2944 default: ZMUX <= 48'hxxxxxxxxxxxx;
2949 wire signed [48:0] X_EXT;
2950 wire signed [48:0] Z_EXT;
2951 assign X_EXT = {1'b0, XMUX};
2952 assign Z_EXT = {1'b0, ZMUX};
2953 assign {CARRYOUT_IN, P_IN} = OPMODE_OUT[7] ? (Z_EXT - (X_EXT + CARRYIN_OUT)) : (Z_EXT + X_EXT + CARRYIN_OUT);
2956 assign BCOUT = B1_OUT;
2962 input signed [17:0] A,
2963 input signed [17:0] B,
2964 input signed [47:0] C,
2965 input signed [17:0] BCIN,
2966 input signed [47:0] PCIN,
2970 input [1:0] CARRYINSEL,
2971 output signed [47:0] P,
2972 output signed [17:0] BCOUT,
2973 output signed [47:0] PCOUT,
2993 parameter integer AREG = 1;
2994 parameter integer BREG = 1;
2995 parameter integer CREG = 1;
2996 parameter integer MREG = 1;
2997 parameter integer PREG = 1;
2998 parameter integer CARRYINREG = 1;
2999 parameter integer CARRYINSELREG = 1;
3000 parameter integer OPMODEREG = 1;
3001 parameter integer SUBTRACTREG = 1;
3002 parameter B_INPUT = "DIRECT";
3003 parameter LEGACY_MODE = "MULT18X18S";
3005 wire signed [17:0] A_OUT;
3006 wire signed [17:0] B_OUT;
3007 wire signed [47:0] C_OUT;
3008 wire signed [35:0] M_MULT;
3009 wire signed [35:0] M_OUT;
3010 wire signed [47:0] P_IN;
3011 wire [6:0] OPMODE_OUT;
3012 wire [1:0] CARRYINSEL_OUT;
3017 reg signed [47:0] XMUX;
3018 reg signed [47:0] YMUX;
3019 wire signed [47:0] XYMUX;
3020 reg signed [47:0] ZMUX;
3023 // The B input multiplexer.
3024 wire signed [17:0] B_MUX;
3025 assign B_MUX = (B_INPUT == "DIRECT") ? B : BCIN;
3027 // The cascade output.
3028 assign BCOUT = B_OUT;
3032 reg signed [17:0] A0_REG;
3033 reg signed [17:0] A1_REG;
3034 reg signed [17:0] B0_REG;
3035 reg signed [17:0] B1_REG;
3036 reg signed [47:0] C_REG;
3037 reg signed [35:0] M_REG;
3038 reg signed [47:0] P_REG;
3039 reg [6:0] OPMODE_REG;
3040 reg [1:0] CARRYINSEL_REG;
3043 reg INT_CARRYIN_XY_REG;
3057 INT_CARRYIN_XY_REG = 0;
3060 always @(posedge CLK) begin
3064 end else if (CEA) begin
3071 end else if (CEB) begin
3077 end else if (CEC) begin
3082 end else if (CEM) begin
3087 end else if (CEP) begin
3092 CARRYINSEL_REG <= 0;
3096 OPMODE_REG <= OPMODE;
3097 CARRYINSEL_REG <= CARRYINSEL;
3100 SUBTRACT_REG <= SUBTRACT;
3102 if (RSTCARRYIN) begin
3104 INT_CARRYIN_XY_REG <= 0;
3107 CARRYIN_REG <= CARRYIN;
3109 INT_CARRYIN_XY_REG <= INT_CARRYIN_XY;
3113 // The register enables.
3114 assign A_OUT = (AREG == 2) ? A1_REG : (AREG == 1) ? A0_REG : A;
3115 assign B_OUT = (BREG == 2) ? B1_REG : (BREG == 1) ? B0_REG : B_MUX;
3116 assign C_OUT = (CREG == 1) ? C_REG : C;
3117 assign M_OUT = (MREG == 1) ? M_REG : M_MULT;
3118 assign P = (PREG == 1) ? P_REG : P_IN;
3119 assign OPMODE_OUT = (OPMODEREG == 1) ? OPMODE_REG : OPMODE;
3120 assign SUBTRACT_OUT = (SUBTRACTREG == 1) ? SUBTRACT_REG : SUBTRACT;
3121 assign CARRYINSEL_OUT = (CARRYINSELREG == 1) ? CARRYINSEL_REG : CARRYINSEL;
3122 assign CARRYIN_OUT = (CARRYINREG == 1) ? CARRYIN_REG : CARRYIN;
3125 assign M_MULT = A_OUT * B_OUT;
3127 // The post-adder inputs.
3129 case (OPMODE_OUT[1:0])
3132 2'b11: XMUX <= {{12{A_OUT[17]}}, A_OUT, B_OUT};
3133 default: XMUX <= 48'hxxxxxxxxxxxx;
3135 case (OPMODE_OUT[1:0])
3136 2'b01: INT_CARRYIN_XY <= A_OUT[17] ~^ B_OUT[17];
3137 2'b11: INT_CARRYIN_XY <= ~A_OUT[17];
3138 // TODO: not tested in hardware.
3139 default: INT_CARRYIN_XY <= A_OUT[17] ~^ B_OUT[17];
3144 case (OPMODE_OUT[3:2])
3146 2'b11: YMUX <= C_OUT;
3147 default: YMUX <= 48'hxxxxxxxxxxxx;
3151 assign XYMUX = (OPMODE_OUT[3:0] == 4'b0101) ? M_OUT : (XMUX + YMUX);
3154 case (OPMODE_OUT[6:4])
3156 3'b001: ZMUX <= PCIN;
3158 3'b011: ZMUX <= C_OUT;
3159 3'b101: ZMUX <= {{17{PCIN[47]}}, PCIN[47:17]};
3160 3'b110: ZMUX <= {{17{P[47]}}, P[47:17]};
3161 default: ZMUX <= 48'hxxxxxxxxxxxx;
3163 // TODO: check how all this works on actual hw.
3164 if (OPMODE_OUT[1:0] == 2'b10)
3165 INT_CARRYIN_Z <= ~P[47];
3167 case (OPMODE_OUT[6:4])
3168 3'b001: INT_CARRYIN_Z <= ~PCIN[47];
3169 3'b010: INT_CARRYIN_Z <= ~P[47];
3170 3'b101: INT_CARRYIN_Z <= ~PCIN[47];
3171 3'b110: INT_CARRYIN_Z <= ~P[47];
3172 default: INT_CARRYIN_Z <= 1'bx;
3177 case (CARRYINSEL_OUT)
3178 2'b00: CIN <= CARRYIN_OUT;
3179 2'b01: CIN <= INT_CARRYIN_Z;
3180 2'b10: CIN <= INT_CARRYIN_XY;
3181 2'b11: CIN <= INT_CARRYIN_XY_REG;
3182 default: CIN <= 1'bx;
3187 assign P_IN = SUBTRACT_OUT ? (ZMUX - (XYMUX + CIN)) : (ZMUX + XYMUX + CIN);
3191 // TODO: DSP48E (Virtex 5).
3193 // Virtex 6, Series 7.
3196 (* abc9_box=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG)
3197 `ifdef ALLOW_WHITEBOX_DSP48E1
3198 // Do not make DSP48E1 a whitebox for ABC9 even if fully combinatorial, since it is a big complex block
3199 , lib_whitebox=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG || INMODEREG || OPMODEREG || ALUMODEREG || CARRYINREG || CARRYINSELREG)
3204 output [29:0] ACOUT,
3205 output [17:0] BCOUT,
3206 output reg CARRYCASCOUT,
3207 output reg [3:0] CARRYOUT,
3208 output reg MULTSIGNOUT,
3210 output reg signed [47:0] P,
3211 output reg PATTERNBDETECT,
3212 output reg PATTERNDETECT,
3213 output [47:0] PCOUT,
3215 input signed [29:0] A,
3217 input [3:0] ALUMODE,
3218 input signed [17:0] B,
3223 input [2:0] CARRYINSEL,
3237 (* clkbuf_sink *) input CLK,
3244 input RSTALLCARRYIN,
3254 parameter integer ACASCREG = 1;
3255 parameter integer ADREG = 1;
3256 parameter integer ALUMODEREG = 1;
3257 parameter integer AREG = 1;
3258 parameter AUTORESET_PATDET = "NO_RESET";
3259 parameter A_INPUT = "DIRECT";
3260 parameter integer BCASCREG = 1;
3261 parameter integer BREG = 1;
3262 parameter B_INPUT = "DIRECT";
3263 parameter integer CARRYINREG = 1;
3264 parameter integer CARRYINSELREG = 1;
3265 parameter integer CREG = 1;
3266 parameter integer DREG = 1;
3267 parameter integer INMODEREG = 1;
3268 parameter integer MREG = 1;
3269 parameter integer OPMODEREG = 1;
3270 parameter integer PREG = 1;
3271 parameter SEL_MASK = "MASK";
3272 parameter SEL_PATTERN = "PATTERN";
3273 parameter USE_DPORT = "FALSE";
3274 parameter USE_MULT = "MULTIPLY";
3275 parameter USE_PATTERN_DETECT = "NO_PATDET";
3276 parameter USE_SIMD = "ONE48";
3277 parameter [47:0] MASK = 48'h3FFFFFFFFFFF;
3278 parameter [47:0] PATTERN = 48'h000000000000;
3279 parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
3280 parameter [0:0] IS_CARRYIN_INVERTED = 1'b0;
3281 parameter [0:0] IS_CLK_INVERTED = 1'b0;
3282 parameter [4:0] IS_INMODE_INVERTED = 5'b0;
3283 parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
3286 function integer \A.required ;
3288 if (AREG != 0) \A.required = 254;
3289 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3290 if (MREG != 0) \A.required = 1416;
3291 else if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 3030 : 2739) ;
3293 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3294 // Worst-case from ADREG and MREG
3295 if (MREG != 0) \A.required = 2400;
3296 else if (ADREG != 0) \A.required = 1283;
3297 else if (PREG != 0) \A.required = 3723;
3298 else if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 4014 : 3723) ;
3300 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3301 if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1730 : 1441) ;
3305 function integer \B.required ;
3307 if (BREG != 0) \B.required = 324;
3308 else if (MREG != 0) \B.required = 1285;
3309 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3310 if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 2898 : 2608) ;
3312 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3313 if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 2898 : 2608) ;
3315 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3316 if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1718 : 1428) ;
3320 function integer \C.required ;
3322 if (CREG != 0) \C.required = 168;
3323 else if (PREG != 0) \C.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1534 : 1244) ;
3326 function integer \D.required ;
3328 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3330 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3331 if (DREG != 0) \D.required = 248;
3332 else if (ADREG != 0) \D.required = 1195;
3333 else if (MREG != 0) \D.required = 2310;
3334 else if (PREG != 0) \D.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 3925 : 3635) ;
3336 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3340 function integer \P.arrival ;
3342 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3343 if (PREG != 0) \P.arrival = 329;
3344 // Worst-case from CREG and MREG
3345 else if (CREG != 0) \P.arrival = 1687;
3346 else if (MREG != 0) \P.arrival = 1671;
3347 // Worst-case from AREG and BREG
3348 else if (AREG != 0) \P.arrival = 2952;
3349 else if (BREG != 0) \P.arrival = 2813;
3351 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3352 if (PREG != 0) \P.arrival = 329;
3353 // Worst-case from CREG and MREG
3354 else if (CREG != 0) \P.arrival = 1687;
3355 else if (MREG != 0) \P.arrival = 1671;
3356 // Worst-case from AREG, ADREG, BREG, DREG
3357 else if (AREG != 0) \P.arrival = 3935;
3358 else if (DREG != 0) \P.arrival = 3908;
3359 else if (ADREG != 0) \P.arrival = 2958;
3360 else if (BREG != 0) \P.arrival = 2813;
3362 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3363 if (PREG != 0) \P.arrival = 329;
3364 // Worst-case from AREG, BREG, CREG
3365 else if (CREG != 0) \P.arrival = 1687;
3366 else if (AREG != 0) \P.arrival = 1632;
3367 else if (BREG != 0) \P.arrival = 1616;
3371 function integer \PCOUT.arrival ;
3373 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3374 if (PREG != 0) \PCOUT.arrival = 435;
3375 // Worst-case from CREG and MREG
3376 else if (CREG != 0) \PCOUT.arrival = 1835;
3377 else if (MREG != 0) \PCOUT.arrival = 1819;
3378 // Worst-case from AREG and BREG
3379 else if (AREG != 0) \PCOUT.arrival = 3098;
3380 else if (BREG != 0) \PCOUT.arrival = 2960;
3382 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3383 if (PREG != 0) \PCOUT.arrival = 435;
3384 // Worst-case from CREG and MREG
3385 else if (CREG != 0) \PCOUT.arrival = 1835;
3386 else if (MREG != 0) \PCOUT.arrival = 1819;
3387 // Worst-case from AREG, ADREG, BREG, DREG
3388 else if (AREG != 0) \PCOUT.arrival = 4083;
3389 else if (DREG != 0) \PCOUT.arrival = 4056;
3390 else if (BREG != 0) \PCOUT.arrival = 2960;
3391 else if (ADREG != 0) \PCOUT.arrival = 2859;
3393 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3394 if (PREG != 0) \PCOUT.arrival = 435;
3395 // Worst-case from AREG, BREG, CREG
3396 else if (CREG != 0) \PCOUT.arrival = 1835;
3397 else if (AREG != 0) \PCOUT.arrival = 1780;
3398 else if (BREG != 0) \PCOUT.arrival = 1765;
3402 function integer \A.P.comb ;
3404 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \A.P.comb = 2823;
3405 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \A.P.comb = 3806;
3406 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \A.P.comb = 1523;
3409 function integer \A.PCOUT.comb ;
3411 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \A.PCOUT.comb = 2970;
3412 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \A.PCOUT.comb = 3954;
3413 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \A.PCOUT.comb = 1671;
3416 function integer \B.P.comb ;
3418 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \B.P.comb = 2690;
3419 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \B.P.comb = 2690;
3420 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \B.P.comb = 1509;
3423 function integer \B.PCOUT.comb ;
3425 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \B.PCOUT.comb = 2838;
3426 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \B.PCOUT.comb = 2838;
3427 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \B.PCOUT.comb = 1658;
3430 function integer \C.P.comb ;
3432 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \C.P.comb = 1325;
3433 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \C.P.comb = 1325;
3434 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \C.P.comb = 1325;
3437 function integer \C.PCOUT.comb ;
3439 if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \C.PCOUT.comb = 1474;
3440 else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \C.PCOUT.comb = 1474;
3441 else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \C.PCOUT.comb = 1474;
3444 function integer \D.P.comb ;
3446 if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \D.P.comb = 3717;
3449 function integer \D.PCOUT.comb ;
3451 if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \D.PCOUT.comb = 3700;
3456 if (PREG == 0 && MREG == 0 && AREG == 0 && ADREG == 0)
3458 (A *> P) = \A.P.comb ();
3459 (A *> PCOUT) = \A.PCOUT.comb ();
3463 $setup(A, posedge CLK &&& !IS_CLK_INVERTED, \A.required () );
3464 $setup(A, negedge CLK &&& IS_CLK_INVERTED, \A.required () );
3467 if (PREG == 0 && MREG == 0 && BREG == 0)
3469 (B *> P) = \B.P.comb ();
3470 (B *> PCOUT) = \B.PCOUT.comb ();
3474 $setup(B, posedge CLK &&& !IS_CLK_INVERTED, \B.required () );
3475 $setup(B, negedge CLK &&& IS_CLK_INVERTED, \B.required () );
3478 if (PREG == 0 && CREG == 0)
3480 (C *> P) = \C.P.comb ();
3481 (C *> PCOUT) = \C.PCOUT.comb ();
3485 $setup(C, posedge CLK &&& !IS_CLK_INVERTED, \C.required () );
3486 $setup(C, negedge CLK &&& IS_CLK_INVERTED, \C.required () );
3489 if (PREG == 0 && MREG == 0 && ADREG == 0 && DREG == 0)
3491 (D *> P) = \D.P.comb ();
3492 (D *> PCOUT) = \D.PCOUT.comb ();
3496 $setup(D, posedge CLK &&& !IS_CLK_INVERTED, \D.required () );
3497 $setup(D, negedge CLK &&& IS_CLK_INVERTED, \D.required () );
3503 (PCIN *> PCOUT) = 1255;
3507 $setup(PCIN, posedge CLK &&& !IS_CLK_INVERTED, USE_PATTERN_DETECT != "NO_PATDET" ? 1315 : 1025);
3508 $setup(PCIN, negedge CLK &&& IS_CLK_INVERTED, USE_PATTERN_DETECT != "NO_PATDET" ? 1315 : 1025);
3511 if (PREG || AREG || ADREG || BREG || CREG || DREG || MREG)
3513 if (!IS_CLK_INVERTED && CEP) (posedge CLK => (P : 48'bx)) = \P.arrival () ;
3514 if ( IS_CLK_INVERTED && CEP) (negedge CLK => (P : 48'bx)) = \P.arrival () ;
3515 if (!IS_CLK_INVERTED && CEP) (posedge CLK => (PCOUT : 48'bx)) = \PCOUT.arrival () ;
3516 if ( IS_CLK_INVERTED && CEP) (negedge CLK => (PCOUT : 48'bx)) = \PCOUT.arrival () ;
3523 if (AUTORESET_PATDET != "NO_RESET") $fatal(1, "Unsupported AUTORESET_PATDET value");
3524 if (SEL_MASK != "MASK") $fatal(1, "Unsupported SEL_MASK value");
3525 if (SEL_PATTERN != "PATTERN") $fatal(1, "Unsupported SEL_PATTERN value");
3526 if (USE_SIMD != "ONE48" && USE_SIMD != "TWO24" && USE_SIMD != "FOUR12") $fatal(1, "Unsupported USE_SIMD value");
3527 if (IS_ALUMODE_INVERTED != 4'b0) $fatal(1, "Unsupported IS_ALUMODE_INVERTED value");
3528 if (IS_CARRYIN_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CARRYIN_INVERTED value");
3529 if (IS_CLK_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CLK_INVERTED value");
3530 if (IS_INMODE_INVERTED != 5'b0) $fatal(1, "Unsupported IS_INMODE_INVERTED value");
3531 if (IS_OPMODE_INVERTED != 7'b0) $fatal(1, "Unsupported IS_OPMODE_INVERTED value");
3535 wire signed [29:0] A_muxed;
3536 wire signed [17:0] B_muxed;
3539 if (A_INPUT == "CASCADE") assign A_muxed = ACIN;
3540 else assign A_muxed = A;
3542 if (B_INPUT == "CASCADE") assign B_muxed = BCIN;
3543 else assign B_muxed = B;
3546 reg signed [29:0] Ar1, Ar2;
3547 reg signed [24:0] Dr;
3548 reg signed [17:0] Br1, Br2;
3549 reg signed [47:0] Cr;
3553 reg [2:0] CARRYINSELr;
3556 // Configurable A register
3557 if (AREG == 2) begin
3558 initial Ar1 = 30'b0;
3559 initial Ar2 = 30'b0;
3560 always @(posedge CLK)
3565 if (CEA1) Ar1 <= A_muxed;
3566 if (CEA2) Ar2 <= Ar1;
3568 end else if (AREG == 1) begin
3569 //initial Ar1 = 30'b0;
3570 initial Ar2 = 30'b0;
3571 always @(posedge CLK)
3576 if (CEA1) Ar1 <= A_muxed;
3577 if (CEA2) Ar2 <= A_muxed;
3580 always @* Ar1 <= A_muxed;
3581 always @* Ar2 <= A_muxed;
3584 // Configurable B register
3585 if (BREG == 2) begin
3586 initial Br1 = 25'b0;
3587 initial Br2 = 25'b0;
3588 always @(posedge CLK)
3593 if (CEB1) Br1 <= B_muxed;
3594 if (CEB2) Br2 <= Br1;
3596 end else if (BREG == 1) begin
3597 //initial Br1 = 18'b0;
3598 initial Br2 = 18'b0;
3599 always @(posedge CLK)
3604 if (CEB1) Br1 <= B_muxed;
3605 if (CEB2) Br2 <= B_muxed;
3608 always @* Br1 <= B_muxed;
3609 always @* Br2 <= B_muxed;
3612 // C and D registers
3613 if (CREG == 1) initial Cr = 48'b0;
3614 if (CREG == 1) begin always @(posedge CLK) if (RSTC) Cr <= 48'b0; else if (CEC) Cr <= C; end
3615 else always @* Cr <= C;
3617 if (CREG == 1) initial Dr = 25'b0;
3618 if (DREG == 1) begin always @(posedge CLK) if (RSTD) Dr <= 25'b0; else if (CED) Dr <= D; end
3619 else always @* Dr <= D;
3621 // Control registers
3622 if (INMODEREG == 1) initial INMODEr = 5'b0;
3623 if (INMODEREG == 1) begin always @(posedge CLK) if (RSTINMODE) INMODEr <= 5'b0; else if (CEINMODE) INMODEr <= INMODE; end
3624 else always @* INMODEr <= INMODE;
3625 if (OPMODEREG == 1) initial OPMODEr = 7'b0;
3626 if (OPMODEREG == 1) begin always @(posedge CLK) if (RSTCTRL) OPMODEr <= 7'b0; else if (CECTRL) OPMODEr <= OPMODE; end
3627 else always @* OPMODEr <= OPMODE;
3628 if (ALUMODEREG == 1) initial ALUMODEr = 4'b0;
3629 if (ALUMODEREG == 1) begin always @(posedge CLK) if (RSTALUMODE) ALUMODEr <= 4'b0; else if (CEALUMODE) ALUMODEr <= ALUMODE; end
3630 else always @* ALUMODEr <= ALUMODE;
3631 if (CARRYINSELREG == 1) initial CARRYINSELr = 3'b0;
3632 if (CARRYINSELREG == 1) begin always @(posedge CLK) if (RSTCTRL) CARRYINSELr <= 3'b0; else if (CECTRL) CARRYINSELr <= CARRYINSEL; end
3633 else always @* CARRYINSELr <= CARRYINSEL;
3638 if (ACASCREG == 1 && AREG == 2) assign ACOUT = Ar1;
3639 else assign ACOUT = Ar2;
3640 if (BCASCREG == 1 && BREG == 2) assign BCOUT = Br1;
3641 else assign BCOUT = Br2;
3644 // A/D input selection and pre-adder
3645 wire signed [24:0] Ar12_muxed = INMODEr[0] ? Ar1 : Ar2;
3646 wire signed [24:0] Ar12_gated = INMODEr[1] ? 25'b0 : Ar12_muxed;
3647 wire signed [24:0] Dr_gated = INMODEr[2] ? Dr : 25'b0;
3648 wire signed [24:0] AD_result = INMODEr[3] ? (Dr_gated - Ar12_gated) : (Dr_gated + Ar12_gated);
3649 reg signed [24:0] ADr;
3652 if (ADREG == 1) initial ADr = 25'b0;
3653 if (ADREG == 1) begin always @(posedge CLK) if (RSTD) ADr <= 25'b0; else if (CEAD) ADr <= AD_result; end
3654 else always @* ADr <= AD_result;
3658 wire signed [24:0] A_MULT;
3659 wire signed [17:0] B_MULT = INMODEr[4] ? Br1 : Br2;
3661 if (USE_DPORT == "TRUE") assign A_MULT = ADr;
3662 else assign A_MULT = Ar12_gated;
3665 wire signed [42:0] M = A_MULT * B_MULT;
3666 wire signed [42:0] Mx = (CARRYINSEL == 3'b010) ? 43'bx : M;
3667 reg signed [42:0] Mr = 43'b0;
3669 // Multiplier result register
3671 if (MREG == 1) begin always @(posedge CLK) if (RSTM) Mr <= 43'b0; else if (CEM) Mr <= Mx; end
3672 else always @* Mr <= Mx;
3675 wire signed [42:0] Mrx = (CARRYINSELr == 3'b010) ? 43'bx : Mr;
3677 // X, Y and Z ALU inputs
3678 reg signed [47:0] X, Y, Z;
3684 2'b01: begin X = $signed(Mrx);
3686 if (OPMODEr[3:2] != 2'b01) $fatal(1, "OPMODEr[3:2] must be 2'b01 when OPMODEr[1:0] is 2'b01");
3695 $fatal(1, "PREG must be 1 when OPMODEr[1:0] is 2'b10");
3698 2'b11: X = $signed({Ar2, Br2});
3705 2'b01: begin Y = 48'b0; // FIXME: more accurate partial product modelling?
3707 if (OPMODEr[1:0] != 2'b01) $fatal(1, "OPMODEr[1:0] must be 2'b01 when OPMODEr[3:2] is 2'b01");
3710 2'b10: Y = {48{1'b1}};
3725 $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b010");
3730 if (PREG == 1 && OPMODEr[3:0] === 4'b1000)
3735 if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b100");
3736 if (OPMODEr[3:0] != 4'b1000) $fatal(1, "OPMODEr[3:0] must be 4'b1000 when OPMODEr[6:4] i0s 3'b100");
3739 3'b101: Z = $signed(PCIN[47:17]);
3742 Z = $signed(P[47:17]);
3746 $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b110");
3754 wire A24_xnor_B17d = A_MULT[24] ~^ B_MULT[17];
3755 reg CARRYINr, A24_xnor_B17;
3757 if (CARRYINREG == 1) initial CARRYINr = 1'b0;
3758 if (CARRYINREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) CARRYINr <= 1'b0; else if (CECARRYIN) CARRYINr <= CARRYIN; end
3759 else always @* CARRYINr = CARRYIN;
3761 if (MREG == 1) initial A24_xnor_B17 = 1'b0;
3762 if (MREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) A24_xnor_B17 <= 1'b0; else if (CEM) A24_xnor_B17 <= A24_xnor_B17d; end
3763 else always @* A24_xnor_B17 = A24_xnor_B17d;
3770 3'b000: cin_muxed = CARRYINr;
3771 3'b001: cin_muxed = ~PCIN[47];
3772 3'b010: cin_muxed = CARRYCASCIN;
3773 3'b011: cin_muxed = PCIN[47];
3776 cin_muxed = CARRYCASCOUT;
3780 $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b100");
3789 $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b101");
3792 3'b110: cin_muxed = A24_xnor_B17;
3799 $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b111");
3802 default: cin_muxed = 1'bx;
3806 wire alu_cin = (ALUMODEr[3] || ALUMODEr[2]) ? 1'b0 : cin_muxed;
3809 wire [47:0] Z_muxinv = ALUMODEr[0] ? ~Z : Z;
3810 wire [47:0] xor_xyz = X ^ Y ^ Z_muxinv;
3811 wire [47:0] maj_xyz = (X & Y) | (X & Z_muxinv) | (Y & Z_muxinv);
3813 wire [47:0] xor_xyz_muxed = ALUMODEr[3] ? maj_xyz : xor_xyz;
3814 wire [47:0] maj_xyz_gated = ALUMODEr[2] ? 48'b0 : maj_xyz;
3816 wire [48:0] maj_xyz_simd_gated;
3817 wire [3:0] int_carry_in, int_carry_out, ext_carry_out;
3818 wire [47:0] alu_sum;
3819 assign int_carry_in[0] = 1'b0;
3820 wire [3:0] carryout_reset;
3823 if (USE_SIMD == "FOUR12") begin
3824 assign maj_xyz_simd_gated = {
3825 maj_xyz_gated[47:36],
3826 1'b0, maj_xyz_gated[34:24],
3827 1'b0, maj_xyz_gated[22:12],
3828 1'b0, maj_xyz_gated[10:0],
3831 assign int_carry_in[3:1] = 3'b000;
3832 assign ext_carry_out = {
3834 maj_xyz_gated[35] ^ int_carry_out[2],
3835 maj_xyz_gated[23] ^ int_carry_out[1],
3836 maj_xyz_gated[11] ^ int_carry_out[0]
3838 assign carryout_reset = 4'b0000;
3839 end else if (USE_SIMD == "TWO24") begin
3840 assign maj_xyz_simd_gated = {
3841 maj_xyz_gated[47:24],
3842 1'b0, maj_xyz_gated[22:0],
3845 assign int_carry_in[3:1] = {int_carry_out[2], 1'b0, int_carry_out[0]};
3846 assign ext_carry_out = {
3849 maj_xyz_gated[23] ^ int_carry_out[1],
3852 assign carryout_reset = 4'b0x0x;
3854 assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
3855 assign int_carry_in[3:1] = int_carry_out[2:0];
3856 assign ext_carry_out = {
3860 assign carryout_reset = 4'b0xxx;
3864 for (i = 0; i < 4; i = i + 1)
3865 assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
3866 + xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
3869 wire signed [47:0] Pd = ALUMODEr[1] ? ~alu_sum : alu_sum;
3870 wire [3:0] CARRYOUTd = (OPMODEr[3:0] == 4'b0101 || ALUMODEr[3:2] != 2'b00) ? 4'bxxxx :
3871 ((ALUMODEr[0] & ALUMODEr[1]) ? ~ext_carry_out : ext_carry_out);
3872 wire CARRYCASCOUTd = ext_carry_out[3];
3873 wire MULTSIGNOUTd = Mrx[42];
3876 if (PREG == 1) begin
3878 initial CARRYOUT = carryout_reset;
3879 initial CARRYCASCOUT = 1'b0;
3880 initial MULTSIGNOUT = 1'b0;
3881 always @(posedge CLK)
3884 CARRYOUT <= carryout_reset;
3885 CARRYCASCOUT <= 1'b0;
3886 MULTSIGNOUT <= 1'b0;
3887 end else if (CEP) begin
3889 CARRYOUT <= CARRYOUTd;
3890 CARRYCASCOUT <= CARRYCASCOUTd;
3891 MULTSIGNOUT <= MULTSIGNOUTd;
3896 CARRYOUT = CARRYOUTd;
3897 CARRYCASCOUT = CARRYCASCOUTd;
3898 MULTSIGNOUT = MULTSIGNOUTd;
3906 wire PATTERNDETECTd, PATTERNBDETECTd;
3908 if (USE_PATTERN_DETECT == "PATDET") begin
3909 // TODO: Support SEL_PATTERN != "PATTERN" and SEL_MASK != "MASK
3910 assign PATTERNDETECTd = &(~(Pd ^ PATTERN) | MASK);
3911 assign PATTERNBDETECTd = &((Pd ^ PATTERN) | MASK);
3913 assign PATTERNDETECTd = 1'b1;
3914 assign PATTERNBDETECTd = 1'b1;
3917 if (PREG == 1) begin
3918 reg PATTERNDETECTPAST, PATTERNBDETECTPAST;
3919 initial PATTERNDETECT = 1'b0;
3920 initial PATTERNBDETECT = 1'b0;
3921 initial PATTERNDETECTPAST = 1'b0;
3922 initial PATTERNBDETECTPAST = 1'b0;
3923 always @(posedge CLK)
3925 PATTERNDETECT <= 1'b0;
3926 PATTERNBDETECT <= 1'b0;
3927 PATTERNDETECTPAST <= 1'b0;
3928 PATTERNBDETECTPAST <= 1'b0;
3929 end else if (CEP) begin
3930 PATTERNDETECT <= PATTERNDETECTd;
3931 PATTERNBDETECT <= PATTERNBDETECTd;
3932 PATTERNDETECTPAST <= PATTERNDETECT;
3933 PATTERNBDETECTPAST <= PATTERNBDETECT;
3935 assign OVERFLOW = &{PATTERNDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
3936 assign UNDERFLOW = &{PATTERNBDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
3939 PATTERNDETECT = PATTERNDETECTd;
3940 PATTERNBDETECT = PATTERNBDETECTd;
3942 assign OVERFLOW = 1'bx, UNDERFLOW = 1'bx;
3948 // TODO: DSP48E2 (Ultrascale).
3954 (* invertible_pin = "IS_CLKARDCLK_INVERTED" *)
3957 (* invertible_pin = "IS_CLKBWRCLK_INVERTED" *)
3959 (* invertible_pin = "IS_ENARDEN_INVERTED" *)
3961 (* invertible_pin = "IS_ENBWREN_INVERTED" *)
3965 (* invertible_pin = "IS_RSTRAMARSTRAM_INVERTED" *)
3966 input RSTRAMARSTRAM,
3967 (* invertible_pin = "IS_RSTRAMB_INVERTED" *)
3969 (* invertible_pin = "IS_RSTREGARSTREG_INVERTED" *)
3970 input RSTREGARSTREG,
3971 (* invertible_pin = "IS_RSTREGB_INVERTED" *)
3973 input [13:0] ADDRARDADDR,
3974 input [13:0] ADDRBWRADDR,
3977 input [1:0] DIPADIP,
3978 input [1:0] DIPBDIP,
3981 output [15:0] DOADO,
3982 output [15:0] DOBDO,
3983 output [1:0] DOPADOP,
3984 output [1:0] DOPBDOP
3986 parameter integer DOA_REG = 0;
3987 parameter integer DOB_REG = 0;
3988 parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3989 parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3990 parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3991 parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3992 parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3993 parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3994 parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3995 parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3996 parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3997 parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3998 parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3999 parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4000 parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4001 parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4002 parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4003 parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4004 parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4005 parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4006 parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4007 parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4008 parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4009 parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4010 parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4011 parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4012 parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4013 parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4014 parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4015 parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4016 parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4017 parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4018 parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4019 parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4020 parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4021 parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4022 parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4023 parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4024 parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4025 parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4026 parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4027 parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4028 parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4029 parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4030 parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4031 parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4032 parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4033 parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4034 parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4035 parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4036 parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4037 parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4038 parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4039 parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4040 parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4041 parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4042 parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4043 parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4044 parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4045 parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4046 parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4047 parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4048 parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4049 parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4050 parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4051 parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4052 parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4053 parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4054 parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4055 parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4056 parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4057 parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4058 parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4059 parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4060 parameter INIT_A = 18'h0;
4061 parameter INIT_B = 18'h0;
4062 parameter INIT_FILE = "NONE";
4063 parameter RAM_MODE = "TDP";
4064 parameter RDADDR_COLLISION_HWCONFIG = "DELAYED_WRITE";
4065 parameter integer READ_WIDTH_A = 0;
4066 parameter integer READ_WIDTH_B = 0;
4067 parameter RSTREG_PRIORITY_A = "RSTREG";
4068 parameter RSTREG_PRIORITY_B = "RSTREG";
4069 parameter SIM_COLLISION_CHECK = "ALL";
4070 parameter SIM_DEVICE = "VIRTEX6";
4071 parameter SRVAL_A = 18'h0;
4072 parameter SRVAL_B = 18'h0;
4073 parameter WRITE_MODE_A = "WRITE_FIRST";
4074 parameter WRITE_MODE_B = "WRITE_FIRST";
4075 parameter integer WRITE_WIDTH_A = 0;
4076 parameter integer WRITE_WIDTH_B = 0;
4077 parameter IS_CLKARDCLK_INVERTED = 1'b0;
4078 parameter IS_CLKBWRCLK_INVERTED = 1'b0;
4079 parameter IS_ENARDEN_INVERTED = 1'b0;
4080 parameter IS_ENBWREN_INVERTED = 1'b0;
4081 parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0;
4082 parameter IS_RSTRAMB_INVERTED = 1'b0;
4083 parameter IS_RSTREGARSTREG_INVERTED = 1'b0;
4084 parameter IS_RSTREGB_INVERTED = 1'b0;
4087 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L13
4088 $setup(ADDRARDADDR, posedge CLKARDCLK, 566);
4089 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L17
4090 $setup(ADDRBWRADDR, posedge CLKBWRCLK, 566);
4091 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L19
4092 $setup(WEA, posedge CLKARDCLK, 532);
4093 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L21
4094 $setup(WEBWE, posedge CLKBWRCLK, 532);
4095 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L29
4096 $setup(REGCEAREGCE, posedge CLKARDCLK, 360);
4097 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L31
4098 $setup(RSTREGARSTREG, posedge CLKARDCLK, 342);
4099 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L49
4100 $setup(REGCEB, posedge CLKBWRCLK, 360);
4101 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L59
4102 $setup(RSTREGB, posedge CLKBWRCLK, 342);
4103 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L123
4104 $setup(DIADI, posedge CLKARDCLK, 737);
4105 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L133
4106 $setup(DIBDI, posedge CLKBWRCLK, 737);
4107 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L125
4108 $setup(DIPADIP, posedge CLKARDCLK, 737);
4109 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L135
4110 $setup(DIPBDIP, posedge CLKBWRCLK, 737);
4111 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L143
4112 if (&DOA_REG) (posedge CLKARDCLK => (DOADO : 16'bx)) = 2454;
4113 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L144
4114 if (&DOA_REG) (posedge CLKARDCLK => (DOPADOP : 2'bx)) = 2454;
4115 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L153
4116 if (|DOA_REG) (posedge CLKARDCLK => (DOADO : 16'bx)) = 882;
4117 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L154
4118 if (|DOA_REG) (posedge CLKARDCLK => (DOPADOP : 2'bx)) = 882;
4119 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L163
4120 if (&DOB_REG) (posedge CLKBWRCLK => (DOBDO : 16'bx)) = 2454;
4121 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L164
4122 if (&DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 2'bx)) = 2454;
4123 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L173
4124 if (|DOB_REG) (posedge CLKBWRCLK => (DOBDO : 16'bx)) = 882;
4125 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L174
4126 if (|DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 2'bx)) = 882;
4133 output [31:0] DOADO,
4134 output [31:0] DOBDO,
4135 output [3:0] DOPADOP,
4136 output [3:0] DOPBDOP,
4137 output [7:0] ECCPARITY,
4138 output [8:0] RDADDRECC,
4141 (* invertible_pin = "IS_ENARDEN_INVERTED" *)
4144 (* invertible_pin = "IS_CLKARDCLK_INVERTED" *)
4146 (* invertible_pin = "IS_RSTRAMARSTRAM_INVERTED" *)
4147 input RSTRAMARSTRAM,
4148 (* invertible_pin = "IS_RSTREGARSTREG_INVERTED" *)
4149 input RSTREGARSTREG,
4152 (* invertible_pin = "IS_ENBWREN_INVERTED" *)
4155 (* invertible_pin = "IS_CLKBWRCLK_INVERTED" *)
4157 (* invertible_pin = "IS_RSTRAMB_INVERTED" *)
4159 (* invertible_pin = "IS_RSTREGB_INVERTED" *)
4163 input INJECTDBITERR,
4164 input INJECTSBITERR,
4165 input [15:0] ADDRARDADDR,
4166 input [15:0] ADDRBWRADDR,
4169 input [3:0] DIPADIP,
4170 input [3:0] DIPBDIP,
4174 parameter integer DOA_REG = 0;
4175 parameter integer DOB_REG = 0;
4176 parameter EN_ECC_READ = "FALSE";
4177 parameter EN_ECC_WRITE = "FALSE";
4178 parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4179 parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4180 parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4181 parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4182 parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4183 parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4184 parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4185 parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4186 parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4187 parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4188 parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4189 parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4190 parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4191 parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4192 parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4193 parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4194 parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4195 parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4196 parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4197 parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4198 parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4199 parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4200 parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4201 parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4202 parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4203 parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4204 parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4205 parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4206 parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4207 parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4208 parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4209 parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4210 parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4211 parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4212 parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4213 parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4214 parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4215 parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4216 parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4217 parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4218 parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4219 parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4220 parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4221 parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4222 parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4223 parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4224 parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4225 parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4226 parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4227 parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4228 parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4229 parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4230 parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4231 parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4232 parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4233 parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4234 parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4235 parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4236 parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4237 parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4238 parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4239 parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4240 parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4241 parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4242 parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4243 parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4244 parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4245 parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4246 parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4247 parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4248 parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4249 parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4250 parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4251 parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4252 parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4253 parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4254 parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4255 parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4256 parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4257 parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4258 parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4259 parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4260 parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4261 parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4262 parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4263 parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4264 parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4265 parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4266 parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4267 parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4268 parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4269 parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4270 parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4271 parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4272 parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4273 parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4274 parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4275 parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4276 parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4277 parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4278 parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4279 parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4280 parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4281 parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4282 parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4283 parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4284 parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4285 parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4286 parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4287 parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4288 parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4289 parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4290 parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4291 parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4292 parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4293 parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4294 parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4295 parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4296 parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4297 parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4298 parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4299 parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4300 parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4301 parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4302 parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4303 parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4304 parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4305 parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4306 parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4307 parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4308 parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4309 parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4310 parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4311 parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4312 parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4313 parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4314 parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4315 parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4316 parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4317 parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4318 parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4319 parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4320 parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4321 parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4322 parameter INIT_A = 36'h0;
4323 parameter INIT_B = 36'h0;
4324 parameter INIT_FILE = "NONE";
4325 parameter RAM_EXTENSION_A = "NONE";
4326 parameter RAM_EXTENSION_B = "NONE";
4327 parameter RAM_MODE = "TDP";
4328 parameter RDADDR_COLLISION_HWCONFIG = "DELAYED_WRITE";
4329 parameter integer READ_WIDTH_A = 0;
4330 parameter integer READ_WIDTH_B = 0;
4331 parameter RSTREG_PRIORITY_A = "RSTREG";
4332 parameter RSTREG_PRIORITY_B = "RSTREG";
4333 parameter SIM_COLLISION_CHECK = "ALL";
4334 parameter SIM_DEVICE = "VIRTEX6";
4335 parameter SRVAL_A = 36'h0;
4336 parameter SRVAL_B = 36'h0;
4337 parameter WRITE_MODE_A = "WRITE_FIRST";
4338 parameter WRITE_MODE_B = "WRITE_FIRST";
4339 parameter integer WRITE_WIDTH_A = 0;
4340 parameter integer WRITE_WIDTH_B = 0;
4341 parameter IS_CLKARDCLK_INVERTED = 1'b0;
4342 parameter IS_CLKBWRCLK_INVERTED = 1'b0;
4343 parameter IS_ENARDEN_INVERTED = 1'b0;
4344 parameter IS_ENBWREN_INVERTED = 1'b0;
4345 parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0;
4346 parameter IS_RSTRAMB_INVERTED = 1'b0;
4347 parameter IS_RSTREGARSTREG_INVERTED = 1'b0;
4348 parameter IS_RSTREGB_INVERTED = 1'b0;
4351 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L13
4352 $setup(ADDRARDADDR, posedge CLKARDCLK, 566);
4353 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L17
4354 $setup(ADDRBWRADDR, posedge CLKBWRCLK, 566);
4355 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L19
4356 $setup(WEA, posedge CLKARDCLK, 532);
4357 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L21
4358 $setup(WEBWE, posedge CLKBWRCLK, 532);
4359 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L29
4360 $setup(REGCEAREGCE, posedge CLKARDCLK, 360);
4361 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L31
4362 $setup(RSTREGARSTREG, posedge CLKARDCLK, 342);
4363 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L49
4364 $setup(REGCEB, posedge CLKBWRCLK, 360);
4365 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L59
4366 $setup(RSTREGB, posedge CLKBWRCLK, 342);
4367 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L123
4368 $setup(DIADI, posedge CLKARDCLK, 737);
4369 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L133
4370 $setup(DIBDI, posedge CLKBWRCLK, 737);
4371 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L125
4372 $setup(DIPADIP, posedge CLKARDCLK, 737);
4373 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L135
4374 $setup(DIPBDIP, posedge CLKBWRCLK, 737);
4375 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L143
4376 if (&DOA_REG) (posedge CLKARDCLK => (DOADO : 32'bx)) = 2454;
4377 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L144
4378 if (&DOA_REG) (posedge CLKARDCLK => (DOPADOP : 4'bx)) = 2454;
4379 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L153
4380 if (|DOA_REG) (posedge CLKARDCLK => (DOADO : 32'bx)) = 882;
4381 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L154
4382 if (|DOA_REG) (posedge CLKARDCLK => (DOPADOP : 4'bx)) = 882;
4383 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L163
4384 if (&DOB_REG) (posedge CLKBWRCLK => (DOBDO : 32'bx)) = 2454;
4385 // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L164
4386 if (&DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 4'bx)) = 2454;
4387 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L173
4388 if (|DOB_REG) (posedge CLKBWRCLK => (DOBDO : 32'bx)) = 882;
4389 // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L174
4390 if (|DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 4'bx)) = 882;