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;
43 (* iopad_external_pin *)
45 parameter CAPACITANCE = "DONT_CARE";
46 parameter IBUF_DELAY_VALUE = "0";
47 parameter IBUF_LOW_PWR = "TRUE";
48 parameter IOSTANDARD = "DEFAULT";
53 (* iopad_external_pin *)
56 parameter IOSTANDARD = "default";
58 parameter SLEW = "SLOW";
63 (* iopad_external_pin *)
69 parameter integer DRIVE = 12;
70 parameter IBUF_LOW_PWR = "TRUE";
71 parameter IOSTANDARD = "DEFAULT";
72 parameter SLEW = "SLOW";
73 assign IO = T ? 1'bz : I;
78 (* iopad_external_pin *)
83 parameter CAPACITANCE = "DONT_CARE";
84 parameter integer DRIVE = 12;
85 parameter IOSTANDARD = "DEFAULT";
86 parameter SLEW = "SLOW";
87 assign O = T ? 1'bz : I;
102 (* invertible_pin = "IS_S0_INVERTED" *)
104 (* invertible_pin = "IS_S1_INVERTED" *)
106 (* invertible_pin = "IS_CE0_INVERTED" *)
108 (* invertible_pin = "IS_CE1_INVERTED" *)
110 (* invertible_pin = "IS_IGNORE0_INVERTED" *)
112 (* invertible_pin = "IS_IGNORE1_INVERTED" *)
115 parameter [0:0] INIT_OUT = 1'b0;
116 parameter PRESELECT_I0 = "FALSE";
117 parameter PRESELECT_I1 = "FALSE";
118 parameter [0:0] IS_CE0_INVERTED = 1'b0;
119 parameter [0:0] IS_CE1_INVERTED = 1'b0;
120 parameter [0:0] IS_S0_INVERTED = 1'b0;
121 parameter [0:0] IS_S1_INVERTED = 1'b0;
122 parameter [0:0] IS_IGNORE0_INVERTED = 1'b0;
123 parameter [0:0] IS_IGNORE1_INVERTED = 1'b0;
125 wire I0_internal = ((CE0 ^ IS_CE0_INVERTED) ? I0 : INIT_OUT);
126 wire I1_internal = ((CE1 ^ IS_CE1_INVERTED) ? I1 : INIT_OUT);
127 wire S0_true = (S0 ^ IS_S0_INVERTED);
128 wire S1_true = (S1 ^ IS_S1_INVERTED);
130 assign O = S0_true ? I0_internal : (S1_true ? I1_internal : INIT_OUT);
138 (* invertible_pin = "IS_CE_INVERTED" *)
141 parameter [0:0] INIT_OUT = 1'b0;
142 parameter CE_TYPE = "SYNC";
143 parameter [0:0] IS_CE_INVERTED = 1'b0;
145 assign O = ((CE ^ IS_CE_INVERTED) ? I : INIT_OUT);
149 // module OBUFT(output O, input I, T);
150 // assign O = T ? 1'bz : I;
153 // module IOBUF(inout IO, output O, input I, T);
154 // assign O = IO, IO = T ? 1'bz : I;
158 (* clkbuf_inv = "I" *)
165 module LUT1(output O, input I0);
166 parameter [1:0] INIT = 0;
167 assign O = I0 ? INIT[1] : INIT[0];
170 module LUT2(output O, input I0, I1);
171 parameter [3:0] INIT = 0;
172 wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0];
173 assign O = I0 ? s1[1] : s1[0];
176 module LUT3(output O, input I0, I1, I2);
177 parameter [7:0] INIT = 0;
178 wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0];
179 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
180 assign O = I0 ? s1[1] : s1[0];
183 module LUT4(output O, input I0, I1, I2, I3);
184 parameter [15:0] INIT = 0;
185 wire [ 7: 0] s3 = I3 ? INIT[15: 8] : INIT[ 7: 0];
186 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
187 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
188 assign O = I0 ? s1[1] : s1[0];
191 module LUT5(output O, input I0, I1, I2, I3, I4);
192 parameter [31:0] INIT = 0;
193 wire [15: 0] s4 = I4 ? INIT[31:16] : INIT[15: 0];
194 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
195 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
196 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
197 assign O = I0 ? s1[1] : s1[0];
200 module LUT6(output O, input I0, I1, I2, I3, I4, I5);
201 parameter [63:0] INIT = 0;
202 wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
203 wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
204 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
205 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
206 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
207 assign O = I0 ? s1[1] : s1[0];
210 module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5);
211 parameter [63:0] INIT = 0;
212 wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
213 wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
214 wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
215 wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
216 wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
217 assign O6 = I0 ? s1[1] : s1[0];
219 wire [15: 0] s5_4 = I4 ? INIT[31:16] : INIT[15: 0];
220 wire [ 7: 0] s5_3 = I3 ? s5_4[15: 8] : s5_4[ 7: 0];
221 wire [ 3: 0] s5_2 = I2 ? s5_3[ 7: 4] : s5_3[ 3: 0];
222 wire [ 1: 0] s5_1 = I1 ? s5_2[ 3: 2] : s5_2[ 1: 0];
223 assign O5 = I0 ? s5_1[1] : s5_1[0];
226 module MUXCY(output O, input CI, DI, S);
227 assign O = S ? CI : DI;
230 module MUXF5(output O, input I0, I1, S);
231 assign O = S ? I1 : I0;
234 module MUXF6(output O, input I0, I1, S);
235 assign O = S ? I1 : I0;
238 (* abc9_box_id = 1, lib_whitebox *)
239 module MUXF7(output O, input I0, I1, S);
240 assign O = S ? I1 : I0;
243 (* abc9_box_id = 2, lib_whitebox *)
244 module MUXF8(output O, input I0, I1, S);
245 assign O = S ? I1 : I0;
248 module MUXF9(output O, input I0, I1, S);
249 assign O = S ? I1 : I0;
252 module XORCY(output O, input CI, LI);
256 (* abc9_box_id = 4, lib_whitebox *)
266 assign O = S ^ {CO[2:0], CI | CYINIT};
267 assign CO[0] = S[0] ? CI | CYINIT : DI[0];
268 assign CO[1] = S[1] ? CO[0] : DI[1];
269 assign CO[2] = S[2] ? CO[1] : DI[2];
270 assign CO[3] = S[3] ? CO[2] : DI[3];
280 parameter CARRY_TYPE = "SINGLE_CY8";
281 wire CI4 = (CARRY_TYPE == "DUAL_CY4" ? CI_TOP : CO[3]);
282 assign O = S ^ {CO[6:4], CI4, CO[2:0], CI};
283 assign CO[0] = S[0] ? CI : DI[0];
284 assign CO[1] = S[1] ? CO[0] : DI[1];
285 assign CO[2] = S[2] ? CO[1] : DI[2];
286 assign CO[3] = S[3] ? CO[2] : DI[3];
287 assign CO[4] = S[4] ? CI4 : DI[4];
288 assign CO[5] = S[5] ? CO[4] : DI[5];
289 assign CO[6] = S[6] ? CO[5] : DI[6];
290 assign CO[7] = S[7] ? CO[6] : DI[7];
293 `ifdef _EXPLICIT_CARRY
295 module CARRY0(output CO_CHAIN, CO_FABRIC, O, input CI, CI_INIT, DI, S);
296 parameter CYINIT_FABRIC = 0;
298 if(CYINIT_FABRIC) begin
299 assign CI_COMBINE = CI_INIT;
301 assign CI_COMBINE = CI;
303 assign CO_CHAIN = S ? CI_COMBINE : DI;
304 assign CO_FABRIC = S ? CI_COMBINE : DI;
305 assign O = S ^ CI_COMBINE;
308 module CARRY(output CO_CHAIN, CO_FABRIC, O, input CI, DI, S);
309 assign CO_CHAIN = S ? CI : DI;
310 assign CO_FABRIC = S ? CI : DI;
316 module ORCY (output O, input CI, I);
320 module MULT_AND (output LO, input I0, I1);
324 // Flip-flops and latches.
326 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L238-L250
328 (* abc9_box_id=1100, lib_whitebox, abc9_flop *)
330 (* abc9_arrival=303 *)
333 (* invertible_pin = "IS_C_INVERTED" *)
336 (* invertible_pin = "IS_D_INVERTED" *)
338 (* invertible_pin = "IS_R_INVERTED" *)
341 parameter [0:0] INIT = 1'b0;
342 parameter [0:0] IS_C_INVERTED = 1'b0;
343 parameter [0:0] IS_D_INVERTED = 1'b0;
344 parameter [0:0] IS_R_INVERTED = 1'b0;
346 generate case (|IS_C_INVERTED)
347 1'b0: always @(posedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
348 1'b1: always @(negedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
352 (* abc9_box_id=1101, lib_whitebox, abc9_flop *)
354 (* abc9_arrival=303 *)
360 parameter [0:0] INIT = 1'b0;
362 always @(negedge C) if (R) Q <= 1'b0; else if (CE) Q <= D;
368 (* invertible_pin = "IS_C_INVERTED" *)
370 (* invertible_pin = "IS_CE_INVERTED" *)
372 (* invertible_pin = "IS_D_INVERTED" *)
374 (* invertible_pin = "IS_R_INVERTED" *)
376 (* invertible_pin = "IS_S_INVERTED" *)
379 parameter [0:0] INIT = 1'b0;
380 parameter [0:0] IS_C_INVERTED = 1'b0;
381 parameter [0:0] IS_CE_INVERTED = 1'b0;
382 parameter [0:0] IS_D_INVERTED = 1'b0;
383 parameter [0:0] IS_R_INVERTED = 1'b0;
384 parameter [0:0] IS_S_INVERTED = 1'b0;
386 wire c = C ^ IS_C_INVERTED;
387 wire ce = CE ^ IS_CE_INVERTED;
388 wire d = D ^ IS_D_INVERTED;
389 wire r = R ^ IS_R_INVERTED;
390 wire s = S ^ IS_S_INVERTED;
400 (* abc9_box_id=1102, lib_whitebox, abc9_flop *)
402 (* abc9_arrival=303 *)
405 (* invertible_pin = "IS_C_INVERTED" *)
408 (* invertible_pin = "IS_CLR_INVERTED" *)
410 (* invertible_pin = "IS_D_INVERTED" *)
413 parameter [0:0] INIT = 1'b0;
414 parameter [0:0] IS_C_INVERTED = 1'b0;
415 parameter [0:0] IS_D_INVERTED = 1'b0;
416 parameter [0:0] IS_CLR_INVERTED = 1'b0;
418 generate case ({|IS_C_INVERTED, |IS_CLR_INVERTED})
419 2'b00: always @(posedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
420 2'b01: always @(posedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
421 2'b10: always @(negedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
422 2'b11: always @(negedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
426 (* abc9_box_id=1103, lib_whitebox, abc9_flop *)
428 (* abc9_arrival=303 *)
434 parameter [0:0] INIT = 1'b0;
436 always @(negedge C, posedge CLR) if (CLR) Q <= 1'b0; else if (CE) Q <= D;
442 (* invertible_pin = "IS_C_INVERTED" *)
445 (* invertible_pin = "IS_CLR_INVERTED" *)
448 (* invertible_pin = "IS_PRE_INVERTED" *)
451 parameter [0:0] INIT = 1'b0;
452 parameter [0:0] IS_C_INVERTED = 1'b0;
453 parameter [0:0] IS_CLR_INVERTED = 1'b0;
454 parameter [0:0] IS_PRE_INVERTED = 1'b0;
455 wire c = C ^ IS_C_INVERTED;
456 wire clr = CLR ^ IS_CLR_INVERTED;
457 wire pre = PRE ^ IS_PRE_INVERTED;
458 // Hacky model to avoid simulation-synthesis mismatches.
463 always @(posedge c, posedge clr) begin
469 always @(posedge c, posedge pre) begin
481 assign Q = qs ? qp : qc;
484 (* abc9_box_id=1104, lib_whitebox, abc9_flop *)
486 (* abc9_arrival=303 *)
489 (* invertible_pin = "IS_C_INVERTED" *)
492 (* invertible_pin = "IS_D_INVERTED" *)
494 (* invertible_pin = "IS_PRE_INVERTED" *)
497 parameter [0:0] INIT = 1'b1;
498 parameter [0:0] IS_C_INVERTED = 1'b0;
499 parameter [0:0] IS_D_INVERTED = 1'b0;
500 parameter [0:0] IS_PRE_INVERTED = 1'b0;
502 generate case ({|IS_C_INVERTED, |IS_PRE_INVERTED})
503 2'b00: always @(posedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
504 2'b01: always @(posedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
505 2'b10: always @(negedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
506 2'b11: always @(negedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
510 (* abc9_box_id=1105, lib_whitebox, abc9_flop *)
512 (* abc9_arrival=303 *)
518 parameter [0:0] INIT = 1'b1;
520 always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;
523 (* abc9_box_id=1106, lib_whitebox, abc9_flop *)
525 (* abc9_arrival=303 *)
528 (* invertible_pin = "IS_C_INVERTED" *)
531 (* invertible_pin = "IS_D_INVERTED" *)
533 (* invertible_pin = "IS_S_INVERTED" *)
536 parameter [0:0] INIT = 1'b1;
537 parameter [0:0] IS_C_INVERTED = 1'b0;
538 parameter [0:0] IS_D_INVERTED = 1'b0;
539 parameter [0:0] IS_S_INVERTED = 1'b0;
541 generate case (|IS_C_INVERTED)
542 1'b0: always @(posedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
543 1'b1: always @(negedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
547 (* abc9_box_id=1107, lib_whitebox, abc9_flop *)
549 (* abc9_arrival=303 *)
555 parameter [0:0] INIT = 1'b1;
557 always @(negedge C) if (S) Q <= 1'b1; else if (CE) Q <= D;
562 (* invertible_pin = "IS_CLR_INVERTED" *)
565 (* invertible_pin = "IS_G_INVERTED" *)
569 parameter [0:0] INIT = 1'b0;
570 parameter [0:0] IS_CLR_INVERTED = 1'b0;
571 parameter [0:0] IS_G_INVERTED = 1'b0;
572 parameter MSGON = "TRUE";
573 parameter XON = "TRUE";
575 wire clr = CLR ^ IS_CLR_INVERTED;
576 wire g = G ^ IS_G_INVERTED;
579 else if (GE && g) Q <= D;
585 (* invertible_pin = "IS_G_INVERTED" *)
588 (* invertible_pin = "IS_PRE_INVERTED" *)
591 parameter [0:0] INIT = 1'b1;
592 parameter [0:0] IS_G_INVERTED = 1'b0;
593 parameter [0:0] IS_PRE_INVERTED = 1'b0;
594 parameter MSGON = "TRUE";
595 parameter XON = "TRUE";
597 wire g = G ^ IS_G_INVERTED;
598 wire pre = PRE ^ IS_PRE_INVERTED;
601 else if (GE && g) Q <= D;
606 (* invertible_pin = "IS_CLR_INVERTED" *)
608 (* invertible_pin = "IS_D_INVERTED" *)
610 (* invertible_pin = "IS_G_INVERTED" *)
612 (* invertible_pin = "IS_GE_INVERTED" *)
614 (* invertible_pin = "IS_PRE_INVERTED" *)
617 parameter [0:0] INIT = 1'b1;
618 parameter [0:0] IS_CLR_INVERTED = 1'b0;
619 parameter [0:0] IS_D_INVERTED = 1'b0;
620 parameter [0:0] IS_G_INVERTED = 1'b0;
621 parameter [0:0] IS_GE_INVERTED = 1'b0;
622 parameter [0:0] IS_PRE_INVERTED = 1'b0;
624 wire d = D ^ IS_D_INVERTED;
625 wire g = G ^ IS_G_INVERTED;
626 wire ge = GE ^ IS_GE_INVERTED;
627 wire clr = CLR ^ IS_CLR_INVERTED;
628 wire pre = PRE ^ IS_PRE_INVERTED;
631 else if (pre) Q <= 1'b1;
632 else if (ge && g) Q <= d;
638 (* invertible_pin = "IS_SRI_INVERTED" *)
641 parameter [0:0] IS_SRI_INVERTED = 1'b0;
642 assign O = DI & ~(SRI ^ IS_SRI_INVERTED);
648 (* invertible_pin = "IS_SRI_INVERTED" *)
651 parameter [0:0] IS_SRI_INVERTED = 1'b0;
652 assign O = DI | (SRI ^ IS_SRI_INVERTED);
661 input A0, A1, A2, A3,
664 (* invertible_pin = "IS_WCLK_INVERTED" *)
668 parameter [15:0] INIT = 16'h0000;
669 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
670 wire [3:0] a = {A3, A2, A1, A0};
671 reg [15:0] mem = INIT;
673 wire clk = WCLK ^ IS_WCLK_INVERTED;
674 always @(posedge clk) if (WE) mem[a] <= D;
679 input A0, A1, A2, A3,
682 (* invertible_pin = "IS_WCLK_INVERTED" *)
686 parameter [15:0] INIT = 16'h0000;
687 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
688 wire [3:0] a = {A3, A2, A1, A0};
689 reg [15:0] mem = INIT;
691 wire clk = WCLK ^ IS_WCLK_INVERTED;
692 always @(negedge clk) if (WE) mem[a] <= D;
697 input A0, A1, A2, A3, A4,
700 (* invertible_pin = "IS_WCLK_INVERTED" *)
704 parameter [31:0] INIT = 32'h00000000;
705 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
706 wire [4:0] a = {A4, A3, A2, A1, A0};
707 reg [31:0] mem = INIT;
709 wire clk = WCLK ^ IS_WCLK_INVERTED;
710 always @(posedge clk) if (WE) mem[a] <= D;
715 input A0, A1, A2, A3, A4,
718 (* invertible_pin = "IS_WCLK_INVERTED" *)
722 parameter [31:0] INIT = 32'h00000000;
723 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
724 wire [4:0] a = {A4, A3, A2, A1, A0};
725 reg [31:0] mem = INIT;
727 wire clk = WCLK ^ IS_WCLK_INVERTED;
728 always @(negedge clk) if (WE) mem[a] <= D;
733 input A0, A1, A2, A3, A4, A5,
736 (* invertible_pin = "IS_WCLK_INVERTED" *)
740 parameter [63:0] INIT = 64'h0000000000000000;
741 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
742 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
743 reg [63:0] mem = INIT;
745 wire clk = WCLK ^ IS_WCLK_INVERTED;
746 always @(posedge clk) if (WE) mem[a] <= D;
751 input A0, A1, A2, A3, A4, A5,
754 (* invertible_pin = "IS_WCLK_INVERTED" *)
758 parameter [63:0] INIT = 64'h0000000000000000;
759 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
760 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
761 reg [63:0] mem = INIT;
763 wire clk = WCLK ^ IS_WCLK_INVERTED;
764 always @(negedge clk) if (WE) mem[a] <= D;
769 input A0, A1, A2, A3, A4, A5, A6,
772 (* invertible_pin = "IS_WCLK_INVERTED" *)
776 parameter [127:0] INIT = 128'h00000000000000000000000000000000;
777 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
778 wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
779 reg [127:0] mem = INIT;
781 wire clk = WCLK ^ IS_WCLK_INVERTED;
782 always @(posedge clk) if (WE) mem[a] <= D;
787 input A0, A1, A2, A3, A4, A5, A6,
790 (* invertible_pin = "IS_WCLK_INVERTED" *)
794 parameter [127:0] INIT = 128'h00000000000000000000000000000000;
795 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
796 wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
797 reg [127:0] mem = INIT;
799 wire clk = WCLK ^ IS_WCLK_INVERTED;
800 always @(negedge clk) if (WE) mem[a] <= D;
808 (* invertible_pin = "IS_WCLK_INVERTED" *)
812 parameter [255:0] INIT = 256'h0;
813 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
814 reg [255:0] mem = INIT;
816 wire clk = WCLK ^ IS_WCLK_INVERTED;
817 always @(posedge clk) if (WE) mem[A] <= D;
825 (* invertible_pin = "IS_WCLK_INVERTED" *)
829 parameter [511:0] INIT = 512'h0;
830 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
831 reg [511:0] mem = INIT;
833 wire clk = WCLK ^ IS_WCLK_INVERTED;
834 always @(posedge clk) if (WE) mem[A] <= D;
837 // Single port, wide.
841 input A0, A1, A2, A3,
844 (* invertible_pin = "IS_WCLK_INVERTED" *)
848 parameter [15:0] INIT_00 = 16'h0000;
849 parameter [15:0] INIT_01 = 16'h0000;
850 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
851 wire [3:0] a = {A3, A2, A1, A0};
852 wire clk = WCLK ^ IS_WCLK_INVERTED;
853 reg [15:0] mem0 = INIT_00;
854 reg [15:0] mem1 = INIT_01;
857 always @(posedge clk)
866 input A0, A1, A2, A3, A4,
869 (* invertible_pin = "IS_WCLK_INVERTED" *)
873 parameter [31:0] INIT_00 = 32'h00000000;
874 parameter [31:0] INIT_01 = 32'h00000000;
875 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
876 wire [4:0] a = {A4, A3, A2, A1, A0};
877 wire clk = WCLK ^ IS_WCLK_INVERTED;
878 reg [31:0] mem0 = INIT_00;
879 reg [31:0] mem1 = INIT_01;
882 always @(posedge clk)
891 input A0, A1, A2, A3, A4, A5,
894 (* invertible_pin = "IS_WCLK_INVERTED" *)
898 parameter [63:0] INIT_00 = 64'h0000000000000000;
899 parameter [63:0] INIT_01 = 64'h0000000000000000;
900 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
901 wire [5:0] a = {A5, A3, A2, A1, A0};
902 wire clk = WCLK ^ IS_WCLK_INVERTED;
903 reg [63:0] mem0 = INIT_00;
904 reg [63:0] mem1 = INIT_01;
907 always @(posedge clk)
915 output O0, O1, O2, O3,
916 input A0, A1, A2, A3,
917 input D0, D1, D2, D3,
919 (* invertible_pin = "IS_WCLK_INVERTED" *)
923 parameter [15:0] INIT_00 = 16'h0000;
924 parameter [15:0] INIT_01 = 16'h0000;
925 parameter [15:0] INIT_02 = 16'h0000;
926 parameter [15:0] INIT_03 = 16'h0000;
927 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
928 wire [3:0] a = {A3, A2, A1, A0};
929 wire clk = WCLK ^ IS_WCLK_INVERTED;
930 reg [15:0] mem0 = INIT_00;
931 reg [15:0] mem1 = INIT_01;
932 reg [15:0] mem2 = INIT_02;
933 reg [15:0] mem3 = INIT_03;
938 always @(posedge clk)
948 output O0, O1, O2, O3,
949 input A0, A1, A2, A3, A4,
950 input D0, D1, D2, D3,
952 (* invertible_pin = "IS_WCLK_INVERTED" *)
956 parameter [31:0] INIT_00 = 32'h00000000;
957 parameter [31:0] INIT_01 = 32'h00000000;
958 parameter [31:0] INIT_02 = 32'h00000000;
959 parameter [31:0] INIT_03 = 32'h00000000;
960 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
961 wire [4:0] a = {A4, A3, A2, A1, A0};
962 wire clk = WCLK ^ IS_WCLK_INVERTED;
963 reg [31:0] mem0 = INIT_00;
964 reg [31:0] mem1 = INIT_01;
965 reg [31:0] mem2 = INIT_02;
966 reg [31:0] mem3 = INIT_03;
971 always @(posedge clk)
982 input A0, A1, A2, A3,
985 (* invertible_pin = "IS_WCLK_INVERTED" *)
989 parameter [15:0] INIT_00 = 16'h0000;
990 parameter [15:0] INIT_01 = 16'h0000;
991 parameter [15:0] INIT_02 = 16'h0000;
992 parameter [15:0] INIT_03 = 16'h0000;
993 parameter [15:0] INIT_04 = 16'h0000;
994 parameter [15:0] INIT_05 = 16'h0000;
995 parameter [15:0] INIT_06 = 16'h0000;
996 parameter [15:0] INIT_07 = 16'h0000;
997 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
998 wire [3:0] a = {A3, A2, A1, A0};
999 wire clk = WCLK ^ IS_WCLK_INVERTED;
1000 reg [15:0] mem0 = INIT_00;
1001 reg [15:0] mem1 = INIT_01;
1002 reg [15:0] mem2 = INIT_02;
1003 reg [15:0] mem3 = INIT_03;
1004 reg [15:0] mem4 = INIT_04;
1005 reg [15:0] mem5 = INIT_05;
1006 reg [15:0] mem6 = INIT_06;
1007 reg [15:0] mem7 = INIT_07;
1008 assign O[0] = mem0[a];
1009 assign O[1] = mem1[a];
1010 assign O[2] = mem2[a];
1011 assign O[3] = mem3[a];
1012 assign O[4] = mem4[a];
1013 assign O[5] = mem5[a];
1014 assign O[6] = mem6[a];
1015 assign O[7] = mem7[a];
1016 always @(posedge clk)
1031 input A0, A1, A2, A3, A4,
1034 (* invertible_pin = "IS_WCLK_INVERTED" *)
1038 parameter [31:0] INIT_00 = 32'h00000000;
1039 parameter [31:0] INIT_01 = 32'h00000000;
1040 parameter [31:0] INIT_02 = 32'h00000000;
1041 parameter [31:0] INIT_03 = 32'h00000000;
1042 parameter [31:0] INIT_04 = 32'h00000000;
1043 parameter [31:0] INIT_05 = 32'h00000000;
1044 parameter [31:0] INIT_06 = 32'h00000000;
1045 parameter [31:0] INIT_07 = 32'h00000000;
1046 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1047 wire [4:0] a = {A4, A3, A2, A1, A0};
1048 wire clk = WCLK ^ IS_WCLK_INVERTED;
1049 reg [31:0] mem0 = INIT_00;
1050 reg [31:0] mem1 = INIT_01;
1051 reg [31:0] mem2 = INIT_02;
1052 reg [31:0] mem3 = INIT_03;
1053 reg [31:0] mem4 = INIT_04;
1054 reg [31:0] mem5 = INIT_05;
1055 reg [31:0] mem6 = INIT_06;
1056 reg [31:0] mem7 = INIT_07;
1057 assign O[0] = mem0[a];
1058 assign O[1] = mem1[a];
1059 assign O[2] = mem2[a];
1060 assign O[3] = mem3[a];
1061 assign O[4] = mem4[a];
1062 assign O[5] = mem5[a];
1063 assign O[6] = mem6[a];
1064 assign O[7] = mem7[a];
1065 always @(posedge clk)
1084 (* invertible_pin = "IS_WCLK_INVERTED" *)
1087 input A0, A1, A2, A3,
1088 input DPRA0, DPRA1, DPRA2, DPRA3
1090 parameter INIT = 16'h0;
1091 parameter IS_WCLK_INVERTED = 1'b0;
1092 wire [3:0] a = {A3, A2, A1, A0};
1093 wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1094 reg [15:0] mem = INIT;
1095 assign SPO = mem[a];
1096 assign DPO = mem[dpra];
1097 wire clk = WCLK ^ IS_WCLK_INVERTED;
1098 always @(posedge clk) if (WE) mem[a] <= D;
1105 (* invertible_pin = "IS_WCLK_INVERTED" *)
1108 input A0, A1, A2, A3,
1109 input DPRA0, DPRA1, DPRA2, DPRA3
1111 parameter INIT = 16'h0;
1112 parameter IS_WCLK_INVERTED = 1'b0;
1113 wire [3:0] a = {A3, A2, A1, A0};
1114 wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1115 reg [15:0] mem = INIT;
1116 assign SPO = mem[a];
1117 assign DPO = mem[dpra];
1118 wire clk = WCLK ^ IS_WCLK_INVERTED;
1119 always @(negedge clk) if (WE) mem[a] <= D;
1123 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1124 (* abc9_arrival=1153 *)
1128 (* invertible_pin = "IS_WCLK_INVERTED" *)
1131 input A0, A1, A2, A3, A4,
1132 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1134 parameter INIT = 32'h0;
1135 parameter IS_WCLK_INVERTED = 1'b0;
1136 wire [4:0] a = {A4, A3, A2, A1, A0};
1137 wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1138 reg [31:0] mem = INIT;
1139 assign SPO = mem[a];
1140 assign DPO = mem[dpra];
1141 wire clk = WCLK ^ IS_WCLK_INVERTED;
1142 always @(posedge clk) if (WE) mem[a] <= D;
1146 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1147 (* abc9_arrival=1153 *)
1151 (* invertible_pin = "IS_WCLK_INVERTED" *)
1154 input A0, A1, A2, A3, A4,
1155 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1157 parameter INIT = 32'h0;
1158 parameter IS_WCLK_INVERTED = 1'b0;
1159 wire [4:0] a = {A4, A3, A2, A1, A0};
1160 wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1161 reg [31:0] mem = INIT;
1162 assign SPO = mem[a];
1163 assign DPO = mem[dpra];
1164 wire clk = WCLK ^ IS_WCLK_INVERTED;
1165 always @(negedge clk) if (WE) mem[a] <= D;
1169 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1170 (* abc9_arrival=1153 *)
1174 (* invertible_pin = "IS_WCLK_INVERTED" *)
1177 input A0, A1, A2, A3, A4, A5,
1178 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1180 parameter INIT = 64'h0;
1181 parameter IS_WCLK_INVERTED = 1'b0;
1182 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1183 wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1184 reg [63:0] mem = INIT;
1185 assign SPO = mem[a];
1186 assign DPO = mem[dpra];
1187 wire clk = WCLK ^ IS_WCLK_INVERTED;
1188 always @(posedge clk) if (WE) mem[a] <= D;
1192 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1193 (* abc9_arrival=1153 *)
1197 (* invertible_pin = "IS_WCLK_INVERTED" *)
1200 input A0, A1, A2, A3, A4, A5,
1201 input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1203 parameter INIT = 64'h0;
1204 parameter IS_WCLK_INVERTED = 1'b0;
1205 wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1206 wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1207 reg [63:0] mem = INIT;
1208 assign SPO = mem[a];
1209 assign DPO = mem[dpra];
1210 wire clk = WCLK ^ IS_WCLK_INVERTED;
1211 always @(negedge clk) if (WE) mem[a] <= D;
1215 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1216 (* abc9_arrival=1153 *)
1220 (* invertible_pin = "IS_WCLK_INVERTED" *)
1225 parameter INIT = 128'h0;
1226 parameter IS_WCLK_INVERTED = 1'b0;
1227 reg [127:0] mem = INIT;
1228 assign SPO = mem[A];
1229 assign DPO = mem[DPRA];
1230 wire clk = WCLK ^ IS_WCLK_INVERTED;
1231 always @(posedge clk) if (WE) mem[A] <= D;
1238 (* invertible_pin = "IS_WCLK_INVERTED" *)
1243 parameter INIT = 256'h0;
1244 parameter IS_WCLK_INVERTED = 1'b0;
1245 reg [255:0] mem = INIT;
1246 assign SPO = mem[A];
1247 assign DPO = mem[DPRA];
1248 wire clk = WCLK ^ IS_WCLK_INVERTED;
1249 always @(posedge clk) if (WE) mem[A] <= D;
1255 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1256 (* abc9_arrival=1153 *)
1257 output [1:0] DOA, DOB, DOC, DOD,
1258 input [4:0] ADDRA, ADDRB, ADDRC, ADDRD,
1259 input [1:0] DIA, DIB, DIC, DID,
1261 (* invertible_pin = "IS_WCLK_INVERTED" *)
1265 parameter [63:0] INIT_A = 64'h0000000000000000;
1266 parameter [63:0] INIT_B = 64'h0000000000000000;
1267 parameter [63:0] INIT_C = 64'h0000000000000000;
1268 parameter [63:0] INIT_D = 64'h0000000000000000;
1269 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1270 reg [63:0] mem_a = INIT_A;
1271 reg [63:0] mem_b = INIT_B;
1272 reg [63:0] mem_c = INIT_C;
1273 reg [63:0] mem_d = INIT_D;
1274 assign DOA = mem_a[2*ADDRA+:2];
1275 assign DOB = mem_b[2*ADDRB+:2];
1276 assign DOC = mem_c[2*ADDRC+:2];
1277 assign DOD = mem_d[2*ADDRD+:2];
1278 wire clk = WCLK ^ IS_WCLK_INVERTED;
1279 always @(posedge clk)
1281 mem_a[2*ADDRD+:2] <= DIA;
1282 mem_b[2*ADDRD+:2] <= DIB;
1283 mem_c[2*ADDRD+:2] <= DIC;
1284 mem_d[2*ADDRD+:2] <= DID;
1314 (* invertible_pin = "IS_WCLK_INVERTED" *)
1318 parameter [63:0] INIT_A = 64'h0000000000000000;
1319 parameter [63:0] INIT_B = 64'h0000000000000000;
1320 parameter [63:0] INIT_C = 64'h0000000000000000;
1321 parameter [63:0] INIT_D = 64'h0000000000000000;
1322 parameter [63:0] INIT_E = 64'h0000000000000000;
1323 parameter [63:0] INIT_F = 64'h0000000000000000;
1324 parameter [63:0] INIT_G = 64'h0000000000000000;
1325 parameter [63:0] INIT_H = 64'h0000000000000000;
1326 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1327 reg [63:0] mem_a = INIT_A;
1328 reg [63:0] mem_b = INIT_B;
1329 reg [63:0] mem_c = INIT_C;
1330 reg [63:0] mem_d = INIT_D;
1331 reg [63:0] mem_e = INIT_E;
1332 reg [63:0] mem_f = INIT_F;
1333 reg [63:0] mem_g = INIT_G;
1334 reg [63:0] mem_h = INIT_H;
1335 assign DOA = mem_a[2*ADDRA+:2];
1336 assign DOB = mem_b[2*ADDRB+:2];
1337 assign DOC = mem_c[2*ADDRC+:2];
1338 assign DOD = mem_d[2*ADDRD+:2];
1339 assign DOE = mem_e[2*ADDRE+:2];
1340 assign DOF = mem_f[2*ADDRF+:2];
1341 assign DOG = mem_g[2*ADDRG+:2];
1342 assign DOH = mem_h[2*ADDRH+:2];
1343 wire clk = WCLK ^ IS_WCLK_INVERTED;
1344 always @(posedge clk)
1346 mem_a[2*ADDRH+:2] <= DIA;
1347 mem_b[2*ADDRH+:2] <= DIB;
1348 mem_c[2*ADDRH+:2] <= DIC;
1349 mem_d[2*ADDRH+:2] <= DID;
1350 mem_e[2*ADDRH+:2] <= DIE;
1351 mem_f[2*ADDRH+:2] <= DIF;
1352 mem_g[2*ADDRH+:2] <= DIG;
1353 mem_h[2*ADDRH+:2] <= DIH;
1358 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1359 (* abc9_arrival=1153 *)
1360 output DOA, DOB, DOC, DOD,
1361 input [5:0] ADDRA, ADDRB, ADDRC, ADDRD,
1362 input DIA, DIB, DIC, DID,
1364 (* invertible_pin = "IS_WCLK_INVERTED" *)
1368 parameter [63:0] INIT_A = 64'h0000000000000000;
1369 parameter [63:0] INIT_B = 64'h0000000000000000;
1370 parameter [63:0] INIT_C = 64'h0000000000000000;
1371 parameter [63:0] INIT_D = 64'h0000000000000000;
1372 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1373 reg [63:0] mem_a = INIT_A;
1374 reg [63:0] mem_b = INIT_B;
1375 reg [63:0] mem_c = INIT_C;
1376 reg [63:0] mem_d = INIT_D;
1377 assign DOA = mem_a[ADDRA];
1378 assign DOB = mem_b[ADDRB];
1379 assign DOC = mem_c[ADDRC];
1380 assign DOD = mem_d[ADDRD];
1381 wire clk = WCLK ^ IS_WCLK_INVERTED;
1382 always @(posedge clk)
1384 mem_a[ADDRD] <= DIA;
1385 mem_b[ADDRD] <= DIB;
1386 mem_c[ADDRD] <= DIC;
1387 mem_d[ADDRD] <= DID;
1417 (* invertible_pin = "IS_WCLK_INVERTED" *)
1421 parameter [63:0] INIT_A = 64'h0000000000000000;
1422 parameter [63:0] INIT_B = 64'h0000000000000000;
1423 parameter [63:0] INIT_C = 64'h0000000000000000;
1424 parameter [63:0] INIT_D = 64'h0000000000000000;
1425 parameter [63:0] INIT_E = 64'h0000000000000000;
1426 parameter [63:0] INIT_F = 64'h0000000000000000;
1427 parameter [63:0] INIT_G = 64'h0000000000000000;
1428 parameter [63:0] INIT_H = 64'h0000000000000000;
1429 parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1430 reg [63:0] mem_a = INIT_A;
1431 reg [63:0] mem_b = INIT_B;
1432 reg [63:0] mem_c = INIT_C;
1433 reg [63:0] mem_d = INIT_D;
1434 reg [63:0] mem_e = INIT_E;
1435 reg [63:0] mem_f = INIT_F;
1436 reg [63:0] mem_g = INIT_G;
1437 reg [63:0] mem_h = INIT_H;
1438 assign DOA = mem_a[ADDRA];
1439 assign DOB = mem_b[ADDRB];
1440 assign DOC = mem_c[ADDRC];
1441 assign DOD = mem_d[ADDRD];
1442 assign DOE = mem_e[ADDRE];
1443 assign DOF = mem_f[ADDRF];
1444 assign DOG = mem_g[ADDRG];
1445 assign DOH = mem_h[ADDRH];
1446 wire clk = WCLK ^ IS_WCLK_INVERTED;
1447 always @(posedge clk)
1449 mem_a[ADDRH] <= DIA;
1450 mem_b[ADDRH] <= DIB;
1451 mem_c[ADDRH] <= DIC;
1452 mem_d[ADDRH] <= DID;
1453 mem_e[ADDRH] <= DIE;
1454 mem_f[ADDRH] <= DIF;
1455 mem_g[ADDRH] <= DIG;
1456 mem_h[ADDRH] <= DIH;
1464 input A0, A1, A2, A3
1466 parameter [15:0] INIT = 16'h0;
1467 assign O = INIT[{A3, A2, A1, A0}];
1472 input A0, A1, A2, A3, A4
1474 parameter [31:0] INIT = 32'h0;
1475 assign O = INIT[{A4, A3, A2, A1, A0}];
1480 input A0, A1, A2, A3, A4, A5
1482 parameter [63:0] INIT = 64'h0;
1483 assign O = INIT[{A5, A4, A3, A2, A1, A0}];
1488 input A0, A1, A2, A3, A4, A5, A6
1490 parameter [127:0] INIT = 128'h0;
1491 assign O = INIT[{A6, A5, A4, A3, A2, A1, A0}];
1496 input A0, A1, A2, A3, A4, A5, A6, A7
1498 parameter [255:0] INIT = 256'h0;
1499 assign O = INIT[{A7, A6, A5, A4, A3, A2, A1, A0}];
1506 input A0, A1, A2, A3,
1511 parameter [15:0] INIT = 16'h0000;
1513 reg [15:0] r = INIT;
1514 assign Q = r[{A3,A2,A1,A0}];
1515 always @(posedge CLK) r <= { r[14:0], D };
1519 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904-L905
1520 (* abc9_arrival=1472 *)
1522 input A0, A1, A2, A3, CE,
1524 (* invertible_pin = "IS_CLK_INVERTED" *)
1528 parameter [15:0] INIT = 16'h0000;
1529 parameter [0:0] IS_CLK_INVERTED = 1'b0;
1531 reg [15:0] r = INIT;
1532 assign Q = r[{A3,A2,A1,A0}];
1534 if (IS_CLK_INVERTED) begin
1535 always @(negedge CLK) if (CE) r <= { r[14:0], D };
1538 always @(posedge CLK) if (CE) r <= { r[14:0], D };
1545 input A0, A1, A2, A3,
1550 parameter [15:0] INIT = 16'h0000;
1552 reg [15:0] r = INIT;
1554 assign Q = r[{A3,A2,A1,A0}];
1555 always @(posedge CLK) r <= { r[14:0], D };
1561 input A0, A1, A2, A3, CE,
1563 (* invertible_pin = "IS_CLK_INVERTED" *)
1567 parameter [15:0] INIT = 16'h0000;
1568 parameter [0:0] IS_CLK_INVERTED = 1'b0;
1570 reg [15:0] r = INIT;
1572 assign Q = r[{A3,A2,A1,A0}];
1574 if (IS_CLK_INVERTED) begin
1575 always @(negedge CLK) if (CE) r <= { r[14:0], D };
1578 always @(posedge CLK) if (CE) r <= { r[14:0], D };
1583 // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904-L905
1584 (* abc9_arrival=1472 *)
1586 (* abc9_arrival=1114 *)
1591 (* invertible_pin = "IS_CLK_INVERTED" *)
1595 parameter [31:0] INIT = 32'h00000000;
1596 parameter [0:0] IS_CLK_INVERTED = 1'b0;
1598 reg [31:0] r = INIT;
1602 if (IS_CLK_INVERTED) begin
1603 always @(negedge CLK) if (CE) r <= { r[30:0], D };
1606 always @(posedge CLK) if (CE) r <= { r[30:0], D };
1622 (* invertible_pin = "IS_CLK_INVERTED" *)
1625 parameter [31:0] INIT = 32'h00000000;
1626 parameter [0:0] IS_CLK_INVERTED = 1'b0;
1627 wire clk = CLK ^ IS_CLK_INVERTED;
1628 reg [31:0] r = INIT;
1630 assign O5 = r[{1'b0, I3, I2, I1, I0}];
1631 assign O6 = r[{I4, I3, I2, I1, I0}];
1632 always @(posedge clk) if (CE) r <= {r[30:0], CDI};
1637 // Virtex 2, Virtex 2 Pro, Spartan 3.
1639 // Asynchronous mode.
1642 input signed [17:0] A,
1643 input signed [17:0] B,
1644 output signed [35:0] P
1651 // Synchronous mode.
1654 input signed [17:0] A,
1655 input signed [17:0] B,
1656 output reg signed [35:0] P,
1671 // Spartan 3E, Spartan 3A.
1673 module MULT18X18SIO (
1674 input signed [17:0] A,
1675 input signed [17:0] B,
1676 output signed [35:0] P,
1685 input signed [17:0] BCIN,
1686 output signed [17:0] BCOUT
1689 parameter integer AREG = 1;
1690 parameter integer BREG = 1;
1691 parameter B_INPUT = "DIRECT";
1692 parameter integer PREG = 1;
1695 wire signed [35:0] P_MULT;
1696 assign P_MULT = A_MULT * B_MULT;
1698 // The cascade output.
1699 assign BCOUT = B_MULT;
1701 // The B input multiplexer.
1702 wire signed [17:0] B_MUX;
1703 assign B_MUX = (B_INPUT == "DIRECT") ? B : BCIN;
1706 reg signed [17:0] A_REG;
1707 reg signed [17:0] B_REG;
1708 reg signed [35:0] P_REG;
1716 always @(posedge CLK) begin
1733 // The register enables.
1734 wire signed [17:0] A_MULT;
1735 wire signed [17:0] B_MULT;
1736 assign A_MULT = (AREG == 1) ? A_REG : A;
1737 assign B_MULT = (BREG == 1) ? B_REG : B_MUX;
1738 assign P = (PREG == 1) ? P_REG : P_MULT;
1745 input signed [17:0] A,
1746 input signed [17:0] B,
1747 input signed [47:0] C,
1748 input signed [17:0] D,
1749 input signed [47:0] PCIN,
1752 output signed [47:0] P,
1753 output signed [17:0] BCOUT,
1754 output signed [47:0] PCOUT,
1776 parameter integer A0REG = 0;
1777 parameter integer A1REG = 1;
1778 parameter integer B0REG = 0;
1779 parameter integer B1REG = 1;
1780 parameter integer CREG = 1;
1781 parameter integer DREG = 1;
1782 parameter integer MREG = 1;
1783 parameter integer CARRYINREG = 1;
1784 parameter integer OPMODEREG = 1;
1785 parameter integer PREG = 1;
1786 parameter CARRYINSEL = "CARRYIN";
1787 parameter RSTTYPE = "SYNC";
1789 // This is a strict subset of Spartan 6 -- reuse its model.
1799 .CARRYINREG(CARRYINREG),
1801 .OPMODEREG(OPMODEREG),
1803 .CARRYINSEL(CARRYINSEL),
1817 .CARRYOUT(CARRYOUT),
1818 // CARRYOUTF unconnected
1825 .CECARRYIN(CECARRYIN),
1826 .CEOPMODE(CEOPMODE),
1833 .RSTCARRYIN(RSTCARRYIN),
1834 .RSTOPMODE(RSTOPMODE),
1843 input signed [17:0] A,
1844 input signed [17:0] B,
1845 input signed [47:0] C,
1846 input signed [17:0] D,
1847 input signed [47:0] PCIN,
1850 output signed [35:0] M,
1851 output signed [47:0] P,
1852 output signed [17:0] BCOUT,
1853 output signed [47:0] PCOUT,
1876 parameter integer A0REG = 0;
1877 parameter integer A1REG = 1;
1878 parameter integer B0REG = 0;
1879 parameter integer B1REG = 1;
1880 parameter integer CREG = 1;
1881 parameter integer DREG = 1;
1882 parameter integer MREG = 1;
1883 parameter integer CARRYINREG = 1;
1884 parameter integer CARRYOUTREG = 1;
1885 parameter integer OPMODEREG = 1;
1886 parameter integer PREG = 1;
1887 parameter CARRYINSEL = "OPMODE5";
1888 parameter RSTTYPE = "SYNC";
1890 wire signed [35:0] M_MULT;
1891 wire signed [47:0] P_IN;
1892 wire signed [17:0] A0_OUT;
1893 wire signed [17:0] B0_OUT;
1894 wire signed [17:0] A1_OUT;
1895 wire signed [17:0] B1_OUT;
1896 wire signed [17:0] B1_IN;
1897 wire signed [47:0] C_OUT;
1898 wire signed [17:0] D_OUT;
1899 wire signed [7:0] OPMODE_OUT;
1903 reg signed [47:0] XMUX;
1904 reg signed [47:0] ZMUX;
1907 reg signed [17:0] A0_REG;
1908 reg signed [17:0] A1_REG;
1909 reg signed [17:0] B0_REG;
1910 reg signed [17:0] B1_REG;
1911 reg signed [47:0] C_REG;
1912 reg signed [17:0] D_REG;
1913 reg signed [35:0] M_REG;
1914 reg signed [47:0] P_REG;
1915 reg [7:0] OPMODE_REG;
1935 if (RSTTYPE == "SYNC") begin
1936 always @(posedge CLK) begin
1940 end else if (CEA) begin
1946 always @(posedge CLK) begin
1950 end else if (CEB) begin
1956 always @(posedge CLK) begin
1959 end else if (CEC) begin
1964 always @(posedge CLK) begin
1967 end else if (CED) begin
1972 always @(posedge CLK) begin
1975 end else if (CEM) begin
1980 always @(posedge CLK) begin
1983 end else if (CEP) begin
1988 always @(posedge CLK) begin
1989 if (RSTOPMODE) begin
1991 end else if (CEOPMODE) begin
1992 OPMODE_REG <= OPMODE;
1996 always @(posedge CLK) begin
1997 if (RSTCARRYIN) begin
2000 end else if (CECARRYIN) begin
2001 CARRYIN_REG <= CARRYIN_IN;
2002 CARRYOUT_REG <= CARRYOUT_IN;
2006 always @(posedge CLK, posedge RSTA) begin
2010 end else if (CEA) begin
2016 always @(posedge CLK, posedge RSTB) begin
2020 end else if (CEB) begin
2026 always @(posedge CLK, posedge RSTC) begin
2029 end else if (CEC) begin
2034 always @(posedge CLK, posedge RSTD) begin
2037 end else if (CED) begin
2042 always @(posedge CLK, posedge RSTM) begin
2045 end else if (CEM) begin
2050 always @(posedge CLK, posedge RSTP) begin
2053 end else if (CEP) begin
2058 always @(posedge CLK, posedge RSTOPMODE) begin
2059 if (RSTOPMODE) begin
2061 end else if (CEOPMODE) begin
2062 OPMODE_REG <= OPMODE;
2066 always @(posedge CLK, posedge RSTCARRYIN) begin
2067 if (RSTCARRYIN) begin
2070 end else if (CECARRYIN) begin
2071 CARRYIN_REG <= CARRYIN_IN;
2072 CARRYOUT_REG <= CARRYOUT_IN;
2079 // The register enables.
2080 assign A0_OUT = (A0REG == 1) ? A0_REG : A;
2081 assign A1_OUT = (A1REG == 1) ? A1_REG : A0_OUT;
2082 assign B0_OUT = (B0REG == 1) ? B0_REG : B;
2083 assign B1_OUT = (B1REG == 1) ? B1_REG : B1_IN;
2084 assign C_OUT = (CREG == 1) ? C_REG : C;
2085 assign D_OUT = (DREG == 1) ? D_REG : D;
2086 assign M = (MREG == 1) ? M_REG : M_MULT;
2087 assign P = (PREG == 1) ? P_REG : P_IN;
2088 assign OPMODE_OUT = (OPMODEREG == 1) ? OPMODE_REG : OPMODE;
2089 assign CARRYIN_OUT = (CARRYINREG == 1) ? CARRYIN_REG : CARRYIN_IN;
2090 assign CARRYOUT = (CARRYOUTREG == 1) ? CARRYOUT_REG : CARRYOUT_IN;
2091 assign CARRYOUTF = CARRYOUT;
2094 wire signed [17:0] PREADDER;
2095 assign B1_IN = OPMODE_OUT[4] ? PREADDER : B0_OUT;
2096 assign PREADDER = OPMODE_OUT[6] ? D_OUT - B0_OUT : D_OUT + B0_OUT;
2099 assign M_MULT = A1_OUT * B1_OUT;
2101 // The carry in selection.
2102 assign CARRYIN_IN = (CARRYINSEL == "OPMODE5") ? OPMODE_OUT[5] : CARRYIN;
2104 // The post-adder inputs.
2106 case (OPMODE_OUT[1:0])
2110 2'b11: XMUX <= {D_OUT[11:0], A1_OUT, B1_OUT};
2111 default: XMUX <= 48'hxxxxxxxxxxxx;
2116 case (OPMODE_OUT[3:2])
2118 2'b01: ZMUX <= PCIN;
2120 2'b11: ZMUX <= C_OUT;
2121 default: ZMUX <= 48'hxxxxxxxxxxxx;
2126 wire signed [48:0] X_EXT;
2127 wire signed [48:0] Z_EXT;
2128 assign X_EXT = {1'b0, XMUX};
2129 assign Z_EXT = {1'b0, ZMUX};
2130 assign {CARRYOUT_IN, P_IN} = OPMODE_OUT[7] ? (Z_EXT - (X_EXT + CARRYIN_OUT)) : (Z_EXT + X_EXT + CARRYIN_OUT);
2133 assign BCOUT = B1_OUT;
2138 // TODO: DSP48 (Virtex 4).
2140 // TODO: DSP48E (Virtex 5).
2142 // Virtex 6, Series 7.
2145 output [29:0] ACOUT,
2146 output [17:0] BCOUT,
2147 output reg CARRYCASCOUT,
2148 output reg [3:0] CARRYOUT,
2149 output reg MULTSIGNOUT,
2151 output reg signed [47:0] P,
2152 output reg PATTERNBDETECT,
2153 output reg PATTERNDETECT,
2154 output [47:0] PCOUT,
2156 input signed [29:0] A,
2158 input [3:0] ALUMODE,
2159 input signed [17:0] B,
2164 input [2:0] CARRYINSEL,
2178 (* clkbuf_sink *) input CLK,
2185 input RSTALLCARRYIN,
2195 parameter integer ACASCREG = 1;
2196 parameter integer ADREG = 1;
2197 parameter integer ALUMODEREG = 1;
2198 parameter integer AREG = 1;
2199 parameter AUTORESET_PATDET = "NO_RESET";
2200 parameter A_INPUT = "DIRECT";
2201 parameter integer BCASCREG = 1;
2202 parameter integer BREG = 1;
2203 parameter B_INPUT = "DIRECT";
2204 parameter integer CARRYINREG = 1;
2205 parameter integer CARRYINSELREG = 1;
2206 parameter integer CREG = 1;
2207 parameter integer DREG = 1;
2208 parameter integer INMODEREG = 1;
2209 parameter integer MREG = 1;
2210 parameter integer OPMODEREG = 1;
2211 parameter integer PREG = 1;
2212 parameter SEL_MASK = "MASK";
2213 parameter SEL_PATTERN = "PATTERN";
2214 parameter USE_DPORT = "FALSE";
2215 parameter USE_MULT = "MULTIPLY";
2216 parameter USE_PATTERN_DETECT = "NO_PATDET";
2217 parameter USE_SIMD = "ONE48";
2218 parameter [47:0] MASK = 48'h3FFFFFFFFFFF;
2219 parameter [47:0] PATTERN = 48'h000000000000;
2220 parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
2221 parameter [0:0] IS_CARRYIN_INVERTED = 1'b0;
2222 parameter [0:0] IS_CLK_INVERTED = 1'b0;
2223 parameter [4:0] IS_INMODE_INVERTED = 5'b0;
2224 parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
2228 if (AUTORESET_PATDET != "NO_RESET") $fatal(1, "Unsupported AUTORESET_PATDET value");
2229 if (SEL_MASK != "MASK") $fatal(1, "Unsupported SEL_MASK value");
2230 if (SEL_PATTERN != "PATTERN") $fatal(1, "Unsupported SEL_PATTERN value");
2231 if (USE_SIMD != "ONE48" && USE_SIMD != "TWO24" && USE_SIMD != "FOUR12") $fatal(1, "Unsupported USE_SIMD value");
2232 if (IS_ALUMODE_INVERTED != 4'b0) $fatal(1, "Unsupported IS_ALUMODE_INVERTED value");
2233 if (IS_CARRYIN_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CARRYIN_INVERTED value");
2234 if (IS_CLK_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CLK_INVERTED value");
2235 if (IS_INMODE_INVERTED != 5'b0) $fatal(1, "Unsupported IS_INMODE_INVERTED value");
2236 if (IS_OPMODE_INVERTED != 7'b0) $fatal(1, "Unsupported IS_OPMODE_INVERTED value");
2240 wire signed [29:0] A_muxed;
2241 wire signed [17:0] B_muxed;
2244 if (A_INPUT == "CASCADE") assign A_muxed = ACIN;
2245 else assign A_muxed = A;
2247 if (B_INPUT == "CASCADE") assign B_muxed = BCIN;
2248 else assign B_muxed = B;
2251 reg signed [29:0] Ar1, Ar2;
2252 reg signed [24:0] Dr;
2253 reg signed [17:0] Br1, Br2;
2254 reg signed [47:0] Cr;
2255 reg [4:0] INMODEr = 5'b0;
2256 reg [6:0] OPMODEr = 7'b0;
2257 reg [3:0] ALUMODEr = 4'b0;
2258 reg [2:0] CARRYINSELr = 3'b0;
2261 // Configurable A register
2262 if (AREG == 2) begin
2263 initial Ar1 = 30'b0;
2264 initial Ar2 = 30'b0;
2265 always @(posedge CLK)
2270 if (CEA1) Ar1 <= A_muxed;
2271 if (CEA2) Ar2 <= Ar1;
2273 end else if (AREG == 1) begin
2274 //initial Ar1 = 30'b0;
2275 initial Ar2 = 30'b0;
2276 always @(posedge CLK)
2281 if (CEA1) Ar1 <= A_muxed;
2282 if (CEA2) Ar2 <= A_muxed;
2285 always @* Ar1 <= A_muxed;
2286 always @* Ar2 <= A_muxed;
2289 // Configurable B register
2290 if (BREG == 2) begin
2291 initial Br1 = 25'b0;
2292 initial Br2 = 25'b0;
2293 always @(posedge CLK)
2298 if (CEB1) Br1 <= B_muxed;
2299 if (CEB2) Br2 <= Br1;
2301 end else if (BREG == 1) begin
2302 //initial Br1 = 25'b0;
2303 initial Br2 = 25'b0;
2304 always @(posedge CLK)
2309 if (CEB1) Br1 <= B_muxed;
2310 if (CEB2) Br2 <= B_muxed;
2313 always @* Br1 <= B_muxed;
2314 always @* Br2 <= B_muxed;
2317 // C and D registers
2318 if (CREG == 1) initial Cr = 48'b0;
2319 if (CREG == 1) begin always @(posedge CLK) if (RSTC) Cr <= 48'b0; else if (CEC) Cr <= C; end
2320 else always @* Cr <= C;
2322 if (CREG == 1) initial Dr = 25'b0;
2323 if (DREG == 1) begin always @(posedge CLK) if (RSTD) Dr <= 25'b0; else if (CED) Dr <= D; end
2324 else always @* Dr <= D;
2326 // Control registers
2327 if (INMODEREG == 1) initial INMODEr = 5'b0;
2328 if (INMODEREG == 1) begin always @(posedge CLK) if (RSTINMODE) INMODEr <= 5'b0; else if (CEINMODE) INMODEr <= INMODE; end
2329 else always @* INMODEr <= INMODE;
2330 if (OPMODEREG == 1) initial OPMODEr = 7'b0;
2331 if (OPMODEREG == 1) begin always @(posedge CLK) if (RSTCTRL) OPMODEr <= 7'b0; else if (CECTRL) OPMODEr <= OPMODE; end
2332 else always @* OPMODEr <= OPMODE;
2333 if (ALUMODEREG == 1) initial ALUMODEr = 4'b0;
2334 if (ALUMODEREG == 1) begin always @(posedge CLK) if (RSTALUMODE) ALUMODEr <= 4'b0; else if (CEALUMODE) ALUMODEr <= ALUMODE; end
2335 else always @* ALUMODEr <= ALUMODE;
2336 if (CARRYINSELREG == 1) initial CARRYINSELr = 3'b0;
2337 if (CARRYINSELREG == 1) begin always @(posedge CLK) if (RSTCTRL) CARRYINSELr <= 3'b0; else if (CECTRL) CARRYINSELr <= CARRYINSEL; end
2338 else always @* CARRYINSELr <= CARRYINSEL;
2343 if (ACASCREG == 1 && AREG == 2) assign ACOUT = Ar1;
2344 else assign ACOUT = Ar2;
2345 if (BCASCREG == 1 && BREG == 2) assign BCOUT = Br1;
2346 else assign BCOUT = Br2;
2349 // A/D input selection and pre-adder
2350 wire signed [29:0] Ar12_muxed = INMODEr[0] ? Ar1 : Ar2;
2351 wire signed [24:0] Ar12_gated = INMODEr[1] ? 25'b0 : Ar12_muxed;
2352 wire signed [24:0] Dr_gated = INMODEr[2] ? Dr : 25'b0;
2353 wire signed [24:0] AD_result = INMODEr[3] ? (Dr_gated - Ar12_gated) : (Dr_gated + Ar12_gated);
2354 reg signed [24:0] ADr;
2357 if (ADREG == 1) initial ADr = 25'b0;
2358 if (ADREG == 1) begin always @(posedge CLK) if (RSTD) ADr <= 25'b0; else if (CEAD) ADr <= AD_result; end
2359 else always @* ADr <= AD_result;
2363 wire signed [24:0] A_MULT;
2364 wire signed [17:0] B_MULT = INMODEr[4] ? Br1 : Br2;
2366 if (USE_DPORT == "TRUE") assign A_MULT = ADr;
2367 else assign A_MULT = Ar12_gated;
2370 wire signed [42:0] M = A_MULT * B_MULT;
2371 wire signed [42:0] Mx = (CARRYINSEL == 3'b010) ? 43'bx : M;
2372 reg signed [42:0] Mr = 43'b0;
2374 // Multiplier result register
2376 if (MREG == 1) begin always @(posedge CLK) if (RSTM) Mr <= 43'b0; else if (CEM) Mr <= Mx; end
2377 else always @* Mr <= Mx;
2380 wire signed [42:0] Mrx = (CARRYINSELr == 3'b010) ? 43'bx : Mr;
2382 // X, Y and Z ALU inputs
2383 reg signed [47:0] X, Y, Z;
2389 2'b01: begin X = $signed(Mrx);
2391 if (OPMODEr[3:2] != 2'b01) $fatal(1, "OPMODEr[3:2] must be 2'b01 when OPMODEr[1:0] is 2'b01");
2396 if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[1:0] is 2'b10");
2399 2'b11: X = $signed({Ar2, Br2});
2406 2'b01: begin Y = 48'b0; // FIXME: more accurate partial product modelling?
2408 if (OPMODEr[1:0] != 2'b01) $fatal(1, "OPMODEr[1:0] must be 2'b01 when OPMODEr[3:2] is 2'b01");
2411 2'b10: Y = {48{1'b1}};
2420 3'b010: begin Z = P;
2422 if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] i0s 3'b010");
2426 3'b100: begin Z = P;
2428 if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b100");
2429 if (OPMODEr[3:0] != 4'b1000) $fatal(1, "OPMODEr[3:0] must be 4'b1000 when OPMODEr[6:4] i0s 3'b100");
2432 3'b101: Z = $signed(PCIN[47:17]);
2433 3'b110: Z = $signed(P[47:17]);
2439 wire A24_xnor_B17d = A_MULT[24] ~^ B_MULT[17];
2440 reg CARRYINr = 1'b0, A24_xnor_B17 = 1'b0;
2442 if (CARRYINREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) CARRYINr <= 1'b0; else if (CECARRYIN) CARRYINr <= CARRYIN; end
2443 else always @* CARRYINr = CARRYIN;
2445 if (MREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) A24_xnor_B17 <= 1'b0; else if (CEM) A24_xnor_B17 <= A24_xnor_B17d; end
2446 else always @* A24_xnor_B17 = A24_xnor_B17d;
2453 3'b000: cin_muxed = CARRYINr;
2454 3'b001: cin_muxed = ~PCIN[47];
2455 3'b010: cin_muxed = CARRYCASCIN;
2456 3'b011: cin_muxed = PCIN[47];
2457 3'b100: cin_muxed = CARRYCASCOUT;
2458 3'b101: cin_muxed = ~P[47];
2459 3'b110: cin_muxed = A24_xnor_B17;
2460 3'b111: cin_muxed = P[47];
2461 default: cin_muxed = 1'bx;
2465 wire alu_cin = (ALUMODEr[3] || ALUMODEr[2]) ? 1'b0 : cin_muxed;
2468 wire [47:0] Z_muxinv = ALUMODEr[0] ? ~Z : Z;
2469 wire [47:0] xor_xyz = X ^ Y ^ Z_muxinv;
2470 wire [47:0] maj_xyz = (X & Y) | (X & Z_muxinv) | (Y & Z_muxinv);
2472 wire [47:0] xor_xyz_muxed = ALUMODEr[3] ? maj_xyz : xor_xyz;
2473 wire [47:0] maj_xyz_gated = ALUMODEr[2] ? 48'b0 : maj_xyz;
2475 wire [48:0] maj_xyz_simd_gated;
2476 wire [3:0] int_carry_in, int_carry_out, ext_carry_out;
2477 wire [47:0] alu_sum;
2478 assign int_carry_in[0] = 1'b0;
2479 wire [3:0] carryout_reset;
2482 if (USE_SIMD == "FOUR12") begin
2483 assign maj_xyz_simd_gated = {
2484 maj_xyz_gated[47:36],
2485 1'b0, maj_xyz_gated[34:24],
2486 1'b0, maj_xyz_gated[22:12],
2487 1'b0, maj_xyz_gated[10:0],
2490 assign int_carry_in[3:1] = 3'b000;
2491 assign ext_carry_out = {
2493 maj_xyz_gated[35] ^ int_carry_out[2],
2494 maj_xyz_gated[23] ^ int_carry_out[1],
2495 maj_xyz_gated[11] ^ int_carry_out[0]
2497 assign carryout_reset = 4'b0000;
2498 end else if (USE_SIMD == "TWO24") begin
2499 assign maj_xyz_simd_gated = {
2500 maj_xyz_gated[47:24],
2501 1'b0, maj_xyz_gated[22:0],
2504 assign int_carry_in[3:1] = {int_carry_out[2], 1'b0, int_carry_out[0]};
2505 assign ext_carry_out = {
2508 maj_xyz_gated[23] ^ int_carry_out[1],
2511 assign carryout_reset = 4'b0x0x;
2513 assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
2514 assign int_carry_in[3:1] = int_carry_out[2:0];
2515 assign ext_carry_out = {
2519 assign carryout_reset = 4'b0xxx;
2523 for (i = 0; i < 4; i = i + 1)
2524 assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
2525 + xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
2528 wire signed [47:0] Pd = ALUMODEr[1] ? ~alu_sum : alu_sum;
2529 wire [3:0] CARRYOUTd = (OPMODEr[3:0] == 4'b0101 || ALUMODEr[3:2] != 2'b00) ? 4'bxxxx :
2530 ((ALUMODEr[0] & ALUMODEr[1]) ? ~ext_carry_out : ext_carry_out);
2531 wire CARRYCASCOUTd = ext_carry_out[3];
2532 wire MULTSIGNOUTd = Mrx[42];
2535 if (PREG == 1) begin
2537 initial CARRYOUT = carryout_reset;
2538 initial CARRYCASCOUT = 1'b0;
2539 initial MULTSIGNOUT = 1'b0;
2540 always @(posedge CLK)
2543 CARRYOUT <= carryout_reset;
2544 CARRYCASCOUT <= 1'b0;
2545 MULTSIGNOUT <= 1'b0;
2546 end else if (CEP) begin
2548 CARRYOUT <= CARRYOUTd;
2549 CARRYCASCOUT <= CARRYCASCOUTd;
2550 MULTSIGNOUT <= MULTSIGNOUTd;
2555 CARRYOUT = CARRYOUTd;
2556 CARRYCASCOUT = CARRYCASCOUTd;
2557 MULTSIGNOUT = MULTSIGNOUTd;
2565 wire PATTERNDETECTd, PATTERNBDETECTd;
2567 if (USE_PATTERN_DETECT == "PATDET") begin
2568 // TODO: Support SEL_PATTERN != "PATTERN" and SEL_MASK != "MASK
2569 assign PATTERNDETECTd = &(~(Pd ^ PATTERN) | MASK);
2570 assign PATTERNBDETECTd = &((Pd ^ PATTERN) | MASK);
2572 assign PATTERNDETECTd = 1'b1;
2573 assign PATTERNBDETECTd = 1'b1;
2576 if (PREG == 1) begin
2577 reg PATTERNDETECTPAST, PATTERNBDETECTPAST;
2578 initial PATTERNDETECT = 1'b0;
2579 initial PATTERNBDETECT = 1'b0;
2580 initial PATTERNDETECTPAST = 1'b0;
2581 initial PATTERNBDETECTPAST = 1'b0;
2582 always @(posedge CLK)
2584 PATTERNDETECT <= 1'b0;
2585 PATTERNBDETECT <= 1'b0;
2586 PATTERNDETECTPAST <= 1'b0;
2587 PATTERNBDETECTPAST <= 1'b0;
2588 end else if (CEP) begin
2589 PATTERNDETECT <= PATTERNDETECTd;
2590 PATTERNBDETECT <= PATTERNBDETECTd;
2591 PATTERNDETECTPAST <= PATTERNDETECT;
2592 PATTERNBDETECTPAST <= PATTERNBDETECT;
2594 assign OVERFLOW = &{PATTERNDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
2595 assign UNDERFLOW = &{PATTERNBDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
2598 PATTERNDETECT = PATTERNDETECTd;
2599 PATTERNBDETECT = PATTERNBDETECTd;
2601 assign OVERFLOW = 1'bx, UNDERFLOW = 1'bx;
2607 // TODO: DSP48E2 (Ultrascale).