@yowasp/yosys 0.57.985 → 0.58.1010

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4397 +0,0 @@
1
- /*
2
- * yosys -- Yosys Open SYnthesis Suite
3
- *
4
- * Copyright (C) 2012 Claire Xenia Wolf <claire@yosyshq.com>
5
- *
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.
9
- *
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.
17
- *
18
- */
19
-
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
23
-
24
- module VCC(output P);
25
- assign P = 1;
26
- endmodule
27
-
28
- module GND(output G);
29
- assign G = 0;
30
- endmodule
31
-
32
- module IBUF(
33
- output O,
34
- (* iopad_external_pin *)
35
- input I);
36
- parameter CCIO_EN = "TRUE";
37
- parameter CAPACITANCE = "DONT_CARE";
38
- parameter IBUF_DELAY_VALUE = "0";
39
- parameter IBUF_LOW_PWR = "TRUE";
40
- parameter IFD_DELAY_VALUE = "AUTO";
41
- parameter IOSTANDARD = "DEFAULT";
42
- assign O = I;
43
- specify
44
- (I => O) = 0;
45
- endspecify
46
- endmodule
47
-
48
- module IBUFG(
49
- output O,
50
- (* iopad_external_pin *)
51
- input I);
52
- parameter CAPACITANCE = "DONT_CARE";
53
- parameter IBUF_DELAY_VALUE = "0";
54
- parameter IBUF_LOW_PWR = "TRUE";
55
- parameter IOSTANDARD = "DEFAULT";
56
- assign O = I;
57
- endmodule
58
-
59
- module OBUF(
60
- (* iopad_external_pin *)
61
- output O,
62
- input I);
63
- parameter CAPACITANCE = "DONT_CARE";
64
- parameter IOSTANDARD = "DEFAULT";
65
- parameter DRIVE = 12;
66
- parameter SLEW = "SLOW";
67
- assign O = I;
68
- specify
69
- (I => O) = 0;
70
- endspecify
71
- endmodule
72
-
73
- module IOBUF (
74
- (* iopad_external_pin *)
75
- inout IO,
76
- output O,
77
- input I,
78
- input T
79
- );
80
- parameter integer DRIVE = 12;
81
- parameter IBUF_LOW_PWR = "TRUE";
82
- parameter IOSTANDARD = "DEFAULT";
83
- parameter SLEW = "SLOW";
84
- assign IO = T ? 1'bz : I;
85
- assign O = IO;
86
- specify
87
- (I => IO) = 0;
88
- (IO => O) = 0;
89
- endspecify
90
- endmodule
91
-
92
- module OBUFT (
93
- (* iopad_external_pin *)
94
- output O,
95
- input I,
96
- input T
97
- );
98
- parameter CAPACITANCE = "DONT_CARE";
99
- parameter integer DRIVE = 12;
100
- parameter IOSTANDARD = "DEFAULT";
101
- parameter SLEW = "SLOW";
102
- assign O = T ? 1'bz : I;
103
- specify
104
- (I => O) = 0;
105
- endspecify
106
- endmodule
107
-
108
- module BUFG(
109
- (* clkbuf_driver *)
110
- output O,
111
- input I);
112
- assign O = I;
113
- specify
114
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/CLK_BUFG_TOP_R.sdf#L11
115
- (I => O) = 96;
116
- endspecify
117
- endmodule
118
-
119
- module BUFGCTRL(
120
- (* clkbuf_driver *)
121
- output O,
122
- input I0, input I1,
123
- (* invertible_pin = "IS_S0_INVERTED" *)
124
- input S0,
125
- (* invertible_pin = "IS_S1_INVERTED" *)
126
- input S1,
127
- (* invertible_pin = "IS_CE0_INVERTED" *)
128
- input CE0,
129
- (* invertible_pin = "IS_CE1_INVERTED" *)
130
- input CE1,
131
- (* invertible_pin = "IS_IGNORE0_INVERTED" *)
132
- input IGNORE0,
133
- (* invertible_pin = "IS_IGNORE1_INVERTED" *)
134
- input IGNORE1);
135
-
136
- parameter [0:0] INIT_OUT = 1'b0;
137
- parameter PRESELECT_I0 = "FALSE";
138
- parameter PRESELECT_I1 = "FALSE";
139
- parameter [0:0] IS_CE0_INVERTED = 1'b0;
140
- parameter [0:0] IS_CE1_INVERTED = 1'b0;
141
- parameter [0:0] IS_S0_INVERTED = 1'b0;
142
- parameter [0:0] IS_S1_INVERTED = 1'b0;
143
- parameter [0:0] IS_IGNORE0_INVERTED = 1'b0;
144
- parameter [0:0] IS_IGNORE1_INVERTED = 1'b0;
145
-
146
- wire I0_internal = ((CE0 ^ IS_CE0_INVERTED) ? I0 : INIT_OUT);
147
- wire I1_internal = ((CE1 ^ IS_CE1_INVERTED) ? I1 : INIT_OUT);
148
- wire S0_true = (S0 ^ IS_S0_INVERTED);
149
- wire S1_true = (S1 ^ IS_S1_INVERTED);
150
-
151
- assign O = S0_true ? I0_internal : (S1_true ? I1_internal : INIT_OUT);
152
-
153
- endmodule
154
-
155
- module BUFHCE(
156
- (* clkbuf_driver *)
157
- output O,
158
- input I,
159
- (* invertible_pin = "IS_CE_INVERTED" *)
160
- input CE);
161
-
162
- parameter [0:0] INIT_OUT = 1'b0;
163
- parameter CE_TYPE = "SYNC";
164
- parameter [0:0] IS_CE_INVERTED = 1'b0;
165
-
166
- assign O = ((CE ^ IS_CE_INVERTED) ? I : INIT_OUT);
167
-
168
- endmodule
169
-
170
- // module OBUFT(output O, input I, T);
171
- // assign O = T ? 1'bz : I;
172
- // endmodule
173
-
174
- // module IOBUF(inout IO, output O, input I, T);
175
- // assign O = IO, IO = T ? 1'bz : I;
176
- // endmodule
177
-
178
- module INV(
179
- (* clkbuf_inv = "I" *)
180
- output O,
181
- input I
182
- );
183
- assign O = !I;
184
- specify
185
- (I => O) = 127;
186
- endspecify
187
- endmodule
188
-
189
- (* abc9_lut=1 *)
190
- module LUT1(output O, input I0);
191
- parameter [1:0] INIT = 0;
192
- assign O = I0 ? INIT[1] : INIT[0];
193
- specify
194
- (I0 => O) = 127;
195
- endspecify
196
- endmodule
197
-
198
- (* abc9_lut=2 *)
199
- module LUT2(output O, input I0, I1);
200
- parameter [3:0] INIT = 0;
201
- wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0];
202
- assign O = I0 ? s1[1] : s1[0];
203
- specify
204
- (I0 => O) = 238;
205
- (I1 => O) = 127;
206
- endspecify
207
- endmodule
208
-
209
- (* abc9_lut=3 *)
210
- module LUT3(output O, input I0, I1, I2);
211
- parameter [7:0] INIT = 0;
212
- wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0];
213
- wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
214
- assign O = I0 ? s1[1] : s1[0];
215
- specify
216
- (I0 => O) = 407;
217
- (I1 => O) = 238;
218
- (I2 => O) = 127;
219
- endspecify
220
- endmodule
221
-
222
- (* abc9_lut=3 *)
223
- module LUT4(output O, input I0, I1, I2, I3);
224
- parameter [15:0] INIT = 0;
225
- wire [ 7: 0] s3 = I3 ? INIT[15: 8] : INIT[ 7: 0];
226
- wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
227
- wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
228
- assign O = I0 ? s1[1] : s1[0];
229
- specify
230
- (I0 => O) = 472;
231
- (I1 => O) = 407;
232
- (I2 => O) = 238;
233
- (I3 => O) = 127;
234
- endspecify
235
- endmodule
236
-
237
- (* abc9_lut=3 *)
238
- module LUT5(output O, input I0, I1, I2, I3, I4);
239
- parameter [31:0] INIT = 0;
240
- wire [15: 0] s4 = I4 ? INIT[31:16] : INIT[15: 0];
241
- wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
242
- wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
243
- wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
244
- assign O = I0 ? s1[1] : s1[0];
245
- specify
246
- (I0 => O) = 631;
247
- (I1 => O) = 472;
248
- (I2 => O) = 407;
249
- (I3 => O) = 238;
250
- (I4 => O) = 127;
251
- endspecify
252
- endmodule
253
-
254
- // This is a placeholder for ABC9 to extract the area/delay
255
- // cost of 3-input LUTs and is not intended to be instantiated
256
-
257
- (* abc9_lut=5 *)
258
- module LUT6(output O, input I0, I1, I2, I3, I4, I5);
259
- parameter [63:0] INIT = 0;
260
- wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
261
- wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
262
- wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
263
- wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
264
- wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
265
- assign O = I0 ? s1[1] : s1[0];
266
- specify
267
- (I0 => O) = 642;
268
- (I1 => O) = 631;
269
- (I2 => O) = 472;
270
- (I3 => O) = 407;
271
- (I4 => O) = 238;
272
- (I5 => O) = 127;
273
- endspecify
274
- endmodule
275
-
276
- module LUT6_2(output O6, output O5, input I0, I1, I2, I3, I4, I5);
277
- parameter [63:0] INIT = 0;
278
- wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0];
279
- wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0];
280
- wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0];
281
- wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0];
282
- wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0];
283
- assign O6 = I0 ? s1[1] : s1[0];
284
-
285
- wire [15: 0] s5_4 = I4 ? INIT[31:16] : INIT[15: 0];
286
- wire [ 7: 0] s5_3 = I3 ? s5_4[15: 8] : s5_4[ 7: 0];
287
- wire [ 3: 0] s5_2 = I2 ? s5_3[ 7: 4] : s5_3[ 3: 0];
288
- wire [ 1: 0] s5_1 = I1 ? s5_2[ 3: 2] : s5_2[ 1: 0];
289
- assign O5 = I0 ? s5_1[1] : s5_1[0];
290
- endmodule
291
-
292
- // This is a placeholder for ABC9 to extract the area/delay
293
- // cost of 3-input LUTs and is not intended to be instantiated
294
- (* abc9_lut=10 *)
295
- module \$__ABC9_LUT7 (output O, input I0, I1, I2, I3, I4, I5, I6);
296
- `ifndef __ICARUS__
297
- specify
298
- // https://github.com/SymbiFlow/prjxray-db/blob/1c85daf1b115da4d27ca83c6b89f53a94de39748/artix7/timings/slicel.sdf#L867
299
- (I0 => O) = 642 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
300
- (I1 => O) = 631 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
301
- (I2 => O) = 472 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
302
- (I3 => O) = 407 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
303
- (I4 => O) = 238 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
304
- (I5 => O) = 127 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
305
- (I6 => O) = 0 + 296 /* to select F7BMUX */ + 174 /* CMUX */;
306
- endspecify
307
- `endif
308
- endmodule
309
-
310
- // This is a placeholder for ABC9 to extract the area/delay
311
- // cost of 3-input LUTs and is not intended to be instantiated
312
- (* abc9_lut=20 *)
313
- module \$__ABC9_LUT8 (output O, input I0, I1, I2, I3, I4, I5, I6, I7);
314
- `ifndef __ICARUS__
315
- specify
316
- // https://github.com/SymbiFlow/prjxray-db/blob/1c85daf1b115da4d27ca83c6b89f53a94de39748/artix7/timings/slicel.sdf#L716
317
- (I0 => O) = 642 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
318
- (I1 => O) = 631 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
319
- (I2 => O) = 472 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
320
- (I3 => O) = 407 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
321
- (I4 => O) = 238 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
322
- (I5 => O) = 127 + 223 /* to cross F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
323
- (I6 => O) = 0 + 296 /* to select F7BMUX */ + 104 /* to cross F8MUX */ + 192 /* BMUX */;
324
- (I7 => O) = 0 + 0 + 273 /* to select F8MUX */ + 192 /* BMUX */;
325
- endspecify
326
- `endif
327
- endmodule
328
-
329
- module MUXCY(output O, input CI, DI, S);
330
- assign O = S ? CI : DI;
331
- endmodule
332
-
333
- module MUXF5(output O, input I0, I1, S);
334
- assign O = S ? I1 : I0;
335
- endmodule
336
-
337
- module MUXF6(output O, input I0, I1, S);
338
- assign O = S ? I1 : I0;
339
- endmodule
340
-
341
- (* abc9_box, lib_whitebox *)
342
- module MUXF7(output O, input I0, I1, S);
343
- assign O = S ? I1 : I0;
344
- specify
345
- // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L451-L453
346
- (I0 => O) = 217;
347
- (I1 => O) = 223;
348
- (S => O) = 296;
349
- endspecify
350
- endmodule
351
-
352
- (* abc9_box, lib_whitebox *)
353
- module MUXF8(output O, input I0, I1, S);
354
- assign O = S ? I1 : I0;
355
- specify
356
- // Max delays from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L462-L464
357
- (I0 => O) = 104;
358
- (I1 => O) = 94;
359
- (S => O) = 273;
360
- endspecify
361
- endmodule
362
-
363
- module MUXF9(output O, input I0, I1, S);
364
- assign O = S ? I1 : I0;
365
- endmodule
366
-
367
- module XORCY(output O, input CI, LI);
368
- assign O = CI ^ LI;
369
- endmodule
370
-
371
- (* abc9_box, lib_whitebox *)
372
- module CARRY4(
373
- (* abc9_carry *)
374
- output [3:0] CO,
375
- output [3:0] O,
376
- (* abc9_carry *)
377
- input CI,
378
- input CYINIT,
379
- input [3:0] DI, S
380
- );
381
- assign O = S ^ {CO[2:0], CI | CYINIT};
382
- assign CO[0] = S[0] ? CI | CYINIT : DI[0];
383
- assign CO[1] = S[1] ? CO[0] : DI[1];
384
- assign CO[2] = S[2] ? CO[1] : DI[2];
385
- assign CO[3] = S[3] ? CO[2] : DI[3];
386
- specify
387
- // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L11-L46
388
- (CYINIT => O[0]) = 482;
389
- (S[0] => O[0]) = 223;
390
- (CI => O[0]) = 222;
391
- (CYINIT => O[1]) = 598;
392
- (DI[0] => O[1]) = 407;
393
- (S[0] => O[1]) = 400;
394
- (S[1] => O[1]) = 205;
395
- (CI => O[1]) = 334;
396
- (CYINIT => O[2]) = 584;
397
- (DI[0] => O[2]) = 556;
398
- (DI[1] => O[2]) = 537;
399
- (S[0] => O[2]) = 523;
400
- (S[1] => O[2]) = 558;
401
- (S[2] => O[2]) = 226;
402
- (CI => O[2]) = 239;
403
- (CYINIT => O[3]) = 642;
404
- (DI[0] => O[3]) = 615;
405
- (DI[1] => O[3]) = 596;
406
- (DI[2] => O[3]) = 438;
407
- (S[0] => O[3]) = 582;
408
- (S[1] => O[3]) = 618;
409
- (S[2] => O[3]) = 330;
410
- (S[3] => O[3]) = 227;
411
- (CI => O[3]) = 313;
412
- (CYINIT => CO[0]) = 536;
413
- (DI[0] => CO[0]) = 379;
414
- (S[0] => CO[0]) = 340;
415
- (CI => CO[0]) = 271;
416
- (CYINIT => CO[1]) = 494;
417
- (DI[0] => CO[1]) = 465;
418
- (DI[1] => CO[1]) = 445;
419
- (S[0] => CO[1]) = 433;
420
- (S[1] => CO[1]) = 469;
421
- (CI => CO[1]) = 157;
422
- (CYINIT => CO[2]) = 592;
423
- (DI[0] => CO[2]) = 540;
424
- (DI[1] => CO[2]) = 520;
425
- (DI[2] => CO[2]) = 356;
426
- (S[0] => CO[2]) = 512;
427
- (S[1] => CO[2]) = 548;
428
- (S[2] => CO[2]) = 292;
429
- (CI => CO[2]) = 228;
430
- (CYINIT => CO[3]) = 580;
431
- (DI[0] => CO[3]) = 526;
432
- (DI[1] => CO[3]) = 507;
433
- (DI[2] => CO[3]) = 398;
434
- (DI[3] => CO[3]) = 385;
435
- (S[0] => CO[3]) = 508;
436
- (S[1] => CO[3]) = 528;
437
- (S[2] => CO[3]) = 378;
438
- (S[3] => CO[3]) = 380;
439
- (CI => CO[3]) = 114;
440
- endspecify
441
- endmodule
442
-
443
- module CARRY8(
444
- output [7:0] CO,
445
- output [7:0] O,
446
- input CI,
447
- input CI_TOP,
448
- input [7:0] DI, S
449
- );
450
- parameter CARRY_TYPE = "SINGLE_CY8";
451
- wire CI4 = (CARRY_TYPE == "DUAL_CY4" ? CI_TOP : CO[3]);
452
- assign O = S ^ {CO[6:4], CI4, CO[2:0], CI};
453
- assign CO[0] = S[0] ? CI : DI[0];
454
- assign CO[1] = S[1] ? CO[0] : DI[1];
455
- assign CO[2] = S[2] ? CO[1] : DI[2];
456
- assign CO[3] = S[3] ? CO[2] : DI[3];
457
- assign CO[4] = S[4] ? CI4 : DI[4];
458
- assign CO[5] = S[5] ? CO[4] : DI[5];
459
- assign CO[6] = S[6] ? CO[5] : DI[6];
460
- assign CO[7] = S[7] ? CO[6] : DI[7];
461
- endmodule
462
-
463
- module ORCY (output O, input CI, I);
464
- assign O = CI | I;
465
- endmodule
466
-
467
- module MULT_AND (output LO, input I0, I1);
468
- assign LO = I0 & I1;
469
- endmodule
470
-
471
- // Flip-flops and latches.
472
-
473
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L238-L250
474
-
475
- (* abc9_flop, lib_whitebox *)
476
- module FDRE (
477
- output reg Q,
478
- (* clkbuf_sink *)
479
- (* invertible_pin = "IS_C_INVERTED" *)
480
- input C,
481
- input CE,
482
- (* invertible_pin = "IS_D_INVERTED" *)
483
- input D,
484
- (* invertible_pin = "IS_R_INVERTED" *)
485
- input R
486
- );
487
- parameter [0:0] INIT = 1'b0;
488
- parameter [0:0] IS_C_INVERTED = 1'b0;
489
- parameter [0:0] IS_D_INVERTED = 1'b0;
490
- parameter [0:0] IS_R_INVERTED = 1'b0;
491
- initial Q <= INIT;
492
- generate
493
- case (|IS_C_INVERTED)
494
- 1'b0: always @(posedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
495
- 1'b1: always @(negedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
496
- endcase
497
- endgenerate
498
- specify
499
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
500
- $setup(D , posedge C &&& CE && !IS_C_INVERTED , /*-46*/ 0); // Negative times not currently supported
501
- $setup(D , negedge C &&& CE && IS_C_INVERTED , /*-46*/ 0); // Negative times not currently supported
502
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
503
- $setup(CE, posedge C &&& !IS_C_INVERTED, 109);
504
- $setup(CE, negedge C &&& IS_C_INVERTED, 109);
505
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
506
- $setup(R , posedge C &&& !IS_C_INVERTED, 404);
507
- $setup(R , negedge C &&& IS_C_INVERTED, 404);
508
- // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
509
- if (!IS_C_INVERTED && R != IS_R_INVERTED) (posedge C => (Q : 1'b0)) = 303;
510
- if ( IS_C_INVERTED && R != IS_R_INVERTED) (negedge C => (Q : 1'b0)) = 303;
511
- if (!IS_C_INVERTED && R == IS_R_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
512
- if ( IS_C_INVERTED && R == IS_R_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
513
- endspecify
514
- endmodule
515
-
516
- (* abc9_flop, lib_whitebox *)
517
- module FDRE_1 (
518
- output reg Q,
519
- (* clkbuf_sink *)
520
- input C,
521
- input CE,
522
- input D,
523
- input R
524
- );
525
- parameter [0:0] INIT = 1'b0;
526
- initial Q <= INIT;
527
- always @(negedge C) if (R) Q <= 1'b0; else if (CE) Q <= D;
528
- specify
529
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
530
- $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
531
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
532
- $setup(CE, negedge C, 109);
533
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
534
- $setup(R , negedge C, 404); // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
535
- if (R) (negedge C => (Q : 1'b0)) = 303;
536
- if (!R && CE) (negedge C => (Q : D)) = 303;
537
- endspecify
538
- endmodule
539
-
540
- (* abc9_flop, lib_whitebox *)
541
- module FDSE (
542
- output reg Q,
543
- (* clkbuf_sink *)
544
- (* invertible_pin = "IS_C_INVERTED" *)
545
- input C,
546
- input CE,
547
- (* invertible_pin = "IS_D_INVERTED" *)
548
- input D,
549
- (* invertible_pin = "IS_S_INVERTED" *)
550
- input S
551
- );
552
- parameter [0:0] INIT = 1'b1;
553
- parameter [0:0] IS_C_INVERTED = 1'b0;
554
- parameter [0:0] IS_D_INVERTED = 1'b0;
555
- parameter [0:0] IS_S_INVERTED = 1'b0;
556
- initial Q <= INIT;
557
- generate
558
- case (|IS_C_INVERTED)
559
- 1'b0: always @(posedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
560
- 1'b1: always @(negedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
561
- endcase
562
- endgenerate
563
- specify
564
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
565
- $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
566
- $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
567
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
568
- $setup(CE, posedge C &&& !IS_C_INVERTED, 109);
569
- $setup(CE, negedge C &&& IS_C_INVERTED, 109);
570
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
571
- $setup(S , posedge C &&& !IS_C_INVERTED, 404);
572
- $setup(S , negedge C &&& IS_C_INVERTED, 404);
573
- // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
574
- if (!IS_C_INVERTED && S != IS_S_INVERTED) (posedge C => (Q : 1'b1)) = 303;
575
- if ( IS_C_INVERTED && S != IS_S_INVERTED) (negedge C => (Q : 1'b1)) = 303;
576
- if (!IS_C_INVERTED && S == IS_S_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
577
- if ( IS_C_INVERTED && S == IS_S_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
578
- endspecify
579
- endmodule
580
-
581
- (* abc9_flop, lib_whitebox *)
582
- module FDSE_1 (
583
- output reg Q,
584
- (* clkbuf_sink *)
585
- input C,
586
- input CE,
587
- input D,
588
- input S
589
- );
590
- parameter [0:0] INIT = 1'b1;
591
- initial Q <= INIT;
592
- always @(negedge C) if (S) Q <= 1'b1; else if (CE) Q <= D;
593
- specify
594
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
595
- $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
596
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
597
- $setup(CE, negedge C, 109);
598
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
599
- $setup(S , negedge C, 404);
600
- // https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLL_L.sdf#L243
601
- if (S) (negedge C => (Q : 1'b1)) = 303;
602
- if (!S && CE) (negedge C => (Q : D)) = 303;
603
- endspecify
604
- endmodule
605
-
606
- module FDRSE (
607
- output reg Q,
608
- (* clkbuf_sink *)
609
- (* invertible_pin = "IS_C_INVERTED" *)
610
- input C,
611
- (* invertible_pin = "IS_CE_INVERTED" *)
612
- input CE,
613
- (* invertible_pin = "IS_D_INVERTED" *)
614
- input D,
615
- (* invertible_pin = "IS_R_INVERTED" *)
616
- input R,
617
- (* invertible_pin = "IS_S_INVERTED" *)
618
- input S
619
- );
620
- parameter [0:0] INIT = 1'b0;
621
- parameter [0:0] IS_C_INVERTED = 1'b0;
622
- parameter [0:0] IS_CE_INVERTED = 1'b0;
623
- parameter [0:0] IS_D_INVERTED = 1'b0;
624
- parameter [0:0] IS_R_INVERTED = 1'b0;
625
- parameter [0:0] IS_S_INVERTED = 1'b0;
626
- initial Q <= INIT;
627
- wire c = C ^ IS_C_INVERTED;
628
- wire ce = CE ^ IS_CE_INVERTED;
629
- wire d = D ^ IS_D_INVERTED;
630
- wire r = R ^ IS_R_INVERTED;
631
- wire s = S ^ IS_S_INVERTED;
632
- always @(posedge c)
633
- if (r)
634
- Q <= 0;
635
- else if (s)
636
- Q <= 1;
637
- else if (ce)
638
- Q <= d;
639
- endmodule
640
-
641
- module FDRSE_1 (
642
- output reg Q,
643
- (* clkbuf_sink *)
644
- (* invertible_pin = "IS_C_INVERTED" *)
645
- input C,
646
- (* invertible_pin = "IS_CE_INVERTED" *)
647
- input CE,
648
- (* invertible_pin = "IS_D_INVERTED" *)
649
- input D,
650
- (* invertible_pin = "IS_R_INVERTED" *)
651
- input R,
652
- (* invertible_pin = "IS_S_INVERTED" *)
653
- input S
654
- );
655
- parameter [0:0] INIT = 1'b0;
656
- parameter [0:0] IS_C_INVERTED = 1'b0;
657
- parameter [0:0] IS_CE_INVERTED = 1'b0;
658
- parameter [0:0] IS_D_INVERTED = 1'b0;
659
- parameter [0:0] IS_R_INVERTED = 1'b0;
660
- parameter [0:0] IS_S_INVERTED = 1'b0;
661
- initial Q <= INIT;
662
- wire c = C ^ IS_C_INVERTED;
663
- wire ce = CE ^ IS_CE_INVERTED;
664
- wire d = D ^ IS_D_INVERTED;
665
- wire r = R ^ IS_R_INVERTED;
666
- wire s = S ^ IS_S_INVERTED;
667
- always @(negedge c)
668
- if (r)
669
- Q <= 0;
670
- else if (s)
671
- Q <= 1;
672
- else if (ce)
673
- Q <= d;
674
- endmodule
675
-
676
- (* abc9_box, lib_whitebox *)
677
- module FDCE (
678
- output reg Q,
679
- (* clkbuf_sink *)
680
- (* invertible_pin = "IS_C_INVERTED" *)
681
- input C,
682
- input CE,
683
- (* invertible_pin = "IS_CLR_INVERTED" *)
684
- input CLR,
685
- (* invertible_pin = "IS_D_INVERTED" *)
686
- input D
687
- );
688
- parameter [0:0] INIT = 1'b0;
689
- parameter [0:0] IS_C_INVERTED = 1'b0;
690
- parameter [0:0] IS_D_INVERTED = 1'b0;
691
- parameter [0:0] IS_CLR_INVERTED = 1'b0;
692
- initial Q <= INIT;
693
- generate
694
- case ({|IS_C_INVERTED, |IS_CLR_INVERTED})
695
- 2'b00: always @(posedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
696
- 2'b01: always @(posedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
697
- 2'b10: always @(negedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
698
- 2'b11: always @(negedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED;
699
- endcase
700
- endgenerate
701
- specify
702
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
703
- $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
704
- $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
705
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
706
- $setup(CE , posedge C &&& !IS_C_INVERTED, 109);
707
- $setup(CE , negedge C &&& IS_C_INVERTED, 109);
708
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
709
- $setup(CLR, posedge C &&& !IS_C_INVERTED, 404);
710
- $setup(CLR, negedge C &&& IS_C_INVERTED, 404);
711
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
712
- `ifndef YOSYS
713
- if (!IS_CLR_INVERTED) (posedge CLR => (Q : 1'b0)) = 764;
714
- if ( IS_CLR_INVERTED) (negedge CLR => (Q : 1'b0)) = 764;
715
- `else
716
- if (IS_CLR_INVERTED != CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
717
- // but for facilitating a bypass box, let's pretend it's
718
- // a simple path
719
- `endif
720
- if (!IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
721
- if ( IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
722
- endspecify
723
- endmodule
724
-
725
- (* abc9_box, lib_whitebox *)
726
- module FDCE_1 (
727
- output reg Q,
728
- (* clkbuf_sink *)
729
- input C,
730
- input CE,
731
- input CLR,
732
- input D
733
- );
734
- parameter [0:0] INIT = 1'b0;
735
- initial Q <= INIT;
736
- always @(negedge C, posedge CLR) if (CLR) Q <= 1'b0; else if (CE) Q <= D;
737
- specify
738
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
739
- $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
740
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
741
- $setup(CE , negedge C, 109);
742
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
743
- $setup(CLR, negedge C, 404);
744
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
745
- `ifndef YOSYS
746
- (posedge CLR => (Q : 1'b0)) = 764;
747
- `else
748
- if (CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
749
- // but for facilitating a bypass box, let's pretend it's
750
- // a simple path
751
- `endif
752
- if (!CLR && CE) (negedge C => (Q : D)) = 303;
753
- endspecify
754
- endmodule
755
-
756
- (* abc9_box, lib_whitebox *)
757
- module FDPE (
758
- output reg Q,
759
- (* clkbuf_sink *)
760
- (* invertible_pin = "IS_C_INVERTED" *)
761
- input C,
762
- input CE,
763
- (* invertible_pin = "IS_D_INVERTED" *)
764
- input D,
765
- (* invertible_pin = "IS_PRE_INVERTED" *)
766
- input PRE
767
- );
768
- parameter [0:0] INIT = 1'b1;
769
- parameter [0:0] IS_C_INVERTED = 1'b0;
770
- parameter [0:0] IS_D_INVERTED = 1'b0;
771
- parameter [0:0] IS_PRE_INVERTED = 1'b0;
772
- initial Q <= INIT;
773
- generate case ({|IS_C_INVERTED, |IS_PRE_INVERTED})
774
- 2'b00: always @(posedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
775
- 2'b01: always @(posedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
776
- 2'b10: always @(negedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
777
- 2'b11: always @(negedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED;
778
- endcase
779
- endgenerate
780
- specify
781
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
782
- $setup(D , posedge C &&& !IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
783
- $setup(D , negedge C &&& IS_C_INVERTED && CE, /*-46*/ 0); // Negative times not currently supported
784
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
785
- $setup(CE , posedge C &&& !IS_C_INVERTED, 109);
786
- $setup(CE , negedge C &&& IS_C_INVERTED, 109);
787
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
788
- $setup(PRE, posedge C &&& !IS_C_INVERTED, 404);
789
- $setup(PRE, negedge C &&& IS_C_INVERTED, 404);
790
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
791
- `ifndef YOSYS
792
- if (!IS_PRE_INVERTED) (posedge PRE => (Q : 1'b1)) = 764;
793
- if ( IS_PRE_INVERTED) (negedge PRE => (Q : 1'b1)) = 764;
794
- `else
795
- if (IS_PRE_INVERTED != PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
796
- // but for facilitating a bypass box, let's pretend it's
797
- // a simple path
798
- `endif
799
- if (!IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
800
- if ( IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
801
- endspecify
802
- endmodule
803
-
804
- (* abc9_box, lib_whitebox *)
805
- module FDPE_1 (
806
- output reg Q,
807
- (* clkbuf_sink *)
808
- input C,
809
- input CE,
810
- input D,
811
- input PRE
812
- );
813
- parameter [0:0] INIT = 1'b1;
814
- initial Q <= INIT;
815
- always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;
816
- specify
817
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L249
818
- $setup(D , negedge C &&& CE, /*-46*/ 0); // Negative times not currently supported
819
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
820
- $setup(CE , negedge C, 109);
821
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
822
- $setup(PRE, negedge C, 404);
823
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
824
- `ifndef YOSYS
825
- (posedge PRE => (Q : 1'b1)) = 764;
826
- `else
827
- if (PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
828
- // but for facilitating a bypass box, let's pretend it's
829
- // a simple path
830
- `endif
831
- if (!PRE && CE) (negedge C => (Q : D)) = 303;
832
- endspecify
833
- endmodule
834
-
835
- module FDCPE (
836
- output wire Q,
837
- (* clkbuf_sink *)
838
- (* invertible_pin = "IS_C_INVERTED" *)
839
- input C,
840
- input CE,
841
- (* invertible_pin = "IS_CLR_INVERTED" *)
842
- input CLR,
843
- input D,
844
- (* invertible_pin = "IS_PRE_INVERTED" *)
845
- input PRE
846
- );
847
- parameter [0:0] INIT = 1'b0;
848
- parameter [0:0] IS_C_INVERTED = 1'b0;
849
- parameter [0:0] IS_CLR_INVERTED = 1'b0;
850
- parameter [0:0] IS_PRE_INVERTED = 1'b0;
851
- wire c = C ^ IS_C_INVERTED;
852
- wire clr = CLR ^ IS_CLR_INVERTED;
853
- wire pre = PRE ^ IS_PRE_INVERTED;
854
- // Hacky model to avoid simulation-synthesis mismatches.
855
- reg qc, qp, qs;
856
- initial qc = INIT;
857
- initial qp = INIT;
858
- initial qs = 0;
859
- always @(posedge c, posedge clr) begin
860
- if (clr)
861
- qc <= 0;
862
- else if (CE)
863
- qc <= D;
864
- end
865
- always @(posedge c, posedge pre) begin
866
- if (pre)
867
- qp <= 1;
868
- else if (CE)
869
- qp <= D;
870
- end
871
- always @* begin
872
- if (clr)
873
- qs <= 0;
874
- else if (pre)
875
- qs <= 1;
876
- end
877
- assign Q = qs ? qp : qc;
878
- endmodule
879
-
880
- module FDCPE_1 (
881
- output wire Q,
882
- (* clkbuf_sink *)
883
- (* invertible_pin = "IS_C_INVERTED" *)
884
- input C,
885
- input CE,
886
- (* invertible_pin = "IS_CLR_INVERTED" *)
887
- input CLR,
888
- input D,
889
- (* invertible_pin = "IS_PRE_INVERTED" *)
890
- input PRE
891
- );
892
- parameter [0:0] INIT = 1'b0;
893
- parameter [0:0] IS_C_INVERTED = 1'b0;
894
- parameter [0:0] IS_CLR_INVERTED = 1'b0;
895
- parameter [0:0] IS_PRE_INVERTED = 1'b0;
896
- wire c = C ^ IS_C_INVERTED;
897
- wire clr = CLR ^ IS_CLR_INVERTED;
898
- wire pre = PRE ^ IS_PRE_INVERTED;
899
- // Hacky model to avoid simulation-synthesis mismatches.
900
- reg qc, qp, qs;
901
- initial qc = INIT;
902
- initial qp = INIT;
903
- initial qs = 0;
904
- always @(negedge c, posedge clr) begin
905
- if (clr)
906
- qc <= 0;
907
- else if (CE)
908
- qc <= D;
909
- end
910
- always @(negedge c, posedge pre) begin
911
- if (pre)
912
- qp <= 1;
913
- else if (CE)
914
- qp <= D;
915
- end
916
- always @* begin
917
- if (clr)
918
- qs <= 0;
919
- else if (pre)
920
- qs <= 1;
921
- end
922
- assign Q = qs ? qp : qc;
923
- endmodule
924
-
925
- module LDCE (
926
- output reg Q,
927
- (* invertible_pin = "IS_CLR_INVERTED" *)
928
- input CLR,
929
- input D,
930
- (* invertible_pin = "IS_G_INVERTED" *)
931
- input G,
932
- input GE
933
- );
934
- parameter [0:0] INIT = 1'b0;
935
- parameter [0:0] IS_CLR_INVERTED = 1'b0;
936
- parameter [0:0] IS_G_INVERTED = 1'b0;
937
- parameter MSGON = "TRUE";
938
- parameter XON = "TRUE";
939
- initial Q = INIT;
940
- wire clr = CLR ^ IS_CLR_INVERTED;
941
- wire g = G ^ IS_G_INVERTED;
942
- always @*
943
- if (clr) Q <= 1'b0;
944
- else if (GE && g) Q <= D;
945
- endmodule
946
-
947
- module LDPE (
948
- output reg Q,
949
- input D,
950
- (* invertible_pin = "IS_G_INVERTED" *)
951
- input G,
952
- input GE,
953
- (* invertible_pin = "IS_PRE_INVERTED" *)
954
- input PRE
955
- );
956
- parameter [0:0] INIT = 1'b1;
957
- parameter [0:0] IS_G_INVERTED = 1'b0;
958
- parameter [0:0] IS_PRE_INVERTED = 1'b0;
959
- parameter MSGON = "TRUE";
960
- parameter XON = "TRUE";
961
- initial Q = INIT;
962
- wire g = G ^ IS_G_INVERTED;
963
- wire pre = PRE ^ IS_PRE_INVERTED;
964
- always @*
965
- if (pre) Q <= 1'b1;
966
- else if (GE && g) Q <= D;
967
- endmodule
968
-
969
- module LDCPE (
970
- output reg Q,
971
- (* invertible_pin = "IS_CLR_INVERTED" *)
972
- input CLR,
973
- (* invertible_pin = "IS_D_INVERTED" *)
974
- input D,
975
- (* invertible_pin = "IS_G_INVERTED" *)
976
- input G,
977
- (* invertible_pin = "IS_GE_INVERTED" *)
978
- input GE,
979
- (* invertible_pin = "IS_PRE_INVERTED" *)
980
- input PRE
981
- );
982
- parameter [0:0] INIT = 1'b1;
983
- parameter [0:0] IS_CLR_INVERTED = 1'b0;
984
- parameter [0:0] IS_D_INVERTED = 1'b0;
985
- parameter [0:0] IS_G_INVERTED = 1'b0;
986
- parameter [0:0] IS_GE_INVERTED = 1'b0;
987
- parameter [0:0] IS_PRE_INVERTED = 1'b0;
988
- initial Q = INIT;
989
- wire d = D ^ IS_D_INVERTED;
990
- wire g = G ^ IS_G_INVERTED;
991
- wire ge = GE ^ IS_GE_INVERTED;
992
- wire clr = CLR ^ IS_CLR_INVERTED;
993
- wire pre = PRE ^ IS_PRE_INVERTED;
994
- always @*
995
- if (clr) Q <= 1'b0;
996
- else if (pre) Q <= 1'b1;
997
- else if (ge && g) Q <= d;
998
- endmodule
999
-
1000
- module AND2B1L (
1001
- output O,
1002
- input DI,
1003
- (* invertible_pin = "IS_SRI_INVERTED" *)
1004
- input SRI
1005
- );
1006
- parameter [0:0] IS_SRI_INVERTED = 1'b0;
1007
- assign O = DI & ~(SRI ^ IS_SRI_INVERTED);
1008
- endmodule
1009
-
1010
- module OR2L (
1011
- output O,
1012
- input DI,
1013
- (* invertible_pin = "IS_SRI_INVERTED" *)
1014
- input SRI
1015
- );
1016
- parameter [0:0] IS_SRI_INVERTED = 1'b0;
1017
- assign O = DI | (SRI ^ IS_SRI_INVERTED);
1018
- endmodule
1019
-
1020
- // LUTRAM.
1021
-
1022
- // Single port.
1023
-
1024
- module RAM16X1S (
1025
- output O,
1026
- input A0, A1, A2, A3,
1027
- input D,
1028
- (* clkbuf_sink *)
1029
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1030
- input WCLK,
1031
- input WE
1032
- );
1033
- parameter [15:0] INIT = 16'h0000;
1034
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1035
- wire [3:0] a = {A3, A2, A1, A0};
1036
- reg [15:0] mem = INIT;
1037
- assign O = mem[a];
1038
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1039
- always @(posedge clk) if (WE) mem[a] <= D;
1040
- endmodule
1041
-
1042
- module RAM16X1S_1 (
1043
- output O,
1044
- input A0, A1, A2, A3,
1045
- input D,
1046
- (* clkbuf_sink *)
1047
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1048
- input WCLK,
1049
- input WE
1050
- );
1051
- parameter [15:0] INIT = 16'h0000;
1052
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1053
- wire [3:0] a = {A3, A2, A1, A0};
1054
- reg [15:0] mem = INIT;
1055
- assign O = mem[a];
1056
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1057
- always @(negedge clk) if (WE) mem[a] <= D;
1058
- endmodule
1059
-
1060
- module RAM32X1S (
1061
- output O,
1062
- input A0, A1, A2, A3, A4,
1063
- input D,
1064
- (* clkbuf_sink *)
1065
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1066
- input WCLK,
1067
- input WE
1068
- );
1069
- parameter [31:0] INIT = 32'h00000000;
1070
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1071
- wire [4:0] a = {A4, A3, A2, A1, A0};
1072
- reg [31:0] mem = INIT;
1073
- assign O = mem[a];
1074
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1075
- always @(posedge clk) if (WE) mem[a] <= D;
1076
- endmodule
1077
-
1078
- module RAM32X1S_1 (
1079
- output O,
1080
- input A0, A1, A2, A3, A4,
1081
- input D,
1082
- (* clkbuf_sink *)
1083
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1084
- input WCLK,
1085
- input WE
1086
- );
1087
- parameter [31:0] INIT = 32'h00000000;
1088
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1089
- wire [4:0] a = {A4, A3, A2, A1, A0};
1090
- reg [31:0] mem = INIT;
1091
- assign O = mem[a];
1092
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1093
- always @(negedge clk) if (WE) mem[a] <= D;
1094
- endmodule
1095
-
1096
- module RAM64X1S (
1097
- output O,
1098
- input A0, A1, A2, A3, A4, A5,
1099
- input D,
1100
- (* clkbuf_sink *)
1101
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1102
- input WCLK,
1103
- input WE
1104
- );
1105
- parameter [63:0] INIT = 64'h0000000000000000;
1106
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1107
- wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1108
- reg [63:0] mem = INIT;
1109
- assign O = mem[a];
1110
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1111
- always @(posedge clk) if (WE) mem[a] <= D;
1112
- endmodule
1113
-
1114
- module RAM64X1S_1 (
1115
- output O,
1116
- input A0, A1, A2, A3, A4, A5,
1117
- input D,
1118
- (* clkbuf_sink *)
1119
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1120
- input WCLK,
1121
- input WE
1122
- );
1123
- parameter [63:0] INIT = 64'h0000000000000000;
1124
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1125
- wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1126
- reg [63:0] mem = INIT;
1127
- assign O = mem[a];
1128
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1129
- always @(negedge clk) if (WE) mem[a] <= D;
1130
- endmodule
1131
-
1132
- module RAM128X1S (
1133
- output O,
1134
- input A0, A1, A2, A3, A4, A5, A6,
1135
- input D,
1136
- (* clkbuf_sink *)
1137
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1138
- input WCLK,
1139
- input WE
1140
- );
1141
- parameter [127:0] INIT = 128'h00000000000000000000000000000000;
1142
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1143
- wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
1144
- reg [127:0] mem = INIT;
1145
- assign O = mem[a];
1146
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1147
- always @(posedge clk) if (WE) mem[a] <= D;
1148
- endmodule
1149
-
1150
- module RAM128X1S_1 (
1151
- output O,
1152
- input A0, A1, A2, A3, A4, A5, A6,
1153
- input D,
1154
- (* clkbuf_sink *)
1155
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1156
- input WCLK,
1157
- input WE
1158
- );
1159
- parameter [127:0] INIT = 128'h00000000000000000000000000000000;
1160
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1161
- wire [6:0] a = {A6, A5, A4, A3, A2, A1, A0};
1162
- reg [127:0] mem = INIT;
1163
- assign O = mem[a];
1164
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1165
- always @(negedge clk) if (WE) mem[a] <= D;
1166
- endmodule
1167
-
1168
- module RAM256X1S (
1169
- output O,
1170
- input [7:0] A,
1171
- input D,
1172
- (* clkbuf_sink *)
1173
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1174
- input WCLK,
1175
- input WE
1176
- );
1177
- parameter [255:0] INIT = 256'h0;
1178
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1179
- reg [255:0] mem = INIT;
1180
- assign O = mem[A];
1181
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1182
- always @(posedge clk) if (WE) mem[A] <= D;
1183
- endmodule
1184
-
1185
- module RAM512X1S (
1186
- output O,
1187
- input [8:0] A,
1188
- input D,
1189
- (* clkbuf_sink *)
1190
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1191
- input WCLK,
1192
- input WE
1193
- );
1194
- parameter [511:0] INIT = 512'h0;
1195
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1196
- reg [511:0] mem = INIT;
1197
- assign O = mem[A];
1198
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1199
- always @(posedge clk) if (WE) mem[A] <= D;
1200
- endmodule
1201
-
1202
- // Single port, wide.
1203
-
1204
- module RAM16X2S (
1205
- output O0, O1,
1206
- input A0, A1, A2, A3,
1207
- input D0, D1,
1208
- (* clkbuf_sink *)
1209
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1210
- input WCLK,
1211
- input WE
1212
- );
1213
- parameter [15:0] INIT_00 = 16'h0000;
1214
- parameter [15:0] INIT_01 = 16'h0000;
1215
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1216
- wire [3:0] a = {A3, A2, A1, A0};
1217
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1218
- reg [15:0] mem0 = INIT_00;
1219
- reg [15:0] mem1 = INIT_01;
1220
- assign O0 = mem0[a];
1221
- assign O1 = mem1[a];
1222
- always @(posedge clk)
1223
- if (WE) begin
1224
- mem0[a] <= D0;
1225
- mem1[a] <= D1;
1226
- end
1227
- endmodule
1228
-
1229
- module RAM32X2S (
1230
- output O0, O1,
1231
- input A0, A1, A2, A3, A4,
1232
- input D0, D1,
1233
- (* clkbuf_sink *)
1234
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1235
- input WCLK,
1236
- input WE
1237
- );
1238
- parameter [31:0] INIT_00 = 32'h00000000;
1239
- parameter [31:0] INIT_01 = 32'h00000000;
1240
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1241
- wire [4:0] a = {A4, A3, A2, A1, A0};
1242
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1243
- reg [31:0] mem0 = INIT_00;
1244
- reg [31:0] mem1 = INIT_01;
1245
- assign O0 = mem0[a];
1246
- assign O1 = mem1[a];
1247
- always @(posedge clk)
1248
- if (WE) begin
1249
- mem0[a] <= D0;
1250
- mem1[a] <= D1;
1251
- end
1252
- endmodule
1253
-
1254
- module RAM64X2S (
1255
- output O0, O1,
1256
- input A0, A1, A2, A3, A4, A5,
1257
- input D0, D1,
1258
- (* clkbuf_sink *)
1259
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1260
- input WCLK,
1261
- input WE
1262
- );
1263
- parameter [63:0] INIT_00 = 64'h0000000000000000;
1264
- parameter [63:0] INIT_01 = 64'h0000000000000000;
1265
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1266
- wire [5:0] a = {A5, A3, A2, A1, A0};
1267
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1268
- reg [63:0] mem0 = INIT_00;
1269
- reg [63:0] mem1 = INIT_01;
1270
- assign O0 = mem0[a];
1271
- assign O1 = mem1[a];
1272
- always @(posedge clk)
1273
- if (WE) begin
1274
- mem0[a] <= D0;
1275
- mem1[a] <= D1;
1276
- end
1277
- endmodule
1278
-
1279
- module RAM16X4S (
1280
- output O0, O1, O2, O3,
1281
- input A0, A1, A2, A3,
1282
- input D0, D1, D2, D3,
1283
- (* clkbuf_sink *)
1284
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1285
- input WCLK,
1286
- input WE
1287
- );
1288
- parameter [15:0] INIT_00 = 16'h0000;
1289
- parameter [15:0] INIT_01 = 16'h0000;
1290
- parameter [15:0] INIT_02 = 16'h0000;
1291
- parameter [15:0] INIT_03 = 16'h0000;
1292
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1293
- wire [3:0] a = {A3, A2, A1, A0};
1294
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1295
- reg [15:0] mem0 = INIT_00;
1296
- reg [15:0] mem1 = INIT_01;
1297
- reg [15:0] mem2 = INIT_02;
1298
- reg [15:0] mem3 = INIT_03;
1299
- assign O0 = mem0[a];
1300
- assign O1 = mem1[a];
1301
- assign O2 = mem2[a];
1302
- assign O3 = mem3[a];
1303
- always @(posedge clk)
1304
- if (WE) begin
1305
- mem0[a] <= D0;
1306
- mem1[a] <= D1;
1307
- mem2[a] <= D2;
1308
- mem3[a] <= D3;
1309
- end
1310
- endmodule
1311
-
1312
- module RAM32X4S (
1313
- output O0, O1, O2, O3,
1314
- input A0, A1, A2, A3, A4,
1315
- input D0, D1, D2, D3,
1316
- (* clkbuf_sink *)
1317
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1318
- input WCLK,
1319
- input WE
1320
- );
1321
- parameter [31:0] INIT_00 = 32'h00000000;
1322
- parameter [31:0] INIT_01 = 32'h00000000;
1323
- parameter [31:0] INIT_02 = 32'h00000000;
1324
- parameter [31:0] INIT_03 = 32'h00000000;
1325
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1326
- wire [4:0] a = {A4, A3, A2, A1, A0};
1327
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1328
- reg [31:0] mem0 = INIT_00;
1329
- reg [31:0] mem1 = INIT_01;
1330
- reg [31:0] mem2 = INIT_02;
1331
- reg [31:0] mem3 = INIT_03;
1332
- assign O0 = mem0[a];
1333
- assign O1 = mem1[a];
1334
- assign O2 = mem2[a];
1335
- assign O3 = mem3[a];
1336
- always @(posedge clk)
1337
- if (WE) begin
1338
- mem0[a] <= D0;
1339
- mem1[a] <= D1;
1340
- mem2[a] <= D2;
1341
- mem3[a] <= D3;
1342
- end
1343
- endmodule
1344
-
1345
- module RAM16X8S (
1346
- output [7:0] O,
1347
- input A0, A1, A2, A3,
1348
- input [7:0] D,
1349
- (* clkbuf_sink *)
1350
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1351
- input WCLK,
1352
- input WE
1353
- );
1354
- parameter [15:0] INIT_00 = 16'h0000;
1355
- parameter [15:0] INIT_01 = 16'h0000;
1356
- parameter [15:0] INIT_02 = 16'h0000;
1357
- parameter [15:0] INIT_03 = 16'h0000;
1358
- parameter [15:0] INIT_04 = 16'h0000;
1359
- parameter [15:0] INIT_05 = 16'h0000;
1360
- parameter [15:0] INIT_06 = 16'h0000;
1361
- parameter [15:0] INIT_07 = 16'h0000;
1362
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1363
- wire [3:0] a = {A3, A2, A1, A0};
1364
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1365
- reg [15:0] mem0 = INIT_00;
1366
- reg [15:0] mem1 = INIT_01;
1367
- reg [15:0] mem2 = INIT_02;
1368
- reg [15:0] mem3 = INIT_03;
1369
- reg [15:0] mem4 = INIT_04;
1370
- reg [15:0] mem5 = INIT_05;
1371
- reg [15:0] mem6 = INIT_06;
1372
- reg [15:0] mem7 = INIT_07;
1373
- assign O[0] = mem0[a];
1374
- assign O[1] = mem1[a];
1375
- assign O[2] = mem2[a];
1376
- assign O[3] = mem3[a];
1377
- assign O[4] = mem4[a];
1378
- assign O[5] = mem5[a];
1379
- assign O[6] = mem6[a];
1380
- assign O[7] = mem7[a];
1381
- always @(posedge clk)
1382
- if (WE) begin
1383
- mem0[a] <= D[0];
1384
- mem1[a] <= D[1];
1385
- mem2[a] <= D[2];
1386
- mem3[a] <= D[3];
1387
- mem4[a] <= D[4];
1388
- mem5[a] <= D[5];
1389
- mem6[a] <= D[6];
1390
- mem7[a] <= D[7];
1391
- end
1392
- endmodule
1393
-
1394
- module RAM32X8S (
1395
- output [7:0] O,
1396
- input A0, A1, A2, A3, A4,
1397
- input [7:0] D,
1398
- (* clkbuf_sink *)
1399
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1400
- input WCLK,
1401
- input WE
1402
- );
1403
- parameter [31:0] INIT_00 = 32'h00000000;
1404
- parameter [31:0] INIT_01 = 32'h00000000;
1405
- parameter [31:0] INIT_02 = 32'h00000000;
1406
- parameter [31:0] INIT_03 = 32'h00000000;
1407
- parameter [31:0] INIT_04 = 32'h00000000;
1408
- parameter [31:0] INIT_05 = 32'h00000000;
1409
- parameter [31:0] INIT_06 = 32'h00000000;
1410
- parameter [31:0] INIT_07 = 32'h00000000;
1411
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1412
- wire [4:0] a = {A4, A3, A2, A1, A0};
1413
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1414
- reg [31:0] mem0 = INIT_00;
1415
- reg [31:0] mem1 = INIT_01;
1416
- reg [31:0] mem2 = INIT_02;
1417
- reg [31:0] mem3 = INIT_03;
1418
- reg [31:0] mem4 = INIT_04;
1419
- reg [31:0] mem5 = INIT_05;
1420
- reg [31:0] mem6 = INIT_06;
1421
- reg [31:0] mem7 = INIT_07;
1422
- assign O[0] = mem0[a];
1423
- assign O[1] = mem1[a];
1424
- assign O[2] = mem2[a];
1425
- assign O[3] = mem3[a];
1426
- assign O[4] = mem4[a];
1427
- assign O[5] = mem5[a];
1428
- assign O[6] = mem6[a];
1429
- assign O[7] = mem7[a];
1430
- always @(posedge clk)
1431
- if (WE) begin
1432
- mem0[a] <= D[0];
1433
- mem1[a] <= D[1];
1434
- mem2[a] <= D[2];
1435
- mem3[a] <= D[3];
1436
- mem4[a] <= D[4];
1437
- mem5[a] <= D[5];
1438
- mem6[a] <= D[6];
1439
- mem7[a] <= D[7];
1440
- end
1441
- endmodule
1442
-
1443
- // Dual port.
1444
-
1445
- module RAM16X1D (
1446
- output DPO, SPO,
1447
- input D,
1448
- (* clkbuf_sink *)
1449
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1450
- input WCLK,
1451
- input WE,
1452
- input A0, A1, A2, A3,
1453
- input DPRA0, DPRA1, DPRA2, DPRA3
1454
- );
1455
- parameter INIT = 16'h0;
1456
- parameter IS_WCLK_INVERTED = 1'b0;
1457
- wire [3:0] a = {A3, A2, A1, A0};
1458
- wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1459
- reg [15:0] mem = INIT;
1460
- assign SPO = mem[a];
1461
- assign DPO = mem[dpra];
1462
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1463
- always @(posedge clk) if (WE) mem[a] <= D;
1464
- endmodule
1465
-
1466
- module RAM16X1D_1 (
1467
- output DPO, SPO,
1468
- input D,
1469
- (* clkbuf_sink *)
1470
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1471
- input WCLK,
1472
- input WE,
1473
- input A0, A1, A2, A3,
1474
- input DPRA0, DPRA1, DPRA2, DPRA3
1475
- );
1476
- parameter INIT = 16'h0;
1477
- parameter IS_WCLK_INVERTED = 1'b0;
1478
- wire [3:0] a = {A3, A2, A1, A0};
1479
- wire [3:0] dpra = {DPRA3, DPRA2, DPRA1, DPRA0};
1480
- reg [15:0] mem = INIT;
1481
- assign SPO = mem[a];
1482
- assign DPO = mem[dpra];
1483
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1484
- always @(negedge clk) if (WE) mem[a] <= D;
1485
- endmodule
1486
-
1487
- (* abc9_box, lib_whitebox *)
1488
- module RAM32X1D (
1489
- output DPO, SPO,
1490
- input D,
1491
- (* clkbuf_sink *)
1492
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1493
- input WCLK,
1494
- input WE,
1495
- input A0, A1, A2, A3, A4,
1496
- input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1497
- );
1498
- parameter INIT = 32'h0;
1499
- parameter IS_WCLK_INVERTED = 1'b0;
1500
- wire [4:0] a = {A4, A3, A2, A1, A0};
1501
- wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1502
- reg [31:0] mem = INIT;
1503
- assign SPO = mem[a];
1504
- assign DPO = mem[dpra];
1505
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1506
- always @(posedge clk) if (WE) mem[a] <= D;
1507
- specify
1508
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1509
- $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1510
- $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1511
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1512
- $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1513
- $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1514
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L800
1515
- $setup(A0, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1516
- $setup(A0, negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1517
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L798
1518
- $setup(A1, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1519
- $setup(A1, negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1520
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L796
1521
- $setup(A2, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1522
- $setup(A2, negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1523
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L794
1524
- $setup(A3, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1525
- $setup(A3, negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1526
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L792
1527
- $setup(A4, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1528
- $setup(A4, posedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1529
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1530
- if (!IS_WCLK_INVERTED) (posedge WCLK => (SPO : D)) = 1153;
1531
- if (!IS_WCLK_INVERTED) (posedge WCLK => (DPO : 1'bx)) = 1153;
1532
- if ( IS_WCLK_INVERTED) (posedge WCLK => (SPO : D)) = 1153;
1533
- if ( IS_WCLK_INVERTED) (negedge WCLK => (DPO : 1'bx)) = 1153;
1534
- (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1535
- (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1536
- (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1537
- (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1538
- (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1539
- endspecify
1540
- endmodule
1541
-
1542
- (* abc9_box, lib_whitebox *)
1543
- module RAM32X1D_1 (
1544
- output DPO, SPO,
1545
- input D,
1546
- (* clkbuf_sink *)
1547
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1548
- input WCLK,
1549
- input WE,
1550
- input A0,
1551
- input A1,
1552
- input A2,
1553
- input A3,
1554
- input A4,
1555
- input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4
1556
- );
1557
- parameter INIT = 32'h0;
1558
- parameter IS_WCLK_INVERTED = 1'b0;
1559
- wire [4:0] a = {A4, A3, A2, A1, A0};
1560
- wire [4:0] dpra = {DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1561
- reg [31:0] mem = INIT;
1562
- assign SPO = mem[a];
1563
- assign DPO = mem[dpra];
1564
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1565
- always @(negedge clk) if (WE) mem[a] <= D;
1566
- specify
1567
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1568
- $setup(D , negedge WCLK &&& WE, 453);
1569
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1570
- $setup(WE, negedge WCLK, 654);
1571
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L800
1572
- $setup(A0, negedge WCLK &&& WE, 245);
1573
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L798
1574
- $setup(A1, negedge WCLK &&& WE, 208);
1575
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L796
1576
- $setup(A2, negedge WCLK &&& WE, 147);
1577
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L794
1578
- $setup(A3, negedge WCLK &&& WE, 68);
1579
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L792
1580
- $setup(A4, negedge WCLK &&& WE, 66);
1581
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1582
- if (WE) (negedge WCLK => (SPO : D)) = 1153;
1583
- if (WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1584
- (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1585
- (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1586
- (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1587
- (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1588
- (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1589
- endspecify
1590
- endmodule
1591
-
1592
- (* abc9_box, lib_whitebox *)
1593
- module RAM64X1D (
1594
- output DPO, SPO,
1595
- input D,
1596
- (* clkbuf_sink *)
1597
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1598
- input WCLK,
1599
- input WE,
1600
- input A0, A1, A2, A3, A4, A5,
1601
- input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1602
- );
1603
- parameter INIT = 64'h0;
1604
- parameter IS_WCLK_INVERTED = 1'b0;
1605
- wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1606
- wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1607
- reg [63:0] mem = INIT;
1608
- assign SPO = mem[a];
1609
- assign DPO = mem[dpra];
1610
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1611
- always @(posedge clk) if (WE) mem[a] <= D;
1612
- specify
1613
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1614
- $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1615
- $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1616
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1617
- $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1618
- $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1619
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L828
1620
- $setup(A0, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1621
- $setup(A0, negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1622
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L826
1623
- $setup(A1, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1624
- $setup(A1, negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1625
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L824
1626
- $setup(A2, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1627
- $setup(A2, negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1628
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L822
1629
- $setup(A3, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1630
- $setup(A3, negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1631
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L820
1632
- $setup(A4, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1633
- $setup(A4, negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1634
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818
1635
- $setup(A5, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1636
- $setup(A5, negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1637
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1638
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (SPO : D)) = 1153;
1639
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DPO : 1'bx)) = 1153;
1640
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (SPO : D)) = 1153;
1641
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1642
- (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1643
- (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1644
- (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1645
- (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1646
- (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1647
- (A5 => SPO) = 127; (DPRA5 => DPO) = 127;
1648
- endspecify
1649
- endmodule
1650
-
1651
- module RAM64X1D_1 (
1652
- output DPO, SPO,
1653
- input D,
1654
- (* clkbuf_sink *)
1655
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1656
- input WCLK,
1657
- input WE,
1658
- input A0, A1, A2, A3, A4, A5,
1659
- input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5
1660
- );
1661
- parameter INIT = 64'h0;
1662
- parameter IS_WCLK_INVERTED = 1'b0;
1663
- wire [5:0] a = {A5, A4, A3, A2, A1, A0};
1664
- wire [5:0] dpra = {DPRA5, DPRA4, DPRA3, DPRA2, DPRA1, DPRA0};
1665
- reg [63:0] mem = INIT;
1666
- assign SPO = mem[a];
1667
- assign DPO = mem[dpra];
1668
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1669
- always @(negedge clk) if (WE) mem[a] <= D;
1670
- specify
1671
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1672
- $setup(D , negedge WCLK &&& WE, 453);
1673
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1674
- $setup(WE, negedge WCLK, 654);
1675
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L828
1676
- $setup(A0, negedge WCLK &&& WE, 362);
1677
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L826
1678
- $setup(A1, negedge WCLK &&& WE, 245);
1679
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L824
1680
- $setup(A2, negedge WCLK &&& WE, 208);
1681
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L822
1682
- $setup(A3, negedge WCLK &&& WE, 147);
1683
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L820
1684
- $setup(A4, negedge WCLK &&& WE, 68);
1685
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818
1686
- $setup(A5, negedge WCLK &&& WE, 66);
1687
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1688
- if (WE) (negedge WCLK => (SPO : D)) = 1153;
1689
- if (WE) (negedge WCLK => (DPO : 1'bx)) = 1153;
1690
- (A0 => SPO) = 642; (DPRA0 => DPO) = 642;
1691
- (A1 => SPO) = 632; (DPRA1 => DPO) = 631;
1692
- (A2 => SPO) = 472; (DPRA2 => DPO) = 472;
1693
- (A3 => SPO) = 407; (DPRA3 => DPO) = 407;
1694
- (A4 => SPO) = 238; (DPRA4 => DPO) = 238;
1695
- (A5 => SPO) = 127; (DPRA5 => DPO) = 127;
1696
- endspecify
1697
- endmodule
1698
-
1699
- (* abc9_box, lib_whitebox *)
1700
- module RAM128X1D (
1701
- output DPO, SPO,
1702
- input D,
1703
- (* clkbuf_sink *)
1704
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1705
- input WCLK,
1706
- input WE,
1707
- input [6:0] A,
1708
- input [6:0] DPRA
1709
- );
1710
- parameter INIT = 128'h0;
1711
- parameter IS_WCLK_INVERTED = 1'b0;
1712
- reg [127:0] mem = INIT;
1713
- assign SPO = mem[A];
1714
- assign DPO = mem[DPRA];
1715
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1716
- always @(posedge clk) if (WE) mem[A] <= D;
1717
- specify
1718
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1719
- $setup(D , posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1720
- $setup(D , negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1721
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1722
- $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1723
- $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1724
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818-830
1725
- $setup(A[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 616);
1726
- $setup(A[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 616);
1727
- $setup(A[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1728
- $setup(A[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1729
- $setup(A[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1730
- $setup(A[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1731
- $setup(A[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1732
- $setup(A[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1733
- $setup(A[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1734
- $setup(A[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1735
- $setup(A[5], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1736
- $setup(A[5], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1737
- $setup(A[6], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1738
- $setup(A[6], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1739
- `ifndef __ICARUS__
1740
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L981
1741
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (SPO : D)) = 1153 + 217 /* to cross F7AMUX */ + 175 /* AMUX */;
1742
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DPO : 1'bx)) = 1153 + 223 /* to cross F7BMUX */ + 174 /* CMUX */;
1743
- (A[0] => SPO) = 642 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1744
- (A[1] => SPO) = 631 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1745
- (A[2] => SPO) = 472 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1746
- (A[3] => SPO) = 407 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1747
- (A[4] => SPO) = 238 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1748
- (A[5] => SPO) = 127 + 193 /* to cross F7AMUX */ + 175 /* AMUX */;
1749
- (A[6] => SPO) = 0 + 276 /* to select F7AMUX */ + 175 /* AMUX */;
1750
- (DPRA[0] => DPO) = 642 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1751
- (DPRA[1] => DPO) = 631 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1752
- (DPRA[2] => DPO) = 472 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1753
- (DPRA[3] => DPO) = 407 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1754
- (DPRA[4] => DPO) = 238 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1755
- (DPRA[5] => DPO) = 127 + 223 /* to cross MUXF7 */ + 174 /* CMUX */;
1756
- (DPRA[6] => DPO) = 0 + 296 /* to select MUXF7 */ + 174 /* CMUX */;
1757
- `endif
1758
- endspecify
1759
- endmodule
1760
-
1761
- module RAM256X1D (
1762
- output DPO, SPO,
1763
- input D,
1764
- (* clkbuf_sink *)
1765
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1766
- input WCLK,
1767
- input WE,
1768
- input [7:0] A, DPRA
1769
- );
1770
- parameter INIT = 256'h0;
1771
- parameter IS_WCLK_INVERTED = 1'b0;
1772
- reg [255:0] mem = INIT;
1773
- assign SPO = mem[A];
1774
- assign DPO = mem[DPRA];
1775
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1776
- always @(posedge clk) if (WE) mem[A] <= D;
1777
- endmodule
1778
-
1779
- // Multi port.
1780
-
1781
- (* abc9_box, lib_whitebox *)
1782
- module RAM32M (
1783
- output [1:0] DOA,
1784
- output [1:0] DOB,
1785
- output [1:0] DOC,
1786
- output [1:0] DOD,
1787
- input [4:0] ADDRA, ADDRB, ADDRC,
1788
- input [4:0] ADDRD,
1789
- input [1:0] DIA,
1790
- input [1:0] DIB,
1791
- input [1:0] DIC,
1792
- input [1:0] DID,
1793
- (* clkbuf_sink *)
1794
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1795
- input WCLK,
1796
- input WE
1797
- );
1798
- parameter [63:0] INIT_A = 64'h0000000000000000;
1799
- parameter [63:0] INIT_B = 64'h0000000000000000;
1800
- parameter [63:0] INIT_C = 64'h0000000000000000;
1801
- parameter [63:0] INIT_D = 64'h0000000000000000;
1802
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1803
- reg [63:0] mem_a = INIT_A;
1804
- reg [63:0] mem_b = INIT_B;
1805
- reg [63:0] mem_c = INIT_C;
1806
- reg [63:0] mem_d = INIT_D;
1807
- assign DOA = mem_a[2*ADDRA+:2];
1808
- assign DOB = mem_b[2*ADDRB+:2];
1809
- assign DOC = mem_c[2*ADDRC+:2];
1810
- assign DOD = mem_d[2*ADDRD+:2];
1811
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1812
- always @(posedge clk)
1813
- if (WE) begin
1814
- mem_a[2*ADDRD+:2] <= DIA;
1815
- mem_b[2*ADDRD+:2] <= DIB;
1816
- mem_c[2*ADDRD+:2] <= DIC;
1817
- mem_d[2*ADDRD+:2] <= DID;
1818
- end
1819
- specify
1820
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986
1821
- $setup(ADDRD[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1822
- $setup(ADDRD[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1823
- $setup(ADDRD[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
1824
- $setup(ADDRD[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
1825
- $setup(ADDRD[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
1826
- $setup(ADDRD[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
1827
- $setup(ADDRD[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
1828
- $setup(ADDRD[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
1829
- $setup(ADDRD[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
1830
- $setup(ADDRD[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
1831
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986-L988
1832
- $setup(DIA[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 453);
1833
- $setup(DIA[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 453);
1834
- $setup(DIA[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 384);
1835
- $setup(DIA[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 384);
1836
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1054-L1056
1837
- $setup(DIB[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 461);
1838
- $setup(DIB[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 461);
1839
- $setup(DIB[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 354);
1840
- $setup(DIB[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 354);
1841
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1122-L1124
1842
- $setup(DIC[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 457);
1843
- $setup(DIC[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 457);
1844
- $setup(DIC[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 375);
1845
- $setup(DIC[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 375);
1846
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1190-L1192
1847
- $setup(DID[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 310);
1848
- $setup(DID[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 310);
1849
- $setup(DID[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 334);
1850
- $setup(DID[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 334);
1851
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
1852
- $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED, 654);
1853
- $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED, 654);
1854
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L889
1855
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA[0] : DIA[0])) = 1153;
1856
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA[0] : DIA[0])) = 1153;
1857
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L857
1858
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA[1] : DIA[1])) = 1188;
1859
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA[1] : DIA[1])) = 1188;
1860
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
1861
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB[0] : DIB[0])) = 1161;
1862
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB[0] : DIB[0])) = 1161;
1863
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L925
1864
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB[1] : DIB[1])) = 1187;
1865
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB[1] : DIB[1])) = 1187;
1866
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L993
1867
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC[0] : DIC[0])) = 1158;
1868
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC[0] : DIC[0])) = 1158;
1869
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1025
1870
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC[1] : DIC[1])) = 1180;
1871
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC[1] : DIC[1])) = 1180;
1872
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1093
1873
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD[0] : DID[0])) = 1163;
1874
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD[0] : DID[0])) = 1163;
1875
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1061
1876
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD[1] : DID[1])) = 1190;
1877
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD[1] : DID[1])) = 1190;
1878
- (ADDRA[0] *> DOA) = 642; (ADDRB[0] *> DOB) = 642; (ADDRC[0] *> DOC) = 642; (ADDRD[0] *> DOD) = 642;
1879
- (ADDRA[1] *> DOA) = 631; (ADDRB[1] *> DOB) = 631; (ADDRC[1] *> DOC) = 631; (ADDRD[1] *> DOD) = 631;
1880
- (ADDRA[2] *> DOA) = 472; (ADDRB[2] *> DOB) = 472; (ADDRC[2] *> DOC) = 472; (ADDRD[2] *> DOD) = 472;
1881
- (ADDRA[3] *> DOA) = 407; (ADDRB[3] *> DOB) = 407; (ADDRC[3] *> DOC) = 407; (ADDRD[3] *> DOD) = 407;
1882
- (ADDRA[4] *> DOA) = 238; (ADDRB[4] *> DOB) = 238; (ADDRC[4] *> DOC) = 238; (ADDRD[4] *> DOD) = 238;
1883
- endspecify
1884
- endmodule
1885
-
1886
- module RAM32M16 (
1887
- output [1:0] DOA,
1888
- output [1:0] DOB,
1889
- output [1:0] DOC,
1890
- output [1:0] DOD,
1891
- output [1:0] DOE,
1892
- output [1:0] DOF,
1893
- output [1:0] DOG,
1894
- output [1:0] DOH,
1895
- input [4:0] ADDRA,
1896
- input [4:0] ADDRB,
1897
- input [4:0] ADDRC,
1898
- input [4:0] ADDRD,
1899
- input [4:0] ADDRE,
1900
- input [4:0] ADDRF,
1901
- input [4:0] ADDRG,
1902
- input [4:0] ADDRH,
1903
- input [1:0] DIA,
1904
- input [1:0] DIB,
1905
- input [1:0] DIC,
1906
- input [1:0] DID,
1907
- input [1:0] DIE,
1908
- input [1:0] DIF,
1909
- input [1:0] DIG,
1910
- input [1:0] DIH,
1911
- (* clkbuf_sink *)
1912
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1913
- input WCLK,
1914
- input WE
1915
- );
1916
- parameter [63:0] INIT_A = 64'h0000000000000000;
1917
- parameter [63:0] INIT_B = 64'h0000000000000000;
1918
- parameter [63:0] INIT_C = 64'h0000000000000000;
1919
- parameter [63:0] INIT_D = 64'h0000000000000000;
1920
- parameter [63:0] INIT_E = 64'h0000000000000000;
1921
- parameter [63:0] INIT_F = 64'h0000000000000000;
1922
- parameter [63:0] INIT_G = 64'h0000000000000000;
1923
- parameter [63:0] INIT_H = 64'h0000000000000000;
1924
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1925
- reg [63:0] mem_a = INIT_A;
1926
- reg [63:0] mem_b = INIT_B;
1927
- reg [63:0] mem_c = INIT_C;
1928
- reg [63:0] mem_d = INIT_D;
1929
- reg [63:0] mem_e = INIT_E;
1930
- reg [63:0] mem_f = INIT_F;
1931
- reg [63:0] mem_g = INIT_G;
1932
- reg [63:0] mem_h = INIT_H;
1933
- assign DOA = mem_a[2*ADDRA+:2];
1934
- assign DOB = mem_b[2*ADDRB+:2];
1935
- assign DOC = mem_c[2*ADDRC+:2];
1936
- assign DOD = mem_d[2*ADDRD+:2];
1937
- assign DOE = mem_e[2*ADDRE+:2];
1938
- assign DOF = mem_f[2*ADDRF+:2];
1939
- assign DOG = mem_g[2*ADDRG+:2];
1940
- assign DOH = mem_h[2*ADDRH+:2];
1941
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1942
- always @(posedge clk)
1943
- if (WE) begin
1944
- mem_a[2*ADDRH+:2] <= DIA;
1945
- mem_b[2*ADDRH+:2] <= DIB;
1946
- mem_c[2*ADDRH+:2] <= DIC;
1947
- mem_d[2*ADDRH+:2] <= DID;
1948
- mem_e[2*ADDRH+:2] <= DIE;
1949
- mem_f[2*ADDRH+:2] <= DIF;
1950
- mem_g[2*ADDRH+:2] <= DIG;
1951
- mem_h[2*ADDRH+:2] <= DIH;
1952
- end
1953
- endmodule
1954
-
1955
- (* abc9_box, lib_whitebox *)
1956
- module RAM64M (
1957
- output DOA,
1958
- output DOB,
1959
- output DOC,
1960
- output DOD,
1961
- input [5:0] ADDRA, ADDRB, ADDRC,
1962
- input [5:0] ADDRD,
1963
- input DIA,
1964
- input DIB,
1965
- input DIC,
1966
- input DID,
1967
- (* clkbuf_sink *)
1968
- (* invertible_pin = "IS_WCLK_INVERTED" *)
1969
- input WCLK,
1970
- input WE
1971
- );
1972
- parameter [63:0] INIT_A = 64'h0000000000000000;
1973
- parameter [63:0] INIT_B = 64'h0000000000000000;
1974
- parameter [63:0] INIT_C = 64'h0000000000000000;
1975
- parameter [63:0] INIT_D = 64'h0000000000000000;
1976
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
1977
- reg [63:0] mem_a = INIT_A;
1978
- reg [63:0] mem_b = INIT_B;
1979
- reg [63:0] mem_c = INIT_C;
1980
- reg [63:0] mem_d = INIT_D;
1981
- assign DOA = mem_a[ADDRA];
1982
- assign DOB = mem_b[ADDRB];
1983
- assign DOC = mem_c[ADDRC];
1984
- assign DOD = mem_d[ADDRD];
1985
- wire clk = WCLK ^ IS_WCLK_INVERTED;
1986
- always @(posedge clk)
1987
- if (WE) begin
1988
- mem_a[ADDRD] <= DIA;
1989
- mem_b[ADDRD] <= DIB;
1990
- mem_c[ADDRD] <= DIC;
1991
- mem_d[ADDRD] <= DID;
1992
- end
1993
- specify
1994
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L818-L830
1995
- $setup(ADDRD[0], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 362);
1996
- $setup(ADDRD[0], negedge WCLK &&& IS_WCLK_INVERTED && WE, 362);
1997
- $setup(ADDRD[1], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 245);
1998
- $setup(ADDRD[1], negedge WCLK &&& IS_WCLK_INVERTED && WE, 245);
1999
- $setup(ADDRD[2], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 208);
2000
- $setup(ADDRD[2], negedge WCLK &&& IS_WCLK_INVERTED && WE, 208);
2001
- $setup(ADDRD[3], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 147);
2002
- $setup(ADDRD[3], negedge WCLK &&& IS_WCLK_INVERTED && WE, 147);
2003
- $setup(ADDRD[4], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 68);
2004
- $setup(ADDRD[4], negedge WCLK &&& IS_WCLK_INVERTED && WE, 68);
2005
- $setup(ADDRD[5], posedge WCLK &&& !IS_WCLK_INVERTED && WE, 66);
2006
- $setup(ADDRD[5], negedge WCLK &&& IS_WCLK_INVERTED && WE, 66);
2007
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L986-L988
2008
- $setup(DIA, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 384);
2009
- $setup(DIA, negedge WCLK &&& IS_WCLK_INVERTED && WE, 384);
2010
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1054-L1056
2011
- $setup(DIB, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 354);
2012
- $setup(DIB, negedge WCLK &&& IS_WCLK_INVERTED && WE, 354);
2013
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1122-L1124
2014
- $setup(DIC, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 375);
2015
- $setup(DIC, negedge WCLK &&& IS_WCLK_INVERTED && WE, 375);
2016
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L1190-L1192
2017
- $setup(DID, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 310);
2018
- $setup(DID, negedge WCLK &&& IS_WCLK_INVERTED && WE, 310);
2019
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/31f51ac5ec7448dd6f79a8267f147123e4413c21/artix7/timings/CLBLM_R.sdf#L834
2020
- $setup(WE, posedge WCLK &&& !IS_WCLK_INVERTED && WE, 654);
2021
- $setup(WE, negedge WCLK &&& IS_WCLK_INVERTED && WE, 654);
2022
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L889
2023
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOA : DIA)) = 1153;
2024
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOA : DIA)) = 1153;
2025
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L957
2026
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOB : DIB)) = 1161;
2027
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOB : DIB)) = 1161;
2028
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1025
2029
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOC : DIC)) = 1158;
2030
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOC : DIC)) = 1158;
2031
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L1093
2032
- if (!IS_WCLK_INVERTED && WE) (posedge WCLK => (DOD : DID)) = 1163;
2033
- if ( IS_WCLK_INVERTED && WE) (negedge WCLK => (DOD : DID)) = 1163;
2034
- (ADDRA[0] => DOA) = 642; (ADDRB[0] => DOB) = 642; (ADDRC[0] => DOC) = 642; (ADDRD[0] => DOD) = 642;
2035
- (ADDRA[1] => DOA) = 631; (ADDRB[1] => DOB) = 631; (ADDRC[1] => DOC) = 631; (ADDRD[1] => DOD) = 631;
2036
- (ADDRA[2] => DOA) = 472; (ADDRB[2] => DOB) = 472; (ADDRC[2] => DOC) = 472; (ADDRD[2] => DOD) = 472;
2037
- (ADDRA[3] => DOA) = 407; (ADDRB[3] => DOB) = 407; (ADDRC[3] => DOC) = 407; (ADDRD[3] => DOD) = 407;
2038
- (ADDRA[4] => DOA) = 238; (ADDRB[4] => DOB) = 238; (ADDRC[4] => DOC) = 238; (ADDRD[4] => DOD) = 238;
2039
- endspecify
2040
- endmodule
2041
-
2042
- module RAM64M8 (
2043
- output DOA,
2044
- output DOB,
2045
- output DOC,
2046
- output DOD,
2047
- output DOE,
2048
- output DOF,
2049
- output DOG,
2050
- output DOH,
2051
- input [5:0] ADDRA,
2052
- input [5:0] ADDRB,
2053
- input [5:0] ADDRC,
2054
- input [5:0] ADDRD,
2055
- input [5:0] ADDRE,
2056
- input [5:0] ADDRF,
2057
- input [5:0] ADDRG,
2058
- input [5:0] ADDRH,
2059
- input DIA,
2060
- input DIB,
2061
- input DIC,
2062
- input DID,
2063
- input DIE,
2064
- input DIF,
2065
- input DIG,
2066
- input DIH,
2067
- (* clkbuf_sink *)
2068
- (* invertible_pin = "IS_WCLK_INVERTED" *)
2069
- input WCLK,
2070
- input WE
2071
- );
2072
- parameter [63:0] INIT_A = 64'h0000000000000000;
2073
- parameter [63:0] INIT_B = 64'h0000000000000000;
2074
- parameter [63:0] INIT_C = 64'h0000000000000000;
2075
- parameter [63:0] INIT_D = 64'h0000000000000000;
2076
- parameter [63:0] INIT_E = 64'h0000000000000000;
2077
- parameter [63:0] INIT_F = 64'h0000000000000000;
2078
- parameter [63:0] INIT_G = 64'h0000000000000000;
2079
- parameter [63:0] INIT_H = 64'h0000000000000000;
2080
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2081
- reg [63:0] mem_a = INIT_A;
2082
- reg [63:0] mem_b = INIT_B;
2083
- reg [63:0] mem_c = INIT_C;
2084
- reg [63:0] mem_d = INIT_D;
2085
- reg [63:0] mem_e = INIT_E;
2086
- reg [63:0] mem_f = INIT_F;
2087
- reg [63:0] mem_g = INIT_G;
2088
- reg [63:0] mem_h = INIT_H;
2089
- assign DOA = mem_a[ADDRA];
2090
- assign DOB = mem_b[ADDRB];
2091
- assign DOC = mem_c[ADDRC];
2092
- assign DOD = mem_d[ADDRD];
2093
- assign DOE = mem_e[ADDRE];
2094
- assign DOF = mem_f[ADDRF];
2095
- assign DOG = mem_g[ADDRG];
2096
- assign DOH = mem_h[ADDRH];
2097
- wire clk = WCLK ^ IS_WCLK_INVERTED;
2098
- always @(posedge clk)
2099
- if (WE) begin
2100
- mem_a[ADDRH] <= DIA;
2101
- mem_b[ADDRH] <= DIB;
2102
- mem_c[ADDRH] <= DIC;
2103
- mem_d[ADDRH] <= DID;
2104
- mem_e[ADDRH] <= DIE;
2105
- mem_f[ADDRH] <= DIF;
2106
- mem_g[ADDRH] <= DIG;
2107
- mem_h[ADDRH] <= DIH;
2108
- end
2109
- endmodule
2110
-
2111
- module RAM32X16DR8 (
2112
- output DOA,
2113
- output DOB,
2114
- output DOC,
2115
- output DOD,
2116
- output DOE,
2117
- output DOF,
2118
- output DOG,
2119
- output [1:0] DOH,
2120
- input [5:0] ADDRA, ADDRB, ADDRC, ADDRD, ADDRE, ADDRF, ADDRG,
2121
- input [4:0] ADDRH,
2122
- input [1:0] DIA,
2123
- input [1:0] DIB,
2124
- input [1:0] DIC,
2125
- input [1:0] DID,
2126
- input [1:0] DIE,
2127
- input [1:0] DIF,
2128
- input [1:0] DIG,
2129
- input [1:0] DIH,
2130
- (* clkbuf_sink *)
2131
- (* invertible_pin = "IS_WCLK_INVERTED" *)
2132
- input WCLK,
2133
- input WE
2134
- );
2135
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2136
- reg [63:0] mem_a, mem_b, mem_c, mem_d, mem_e, mem_f, mem_g, mem_h;
2137
- assign DOA = mem_a[ADDRA];
2138
- assign DOB = mem_b[ADDRB];
2139
- assign DOC = mem_c[ADDRC];
2140
- assign DOD = mem_d[ADDRD];
2141
- assign DOE = mem_e[ADDRE];
2142
- assign DOF = mem_f[ADDRF];
2143
- assign DOG = mem_g[ADDRG];
2144
- assign DOH = mem_h[2*ADDRH+:2];
2145
- wire clk = WCLK ^ IS_WCLK_INVERTED;
2146
- always @(posedge clk)
2147
- if (WE) begin
2148
- mem_a[2*ADDRH+:2] <= DIA;
2149
- mem_b[2*ADDRH+:2] <= DIB;
2150
- mem_c[2*ADDRH+:2] <= DIC;
2151
- mem_d[2*ADDRH+:2] <= DID;
2152
- mem_e[2*ADDRH+:2] <= DIE;
2153
- mem_f[2*ADDRH+:2] <= DIF;
2154
- mem_g[2*ADDRH+:2] <= DIG;
2155
- mem_h[2*ADDRH+:2] <= DIH;
2156
- end
2157
- endmodule
2158
-
2159
- module RAM64X8SW (
2160
- output [7:0] O,
2161
- input [5:0] A,
2162
- input D,
2163
- (* clkbuf_sink *)
2164
- (* invertible_pin = "IS_WCLK_INVERTED" *)
2165
- input WCLK,
2166
- input WE,
2167
- input [2:0] WSEL
2168
- );
2169
- parameter [63:0] INIT_A = 64'h0000000000000000;
2170
- parameter [63:0] INIT_B = 64'h0000000000000000;
2171
- parameter [63:0] INIT_C = 64'h0000000000000000;
2172
- parameter [63:0] INIT_D = 64'h0000000000000000;
2173
- parameter [63:0] INIT_E = 64'h0000000000000000;
2174
- parameter [63:0] INIT_F = 64'h0000000000000000;
2175
- parameter [63:0] INIT_G = 64'h0000000000000000;
2176
- parameter [63:0] INIT_H = 64'h0000000000000000;
2177
- parameter [0:0] IS_WCLK_INVERTED = 1'b0;
2178
- reg [63:0] mem_a = INIT_A;
2179
- reg [63:0] mem_b = INIT_B;
2180
- reg [63:0] mem_c = INIT_C;
2181
- reg [63:0] mem_d = INIT_D;
2182
- reg [63:0] mem_e = INIT_E;
2183
- reg [63:0] mem_f = INIT_F;
2184
- reg [63:0] mem_g = INIT_G;
2185
- reg [63:0] mem_h = INIT_H;
2186
- assign O[7] = mem_a[A];
2187
- assign O[6] = mem_b[A];
2188
- assign O[5] = mem_c[A];
2189
- assign O[4] = mem_d[A];
2190
- assign O[3] = mem_e[A];
2191
- assign O[2] = mem_f[A];
2192
- assign O[1] = mem_g[A];
2193
- assign O[0] = mem_h[A];
2194
- wire clk = WCLK ^ IS_WCLK_INVERTED;
2195
- always @(posedge clk)
2196
- if (WE) begin
2197
- case (WSEL)
2198
- 3'b111: mem_a[A] <= D;
2199
- 3'b110: mem_b[A] <= D;
2200
- 3'b101: mem_c[A] <= D;
2201
- 3'b100: mem_d[A] <= D;
2202
- 3'b011: mem_e[A] <= D;
2203
- 3'b010: mem_f[A] <= D;
2204
- 3'b001: mem_g[A] <= D;
2205
- 3'b000: mem_h[A] <= D;
2206
- endcase
2207
- end
2208
- endmodule
2209
-
2210
- // ROM.
2211
-
2212
- module ROM16X1 (
2213
- output O,
2214
- input A0, A1, A2, A3
2215
- );
2216
- parameter [15:0] INIT = 16'h0;
2217
- assign O = INIT[{A3, A2, A1, A0}];
2218
- endmodule
2219
-
2220
- module ROM32X1 (
2221
- output O,
2222
- input A0, A1, A2, A3, A4
2223
- );
2224
- parameter [31:0] INIT = 32'h0;
2225
- assign O = INIT[{A4, A3, A2, A1, A0}];
2226
- endmodule
2227
-
2228
- module ROM64X1 (
2229
- output O,
2230
- input A0, A1, A2, A3, A4, A5
2231
- );
2232
- parameter [63:0] INIT = 64'h0;
2233
- assign O = INIT[{A5, A4, A3, A2, A1, A0}];
2234
- endmodule
2235
-
2236
- module ROM128X1 (
2237
- output O,
2238
- input A0, A1, A2, A3, A4, A5, A6
2239
- );
2240
- parameter [127:0] INIT = 128'h0;
2241
- assign O = INIT[{A6, A5, A4, A3, A2, A1, A0}];
2242
- endmodule
2243
-
2244
- module ROM256X1 (
2245
- output O,
2246
- input A0, A1, A2, A3, A4, A5, A6, A7
2247
- );
2248
- parameter [255:0] INIT = 256'h0;
2249
- assign O = INIT[{A7, A6, A5, A4, A3, A2, A1, A0}];
2250
- endmodule
2251
-
2252
- // Shift registers.
2253
-
2254
- (* abc9_box, lib_whitebox *)
2255
- module SRL16 (
2256
- output Q,
2257
- input A0, A1, A2, A3,
2258
- (* clkbuf_sink *)
2259
- input CLK,
2260
- input D
2261
- );
2262
- parameter [15:0] INIT = 16'h0000;
2263
-
2264
- reg [15:0] r = INIT;
2265
- assign Q = r[{A3,A2,A1,A0}];
2266
- always @(posedge CLK) r <= { r[14:0], D };
2267
-
2268
- specify
2269
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2270
- (posedge CLK => (Q : 1'bx)) = 1472;
2271
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2272
- $setup(D , posedge CLK, 173);
2273
- (A0 => Q) = 631;
2274
- (A1 => Q) = 472;
2275
- (A2 => Q) = 407;
2276
- (A3 => Q) = 238;
2277
- endspecify
2278
- endmodule
2279
-
2280
- (* abc9_box, lib_whitebox *)
2281
- module SRL16E (
2282
- output Q,
2283
- input A0, A1, A2, A3, CE,
2284
- (* clkbuf_sink *)
2285
- (* invertible_pin = "IS_CLK_INVERTED" *)
2286
- input CLK,
2287
- input D
2288
- );
2289
- parameter [15:0] INIT = 16'h0000;
2290
- parameter [0:0] IS_CLK_INVERTED = 1'b0;
2291
-
2292
- reg [15:0] r = INIT;
2293
- assign Q = r[{A3,A2,A1,A0}];
2294
- generate
2295
- if (IS_CLK_INVERTED) begin
2296
- always @(negedge CLK) if (CE) r <= { r[14:0], D };
2297
- end
2298
- else
2299
- always @(posedge CLK) if (CE) r <= { r[14:0], D };
2300
- endgenerate
2301
- specify
2302
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2303
- $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2304
- $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2305
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2306
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : D)) = 1472;
2307
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : D)) = 1472;
2308
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2309
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : 1'bx)) = 1472;
2310
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : 1'bx)) = 1472;
2311
- (A0 => Q) = 631;
2312
- (A1 => Q) = 472;
2313
- (A2 => Q) = 407;
2314
- (A3 => Q) = 238;
2315
- endspecify
2316
- endmodule
2317
-
2318
- (* abc9_box, lib_whitebox *)
2319
- module SRLC16 (
2320
- output Q,
2321
- output Q15,
2322
- input A0, A1, A2, A3,
2323
- (* clkbuf_sink *)
2324
- input CLK,
2325
- input D
2326
- );
2327
- parameter [15:0] INIT = 16'h0000;
2328
-
2329
- reg [15:0] r = INIT;
2330
- assign Q15 = r[15];
2331
- assign Q = r[{A3,A2,A1,A0}];
2332
- always @(posedge CLK) r <= { r[14:0], D };
2333
-
2334
- specify
2335
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2336
- $setup(D , posedge CLK, 173);
2337
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2338
- (posedge CLK => (Q : 1'bx)) = 1472;
2339
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2340
- (posedge CLK => (Q15 : 1'bx)) = 1114;
2341
- (A0 => Q) = 631;
2342
- (A1 => Q) = 472;
2343
- (A2 => Q) = 407;
2344
- (A3 => Q) = 238;
2345
- endspecify
2346
- endmodule
2347
-
2348
- (* abc9_box, lib_whitebox *)
2349
- module SRLC16E (
2350
- output Q,
2351
- output Q15,
2352
- input A0, A1, A2, A3, CE,
2353
- (* clkbuf_sink *)
2354
- (* invertible_pin = "IS_CLK_INVERTED" *)
2355
- input CLK,
2356
- input D
2357
- );
2358
- parameter [15:0] INIT = 16'h0000;
2359
- parameter [0:0] IS_CLK_INVERTED = 1'b0;
2360
-
2361
- reg [15:0] r = INIT;
2362
- assign Q15 = r[15];
2363
- assign Q = r[{A3,A2,A1,A0}];
2364
- generate
2365
- if (IS_CLK_INVERTED) begin
2366
- always @(negedge CLK) if (CE) r <= { r[14:0], D };
2367
- end
2368
- else
2369
- always @(posedge CLK) if (CE) r <= { r[14:0], D };
2370
- endgenerate
2371
- specify
2372
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2373
- $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2374
- $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2375
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
2376
- $setup(CE, posedge CLK &&& !IS_CLK_INVERTED, 109);
2377
- $setup(CE, negedge CLK &&& IS_CLK_INVERTED, 109);
2378
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2379
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : D)) = 1472;
2380
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : D)) = 1472;
2381
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2382
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q15 : 1'bx)) = 1114;
2383
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q15 : 1'bx)) = 1114;
2384
- (A0 => Q) = 631;
2385
- (A1 => Q) = 472;
2386
- (A2 => Q) = 407;
2387
- (A3 => Q) = 238;
2388
- endspecify
2389
- endmodule
2390
-
2391
- (* abc9_box, lib_whitebox *)
2392
- module SRLC32E (
2393
- output Q,
2394
- output Q31,
2395
- input [4:0] A,
2396
- input CE,
2397
- (* clkbuf_sink *)
2398
- (* invertible_pin = "IS_CLK_INVERTED" *)
2399
- input CLK,
2400
- input D
2401
- );
2402
- parameter [31:0] INIT = 32'h00000000;
2403
- parameter [0:0] IS_CLK_INVERTED = 1'b0;
2404
-
2405
- reg [31:0] r = INIT;
2406
- assign Q31 = r[31];
2407
- assign Q = r[A];
2408
- generate
2409
- if (IS_CLK_INVERTED) begin
2410
- always @(negedge CLK) if (CE) r <= { r[30:0], D };
2411
- end
2412
- else
2413
- always @(posedge CLK) if (CE) r <= { r[30:0], D };
2414
- endgenerate
2415
- specify
2416
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L912
2417
- $setup(D , posedge CLK &&& !IS_CLK_INVERTED, 173);
2418
- $setup(D , negedge CLK &&& IS_CLK_INVERTED, 173);
2419
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L248
2420
- $setup(CE, posedge CLK &&& !IS_CLK_INVERTED, 109);
2421
- $setup(CE, negedge CLK &&& IS_CLK_INVERTED, 109);
2422
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L905
2423
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q : 1'bx)) = 1472;
2424
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q : 1'bx)) = 1472;
2425
- // Max delay from: https://github.com/SymbiFlow/prjxray-db/blob/34ea6eb08a63d21ec16264ad37a0a7b142ff6031/artix7/timings/CLBLM_R.sdf#L904
2426
- if (!IS_CLK_INVERTED && CE) (posedge CLK => (Q31 : 1'bx)) = 1114;
2427
- if ( IS_CLK_INVERTED && CE) (negedge CLK => (Q31 : 1'bx)) = 1114;
2428
- (A[0] => Q) = 642;
2429
- (A[1] => Q) = 631;
2430
- (A[2] => Q) = 472;
2431
- (A[3] => Q) = 407;
2432
- (A[4] => Q) = 238;
2433
- endspecify
2434
- endmodule
2435
-
2436
- module CFGLUT5 (
2437
- output CDO,
2438
- output O5,
2439
- output O6,
2440
- input I4,
2441
- input I3,
2442
- input I2,
2443
- input I1,
2444
- input I0,
2445
- input CDI,
2446
- input CE,
2447
- (* clkbuf_sink *)
2448
- (* invertible_pin = "IS_CLK_INVERTED" *)
2449
- input CLK
2450
- );
2451
- parameter [31:0] INIT = 32'h00000000;
2452
- parameter [0:0] IS_CLK_INVERTED = 1'b0;
2453
- wire clk = CLK ^ IS_CLK_INVERTED;
2454
- reg [31:0] r = INIT;
2455
- assign CDO = r[31];
2456
- assign O5 = r[{1'b0, I3, I2, I1, I0}];
2457
- assign O6 = r[{I4, I3, I2, I1, I0}];
2458
- always @(posedge clk) if (CE) r <= {r[30:0], CDI};
2459
- endmodule
2460
-
2461
- // DSP
2462
-
2463
- // Virtex 2, Virtex 2 Pro, Spartan 3.
2464
-
2465
- // Asynchronous mode.
2466
-
2467
- module MULT18X18 (
2468
- input signed [17:0] A,
2469
- input signed [17:0] B,
2470
- output signed [35:0] P
2471
- );
2472
-
2473
- assign P = A * B;
2474
-
2475
- endmodule
2476
-
2477
- // Synchronous mode.
2478
-
2479
- module MULT18X18S (
2480
- input signed [17:0] A,
2481
- input signed [17:0] B,
2482
- output reg signed [35:0] P,
2483
- (* clkbuf_sink *)
2484
- input C,
2485
- input CE,
2486
- input R
2487
- );
2488
-
2489
- always @(posedge C)
2490
- if (R)
2491
- P <= 0;
2492
- else if (CE)
2493
- P <= A * B;
2494
-
2495
- endmodule
2496
-
2497
- // Spartan 3E, Spartan 3A.
2498
-
2499
- module MULT18X18SIO (
2500
- input signed [17:0] A,
2501
- input signed [17:0] B,
2502
- output signed [35:0] P,
2503
- (* clkbuf_sink *)
2504
- input CLK,
2505
- input CEA,
2506
- input CEB,
2507
- input CEP,
2508
- input RSTA,
2509
- input RSTB,
2510
- input RSTP,
2511
- input signed [17:0] BCIN,
2512
- output signed [17:0] BCOUT
2513
- );
2514
-
2515
- parameter integer AREG = 1;
2516
- parameter integer BREG = 1;
2517
- parameter B_INPUT = "DIRECT";
2518
- parameter integer PREG = 1;
2519
-
2520
- // The multiplier.
2521
- wire signed [35:0] P_MULT;
2522
- wire signed [17:0] A_MULT;
2523
- wire signed [17:0] B_MULT;
2524
- assign P_MULT = A_MULT * B_MULT;
2525
-
2526
- // The cascade output.
2527
- assign BCOUT = B_MULT;
2528
-
2529
- // The B input multiplexer.
2530
- wire signed [17:0] B_MUX;
2531
- assign B_MUX = (B_INPUT == "DIRECT") ? B : BCIN;
2532
-
2533
- // The registers.
2534
- reg signed [17:0] A_REG;
2535
- reg signed [17:0] B_REG;
2536
- reg signed [35:0] P_REG;
2537
-
2538
- initial begin
2539
- A_REG = 0;
2540
- B_REG = 0;
2541
- P_REG = 0;
2542
- end
2543
-
2544
- always @(posedge CLK) begin
2545
- if (RSTA)
2546
- A_REG <= 0;
2547
- else if (CEA)
2548
- A_REG <= A;
2549
-
2550
- if (RSTB)
2551
- B_REG <= 0;
2552
- else if (CEB)
2553
- B_REG <= B_MUX;
2554
-
2555
- if (RSTP)
2556
- P_REG <= 0;
2557
- else if (CEP)
2558
- P_REG <= P_MULT;
2559
- end
2560
-
2561
- // The register enables.
2562
- assign A_MULT = (AREG == 1) ? A_REG : A;
2563
- assign B_MULT = (BREG == 1) ? B_REG : B_MUX;
2564
- assign P = (PREG == 1) ? P_REG : P_MULT;
2565
-
2566
- endmodule
2567
-
2568
- // Spartan 3A DSP.
2569
-
2570
- module DSP48A (
2571
- input signed [17:0] A,
2572
- input signed [17:0] B,
2573
- input signed [47:0] C,
2574
- input signed [17:0] D,
2575
- input signed [47:0] PCIN,
2576
- input CARRYIN,
2577
- input [7:0] OPMODE,
2578
- output signed [47:0] P,
2579
- output signed [17:0] BCOUT,
2580
- output signed [47:0] PCOUT,
2581
- output CARRYOUT,
2582
- (* clkbuf_sink *)
2583
- input CLK,
2584
- input CEA,
2585
- input CEB,
2586
- input CEC,
2587
- input CED,
2588
- input CEM,
2589
- input CECARRYIN,
2590
- input CEOPMODE,
2591
- input CEP,
2592
- input RSTA,
2593
- input RSTB,
2594
- input RSTC,
2595
- input RSTD,
2596
- input RSTM,
2597
- input RSTCARRYIN,
2598
- input RSTOPMODE,
2599
- input RSTP
2600
- );
2601
-
2602
- parameter integer A0REG = 0;
2603
- parameter integer A1REG = 1;
2604
- parameter integer B0REG = 0;
2605
- parameter integer B1REG = 1;
2606
- parameter integer CREG = 1;
2607
- parameter integer DREG = 1;
2608
- parameter integer MREG = 1;
2609
- parameter integer CARRYINREG = 1;
2610
- parameter integer OPMODEREG = 1;
2611
- parameter integer PREG = 1;
2612
- parameter CARRYINSEL = "CARRYIN";
2613
- parameter RSTTYPE = "SYNC";
2614
-
2615
- // This is a strict subset of Spartan 6 -- reuse its model.
2616
-
2617
- /* verilator lint_off PINMISSING */
2618
- DSP48A1 #(
2619
- .A0REG(A0REG),
2620
- .A1REG(A1REG),
2621
- .B0REG(B0REG),
2622
- .B1REG(B1REG),
2623
- .CREG(CREG),
2624
- .DREG(DREG),
2625
- .MREG(MREG),
2626
- .CARRYINREG(CARRYINREG),
2627
- .CARRYOUTREG(0),
2628
- .OPMODEREG(OPMODEREG),
2629
- .PREG(PREG),
2630
- .CARRYINSEL(CARRYINSEL),
2631
- .RSTTYPE(RSTTYPE)
2632
- ) upgrade (
2633
- .A(A),
2634
- .B(B),
2635
- .C(C),
2636
- .D(D),
2637
- .PCIN(PCIN),
2638
- .CARRYIN(CARRYIN),
2639
- .OPMODE(OPMODE),
2640
- // M unconnected
2641
- .P(P),
2642
- .BCOUT(BCOUT),
2643
- .PCOUT(PCOUT),
2644
- .CARRYOUT(CARRYOUT),
2645
- // CARRYOUTF unconnected
2646
- .CLK(CLK),
2647
- .CEA(CEA),
2648
- .CEB(CEB),
2649
- .CEC(CEC),
2650
- .CED(CED),
2651
- .CEM(CEM),
2652
- .CECARRYIN(CECARRYIN),
2653
- .CEOPMODE(CEOPMODE),
2654
- .CEP(CEP),
2655
- .RSTA(RSTA),
2656
- .RSTB(RSTB),
2657
- .RSTC(RSTC),
2658
- .RSTD(RSTD),
2659
- .RSTM(RSTM),
2660
- .RSTCARRYIN(RSTCARRYIN),
2661
- .RSTOPMODE(RSTOPMODE),
2662
- .RSTP(RSTP)
2663
- );
2664
- /* verilator lint_on PINMISSING */
2665
-
2666
- endmodule
2667
-
2668
- // Spartan 6.
2669
-
2670
- module DSP48A1 (
2671
- input signed [17:0] A,
2672
- input signed [17:0] B,
2673
- input signed [47:0] C,
2674
- input signed [17:0] D,
2675
- input signed [47:0] PCIN,
2676
- input CARRYIN,
2677
- input [7:0] OPMODE,
2678
- output signed [35:0] M,
2679
- output signed [47:0] P,
2680
- output signed [17:0] BCOUT,
2681
- output signed [47:0] PCOUT,
2682
- output CARRYOUT,
2683
- output CARRYOUTF,
2684
- (* clkbuf_sink *)
2685
- input CLK,
2686
- input CEA,
2687
- input CEB,
2688
- input CEC,
2689
- input CED,
2690
- input CEM,
2691
- input CECARRYIN,
2692
- input CEOPMODE,
2693
- input CEP,
2694
- input RSTA,
2695
- input RSTB,
2696
- input RSTC,
2697
- input RSTD,
2698
- input RSTM,
2699
- input RSTCARRYIN,
2700
- input RSTOPMODE,
2701
- input RSTP
2702
- );
2703
-
2704
- parameter integer A0REG = 0;
2705
- parameter integer A1REG = 1;
2706
- parameter integer B0REG = 0;
2707
- parameter integer B1REG = 1;
2708
- parameter integer CREG = 1;
2709
- parameter integer DREG = 1;
2710
- parameter integer MREG = 1;
2711
- parameter integer CARRYINREG = 1;
2712
- parameter integer CARRYOUTREG = 1;
2713
- parameter integer OPMODEREG = 1;
2714
- parameter integer PREG = 1;
2715
- parameter CARRYINSEL = "OPMODE5";
2716
- parameter RSTTYPE = "SYNC";
2717
-
2718
- wire signed [35:0] M_MULT;
2719
- wire signed [47:0] P_IN;
2720
- wire signed [17:0] A0_OUT;
2721
- wire signed [17:0] B0_OUT;
2722
- wire signed [17:0] A1_OUT;
2723
- wire signed [17:0] B1_OUT;
2724
- wire signed [17:0] B1_IN;
2725
- wire signed [47:0] C_OUT;
2726
- wire signed [17:0] D_OUT;
2727
- wire signed [7:0] OPMODE_OUT;
2728
- wire CARRYIN_OUT;
2729
- wire CARRYOUT_IN;
2730
- wire CARRYIN_IN;
2731
- reg signed [47:0] XMUX;
2732
- reg signed [47:0] ZMUX;
2733
-
2734
- // The registers.
2735
- reg signed [17:0] A0_REG;
2736
- reg signed [17:0] A1_REG;
2737
- reg signed [17:0] B0_REG;
2738
- reg signed [17:0] B1_REG;
2739
- reg signed [47:0] C_REG;
2740
- reg signed [17:0] D_REG;
2741
- reg signed [35:0] M_REG;
2742
- reg signed [47:0] P_REG;
2743
- reg [7:0] OPMODE_REG;
2744
- reg CARRYIN_REG;
2745
- reg CARRYOUT_REG;
2746
-
2747
- initial begin
2748
- A0_REG = 0;
2749
- A1_REG = 0;
2750
- B0_REG = 0;
2751
- B1_REG = 0;
2752
- C_REG = 0;
2753
- D_REG = 0;
2754
- M_REG = 0;
2755
- P_REG = 0;
2756
- OPMODE_REG = 0;
2757
- CARRYIN_REG = 0;
2758
- CARRYOUT_REG = 0;
2759
- end
2760
-
2761
- generate
2762
-
2763
- if (RSTTYPE == "SYNC") begin
2764
- always @(posedge CLK) begin
2765
- if (RSTA) begin
2766
- A0_REG <= 0;
2767
- A1_REG <= 0;
2768
- end else if (CEA) begin
2769
- A0_REG <= A;
2770
- A1_REG <= A0_OUT;
2771
- end
2772
- end
2773
-
2774
- always @(posedge CLK) begin
2775
- if (RSTB) begin
2776
- B0_REG <= 0;
2777
- B1_REG <= 0;
2778
- end else if (CEB) begin
2779
- B0_REG <= B;
2780
- B1_REG <= B1_IN;
2781
- end
2782
- end
2783
-
2784
- always @(posedge CLK) begin
2785
- if (RSTC) begin
2786
- C_REG <= 0;
2787
- end else if (CEC) begin
2788
- C_REG <= C;
2789
- end
2790
- end
2791
-
2792
- always @(posedge CLK) begin
2793
- if (RSTD) begin
2794
- D_REG <= 0;
2795
- end else if (CED) begin
2796
- D_REG <= D;
2797
- end
2798
- end
2799
-
2800
- always @(posedge CLK) begin
2801
- if (RSTM) begin
2802
- M_REG <= 0;
2803
- end else if (CEM) begin
2804
- M_REG <= M_MULT;
2805
- end
2806
- end
2807
-
2808
- always @(posedge CLK) begin
2809
- if (RSTP) begin
2810
- P_REG <= 0;
2811
- end else if (CEP) begin
2812
- P_REG <= P_IN;
2813
- end
2814
- end
2815
-
2816
- always @(posedge CLK) begin
2817
- if (RSTOPMODE) begin
2818
- OPMODE_REG <= 0;
2819
- end else if (CEOPMODE) begin
2820
- OPMODE_REG <= OPMODE;
2821
- end
2822
- end
2823
-
2824
- always @(posedge CLK) begin
2825
- if (RSTCARRYIN) begin
2826
- CARRYIN_REG <= 0;
2827
- CARRYOUT_REG <= 0;
2828
- end else if (CECARRYIN) begin
2829
- CARRYIN_REG <= CARRYIN_IN;
2830
- CARRYOUT_REG <= CARRYOUT_IN;
2831
- end
2832
- end
2833
- end else begin
2834
- always @(posedge CLK, posedge RSTA) begin
2835
- if (RSTA) begin
2836
- A0_REG <= 0;
2837
- A1_REG <= 0;
2838
- end else if (CEA) begin
2839
- A0_REG <= A;
2840
- A1_REG <= A0_OUT;
2841
- end
2842
- end
2843
-
2844
- always @(posedge CLK, posedge RSTB) begin
2845
- if (RSTB) begin
2846
- B0_REG <= 0;
2847
- B1_REG <= 0;
2848
- end else if (CEB) begin
2849
- B0_REG <= B;
2850
- B1_REG <= B1_IN;
2851
- end
2852
- end
2853
-
2854
- always @(posedge CLK, posedge RSTC) begin
2855
- if (RSTC) begin
2856
- C_REG <= 0;
2857
- end else if (CEC) begin
2858
- C_REG <= C;
2859
- end
2860
- end
2861
-
2862
- always @(posedge CLK, posedge RSTD) begin
2863
- if (RSTD) begin
2864
- D_REG <= 0;
2865
- end else if (CED) begin
2866
- D_REG <= D;
2867
- end
2868
- end
2869
-
2870
- always @(posedge CLK, posedge RSTM) begin
2871
- if (RSTM) begin
2872
- M_REG <= 0;
2873
- end else if (CEM) begin
2874
- M_REG <= M_MULT;
2875
- end
2876
- end
2877
-
2878
- always @(posedge CLK, posedge RSTP) begin
2879
- if (RSTP) begin
2880
- P_REG <= 0;
2881
- end else if (CEP) begin
2882
- P_REG <= P_IN;
2883
- end
2884
- end
2885
-
2886
- always @(posedge CLK, posedge RSTOPMODE) begin
2887
- if (RSTOPMODE) begin
2888
- OPMODE_REG <= 0;
2889
- end else if (CEOPMODE) begin
2890
- OPMODE_REG <= OPMODE;
2891
- end
2892
- end
2893
-
2894
- always @(posedge CLK, posedge RSTCARRYIN) begin
2895
- if (RSTCARRYIN) begin
2896
- CARRYIN_REG <= 0;
2897
- CARRYOUT_REG <= 0;
2898
- end else if (CECARRYIN) begin
2899
- CARRYIN_REG <= CARRYIN_IN;
2900
- CARRYOUT_REG <= CARRYOUT_IN;
2901
- end
2902
- end
2903
- end
2904
-
2905
- endgenerate
2906
-
2907
- // The register enables.
2908
- assign A0_OUT = (A0REG == 1) ? A0_REG : A;
2909
- assign A1_OUT = (A1REG == 1) ? A1_REG : A0_OUT;
2910
- assign B0_OUT = (B0REG == 1) ? B0_REG : B;
2911
- assign B1_OUT = (B1REG == 1) ? B1_REG : B1_IN;
2912
- assign C_OUT = (CREG == 1) ? C_REG : C;
2913
- assign D_OUT = (DREG == 1) ? D_REG : D;
2914
- assign M = (MREG == 1) ? M_REG : M_MULT;
2915
- assign P = (PREG == 1) ? P_REG : P_IN;
2916
- assign OPMODE_OUT = (OPMODEREG == 1) ? OPMODE_REG : OPMODE;
2917
- assign CARRYIN_OUT = (CARRYINREG == 1) ? CARRYIN_REG : CARRYIN_IN;
2918
- assign CARRYOUT = (CARRYOUTREG == 1) ? CARRYOUT_REG : CARRYOUT_IN;
2919
- assign CARRYOUTF = CARRYOUT;
2920
-
2921
- // The pre-adder.
2922
- wire signed [17:0] PREADDER;
2923
- assign B1_IN = OPMODE_OUT[4] ? PREADDER : B0_OUT;
2924
- assign PREADDER = OPMODE_OUT[6] ? D_OUT - B0_OUT : D_OUT + B0_OUT;
2925
-
2926
- // The multiplier.
2927
- assign M_MULT = A1_OUT * B1_OUT;
2928
-
2929
- // The carry in selection.
2930
- assign CARRYIN_IN = (CARRYINSEL == "OPMODE5") ? OPMODE_OUT[5] : CARRYIN;
2931
-
2932
- // The post-adder inputs.
2933
- always @* begin
2934
- case (OPMODE_OUT[1:0])
2935
- 2'b00: XMUX <= 0;
2936
- 2'b01: XMUX <= M;
2937
- 2'b10: XMUX <= P;
2938
- 2'b11: XMUX <= {D_OUT[11:0], A1_OUT, B1_OUT};
2939
- default: XMUX <= 48'hxxxxxxxxxxxx;
2940
- endcase
2941
- end
2942
-
2943
- always @* begin
2944
- case (OPMODE_OUT[3:2])
2945
- 2'b00: ZMUX <= 0;
2946
- 2'b01: ZMUX <= PCIN;
2947
- 2'b10: ZMUX <= P;
2948
- 2'b11: ZMUX <= C_OUT;
2949
- default: ZMUX <= 48'hxxxxxxxxxxxx;
2950
- endcase
2951
- end
2952
-
2953
- // The post-adder.
2954
- wire signed [48:0] X_EXT;
2955
- wire signed [48:0] Z_EXT;
2956
- assign X_EXT = {1'b0, XMUX};
2957
- assign Z_EXT = {1'b0, ZMUX};
2958
- assign {CARRYOUT_IN, P_IN} = OPMODE_OUT[7] ? (Z_EXT - (X_EXT + CARRYIN_OUT)) : (Z_EXT + X_EXT + CARRYIN_OUT);
2959
-
2960
- // Cascade outputs.
2961
- assign BCOUT = B1_OUT;
2962
- assign PCOUT = P;
2963
-
2964
- endmodule
2965
-
2966
- module DSP48 (
2967
- input signed [17:0] A,
2968
- input signed [17:0] B,
2969
- input signed [47:0] C,
2970
- input signed [17:0] BCIN,
2971
- input signed [47:0] PCIN,
2972
- input CARRYIN,
2973
- input [6:0] OPMODE,
2974
- input SUBTRACT,
2975
- input [1:0] CARRYINSEL,
2976
- output signed [47:0] P,
2977
- output signed [17:0] BCOUT,
2978
- output signed [47:0] PCOUT,
2979
- (* clkbuf_sink *)
2980
- input CLK,
2981
- input CEA,
2982
- input CEB,
2983
- input CEC,
2984
- input CEM,
2985
- input CECARRYIN,
2986
- input CECINSUB,
2987
- input CECTRL,
2988
- input CEP,
2989
- input RSTA,
2990
- input RSTB,
2991
- input RSTC,
2992
- input RSTM,
2993
- input RSTCARRYIN,
2994
- input RSTCTRL,
2995
- input RSTP
2996
- );
2997
-
2998
- parameter integer AREG = 1;
2999
- parameter integer BREG = 1;
3000
- parameter integer CREG = 1;
3001
- parameter integer MREG = 1;
3002
- parameter integer PREG = 1;
3003
- parameter integer CARRYINREG = 1;
3004
- parameter integer CARRYINSELREG = 1;
3005
- parameter integer OPMODEREG = 1;
3006
- parameter integer SUBTRACTREG = 1;
3007
- parameter B_INPUT = "DIRECT";
3008
- parameter LEGACY_MODE = "MULT18X18S";
3009
-
3010
- wire signed [17:0] A_OUT;
3011
- wire signed [17:0] B_OUT;
3012
- wire signed [47:0] C_OUT;
3013
- wire signed [35:0] M_MULT;
3014
- wire signed [35:0] M_OUT;
3015
- wire signed [47:0] P_IN;
3016
- wire [6:0] OPMODE_OUT;
3017
- wire [1:0] CARRYINSEL_OUT;
3018
- wire CARRYIN_OUT;
3019
- wire SUBTRACT_OUT;
3020
- reg INT_CARRYIN_XY;
3021
- reg INT_CARRYIN_Z;
3022
- reg signed [47:0] XMUX;
3023
- reg signed [47:0] YMUX;
3024
- wire signed [47:0] XYMUX;
3025
- reg signed [47:0] ZMUX;
3026
- reg CIN;
3027
-
3028
- // The B input multiplexer.
3029
- wire signed [17:0] B_MUX;
3030
- assign B_MUX = (B_INPUT == "DIRECT") ? B : BCIN;
3031
-
3032
- // The cascade output.
3033
- assign BCOUT = B_OUT;
3034
- assign PCOUT = P;
3035
-
3036
- // The registers.
3037
- reg signed [17:0] A0_REG;
3038
- reg signed [17:0] A1_REG;
3039
- reg signed [17:0] B0_REG;
3040
- reg signed [17:0] B1_REG;
3041
- reg signed [47:0] C_REG;
3042
- reg signed [35:0] M_REG;
3043
- reg signed [47:0] P_REG;
3044
- reg [6:0] OPMODE_REG;
3045
- reg [1:0] CARRYINSEL_REG;
3046
- reg SUBTRACT_REG;
3047
- reg CARRYIN_REG;
3048
- reg INT_CARRYIN_XY_REG;
3049
-
3050
- initial begin
3051
- A0_REG = 0;
3052
- A1_REG = 0;
3053
- B0_REG = 0;
3054
- B1_REG = 0;
3055
- C_REG = 0;
3056
- M_REG = 0;
3057
- P_REG = 0;
3058
- OPMODE_REG = 0;
3059
- CARRYINSEL_REG = 0;
3060
- SUBTRACT_REG = 0;
3061
- CARRYIN_REG = 0;
3062
- INT_CARRYIN_XY_REG = 0;
3063
- end
3064
-
3065
- always @(posedge CLK) begin
3066
- if (RSTA) begin
3067
- A0_REG <= 0;
3068
- A1_REG <= 0;
3069
- end else if (CEA) begin
3070
- A0_REG <= A;
3071
- A1_REG <= A0_REG;
3072
- end
3073
- if (RSTB) begin
3074
- B0_REG <= 0;
3075
- B1_REG <= 0;
3076
- end else if (CEB) begin
3077
- B0_REG <= B_MUX;
3078
- B1_REG <= B0_REG;
3079
- end
3080
- if (RSTC) begin
3081
- C_REG <= 0;
3082
- end else if (CEC) begin
3083
- C_REG <= C;
3084
- end
3085
- if (RSTM) begin
3086
- M_REG <= 0;
3087
- end else if (CEM) begin
3088
- M_REG <= M_MULT;
3089
- end
3090
- if (RSTP) begin
3091
- P_REG <= 0;
3092
- end else if (CEP) begin
3093
- P_REG <= P_IN;
3094
- end
3095
- if (RSTCTRL) begin
3096
- OPMODE_REG <= 0;
3097
- CARRYINSEL_REG <= 0;
3098
- SUBTRACT_REG <= 0;
3099
- end else begin
3100
- if (CECTRL) begin
3101
- OPMODE_REG <= OPMODE;
3102
- CARRYINSEL_REG <= CARRYINSEL;
3103
- end
3104
- if (CECINSUB)
3105
- SUBTRACT_REG <= SUBTRACT;
3106
- end
3107
- if (RSTCARRYIN) begin
3108
- CARRYIN_REG <= 0;
3109
- INT_CARRYIN_XY_REG <= 0;
3110
- end else begin
3111
- if (CECINSUB)
3112
- CARRYIN_REG <= CARRYIN;
3113
- if (CECARRYIN)
3114
- INT_CARRYIN_XY_REG <= INT_CARRYIN_XY;
3115
- end
3116
- end
3117
-
3118
- // The register enables.
3119
- assign A_OUT = (AREG == 2) ? A1_REG : (AREG == 1) ? A0_REG : A;
3120
- assign B_OUT = (BREG == 2) ? B1_REG : (BREG == 1) ? B0_REG : B_MUX;
3121
- assign C_OUT = (CREG == 1) ? C_REG : C;
3122
- assign M_OUT = (MREG == 1) ? M_REG : M_MULT;
3123
- assign P = (PREG == 1) ? P_REG : P_IN;
3124
- assign OPMODE_OUT = (OPMODEREG == 1) ? OPMODE_REG : OPMODE;
3125
- assign SUBTRACT_OUT = (SUBTRACTREG == 1) ? SUBTRACT_REG : SUBTRACT;
3126
- assign CARRYINSEL_OUT = (CARRYINSELREG == 1) ? CARRYINSEL_REG : CARRYINSEL;
3127
- assign CARRYIN_OUT = (CARRYINREG == 1) ? CARRYIN_REG : CARRYIN;
3128
-
3129
- // The multiplier.
3130
- assign M_MULT = A_OUT * B_OUT;
3131
-
3132
- // The post-adder inputs.
3133
- always @* begin
3134
- case (OPMODE_OUT[1:0])
3135
- 2'b00: XMUX <= 0;
3136
- 2'b10: XMUX <= P;
3137
- 2'b11: XMUX <= {{12{A_OUT[17]}}, A_OUT, B_OUT};
3138
- default: XMUX <= 48'hxxxxxxxxxxxx;
3139
- endcase
3140
- case (OPMODE_OUT[1:0])
3141
- 2'b01: INT_CARRYIN_XY <= A_OUT[17] ~^ B_OUT[17];
3142
- 2'b11: INT_CARRYIN_XY <= ~A_OUT[17];
3143
- // TODO: not tested in hardware.
3144
- default: INT_CARRYIN_XY <= A_OUT[17] ~^ B_OUT[17];
3145
- endcase
3146
- end
3147
-
3148
- always @* begin
3149
- case (OPMODE_OUT[3:2])
3150
- 2'b00: YMUX <= 0;
3151
- 2'b11: YMUX <= C_OUT;
3152
- default: YMUX <= 48'hxxxxxxxxxxxx;
3153
- endcase
3154
- end
3155
-
3156
- assign XYMUX = (OPMODE_OUT[3:0] == 4'b0101) ? M_OUT : (XMUX + YMUX);
3157
-
3158
- always @* begin
3159
- case (OPMODE_OUT[6:4])
3160
- 3'b000: ZMUX <= 0;
3161
- 3'b001: ZMUX <= PCIN;
3162
- 3'b010: ZMUX <= P;
3163
- 3'b011: ZMUX <= C_OUT;
3164
- 3'b101: ZMUX <= {{17{PCIN[47]}}, PCIN[47:17]};
3165
- 3'b110: ZMUX <= {{17{P[47]}}, P[47:17]};
3166
- default: ZMUX <= 48'hxxxxxxxxxxxx;
3167
- endcase
3168
- // TODO: check how all this works on actual hw.
3169
- if (OPMODE_OUT[1:0] == 2'b10)
3170
- INT_CARRYIN_Z <= ~P[47];
3171
- else
3172
- case (OPMODE_OUT[6:4])
3173
- 3'b001: INT_CARRYIN_Z <= ~PCIN[47];
3174
- 3'b010: INT_CARRYIN_Z <= ~P[47];
3175
- 3'b101: INT_CARRYIN_Z <= ~PCIN[47];
3176
- 3'b110: INT_CARRYIN_Z <= ~P[47];
3177
- default: INT_CARRYIN_Z <= 1'bx;
3178
- endcase
3179
- end
3180
-
3181
- always @* begin
3182
- case (CARRYINSEL_OUT)
3183
- 2'b00: CIN <= CARRYIN_OUT;
3184
- 2'b01: CIN <= INT_CARRYIN_Z;
3185
- 2'b10: CIN <= INT_CARRYIN_XY;
3186
- 2'b11: CIN <= INT_CARRYIN_XY_REG;
3187
- default: CIN <= 1'bx;
3188
- endcase
3189
- end
3190
-
3191
- // The post-adder.
3192
- assign P_IN = SUBTRACT_OUT ? (ZMUX - (XYMUX + CIN)) : (ZMUX + XYMUX + CIN);
3193
-
3194
- endmodule
3195
-
3196
- // TODO: DSP48E (Virtex 5).
3197
-
3198
- // Virtex 6, Series 7.
3199
-
3200
- `ifdef YOSYS
3201
- (* abc9_box=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG)
3202
- `ifdef ALLOW_WHITEBOX_DSP48E1
3203
- // Do not make DSP48E1 a whitebox for ABC9 even if fully combinatorial, since it is a big complex block
3204
- , lib_whitebox=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG || INMODEREG || OPMODEREG || ALUMODEREG || CARRYINREG || CARRYINSELREG)
3205
- `endif
3206
- *)
3207
- `endif
3208
- module DSP48E1 (
3209
- output [29:0] ACOUT,
3210
- output [17:0] BCOUT,
3211
- output reg CARRYCASCOUT,
3212
- output reg [3:0] CARRYOUT,
3213
- output reg MULTSIGNOUT,
3214
- output OVERFLOW,
3215
- output reg signed [47:0] P,
3216
- output reg PATTERNBDETECT,
3217
- output reg PATTERNDETECT,
3218
- output [47:0] PCOUT,
3219
- output UNDERFLOW,
3220
- input signed [29:0] A,
3221
- input [29:0] ACIN,
3222
- input [3:0] ALUMODE,
3223
- input signed [17:0] B,
3224
- input [17:0] BCIN,
3225
- input [47:0] C,
3226
- input CARRYCASCIN,
3227
- input CARRYIN,
3228
- input [2:0] CARRYINSEL,
3229
- input CEA1,
3230
- input CEA2,
3231
- input CEAD,
3232
- input CEALUMODE,
3233
- input CEB1,
3234
- input CEB2,
3235
- input CEC,
3236
- input CECARRYIN,
3237
- input CECTRL,
3238
- input CED,
3239
- input CEINMODE,
3240
- input CEM,
3241
- input CEP,
3242
- (* clkbuf_sink *) input CLK,
3243
- input [24:0] D,
3244
- input [4:0] INMODE,
3245
- input MULTSIGNIN,
3246
- input [6:0] OPMODE,
3247
- input [47:0] PCIN,
3248
- input RSTA,
3249
- input RSTALLCARRYIN,
3250
- input RSTALUMODE,
3251
- input RSTB,
3252
- input RSTC,
3253
- input RSTCTRL,
3254
- input RSTD,
3255
- input RSTINMODE,
3256
- input RSTM,
3257
- input RSTP
3258
- );
3259
- parameter integer ACASCREG = 1;
3260
- parameter integer ADREG = 1;
3261
- parameter integer ALUMODEREG = 1;
3262
- parameter integer AREG = 1;
3263
- parameter AUTORESET_PATDET = "NO_RESET";
3264
- parameter A_INPUT = "DIRECT";
3265
- parameter integer BCASCREG = 1;
3266
- parameter integer BREG = 1;
3267
- parameter B_INPUT = "DIRECT";
3268
- parameter integer CARRYINREG = 1;
3269
- parameter integer CARRYINSELREG = 1;
3270
- parameter integer CREG = 1;
3271
- parameter integer DREG = 1;
3272
- parameter integer INMODEREG = 1;
3273
- parameter integer MREG = 1;
3274
- parameter integer OPMODEREG = 1;
3275
- parameter integer PREG = 1;
3276
- parameter SEL_MASK = "MASK";
3277
- parameter SEL_PATTERN = "PATTERN";
3278
- parameter USE_DPORT = "FALSE";
3279
- parameter USE_MULT = "MULTIPLY";
3280
- parameter USE_PATTERN_DETECT = "NO_PATDET";
3281
- parameter USE_SIMD = "ONE48";
3282
- parameter [47:0] MASK = 48'h3FFFFFFFFFFF;
3283
- parameter [47:0] PATTERN = 48'h000000000000;
3284
- parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
3285
- parameter [0:0] IS_CARRYIN_INVERTED = 1'b0;
3286
- parameter [0:0] IS_CLK_INVERTED = 1'b0;
3287
- parameter [4:0] IS_INMODE_INVERTED = 5'b0;
3288
- parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
3289
-
3290
- `ifdef YOSYS
3291
- function integer \A.required ;
3292
- begin
3293
- if (AREG != 0) \A.required = 254;
3294
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3295
- if (MREG != 0) \A.required = 1416;
3296
- else if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 3030 : 2739) ;
3297
- end
3298
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3299
- // Worst-case from ADREG and MREG
3300
- if (MREG != 0) \A.required = 2400;
3301
- else if (ADREG != 0) \A.required = 1283;
3302
- else if (PREG != 0) \A.required = 3723;
3303
- else if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 4014 : 3723) ;
3304
- end
3305
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3306
- if (PREG != 0) \A.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1730 : 1441) ;
3307
- end
3308
- end
3309
- endfunction
3310
- function integer \B.required ;
3311
- begin
3312
- if (BREG != 0) \B.required = 324;
3313
- else if (MREG != 0) \B.required = 1285;
3314
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3315
- if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 2898 : 2608) ;
3316
- end
3317
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3318
- if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 2898 : 2608) ;
3319
- end
3320
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3321
- if (PREG != 0) \B.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1718 : 1428) ;
3322
- end
3323
- end
3324
- endfunction
3325
- function integer \C.required ;
3326
- begin
3327
- if (CREG != 0) \C.required = 168;
3328
- else if (PREG != 0) \C.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 1534 : 1244) ;
3329
- end
3330
- endfunction
3331
- function integer \D.required ;
3332
- begin
3333
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3334
- end
3335
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3336
- if (DREG != 0) \D.required = 248;
3337
- else if (ADREG != 0) \D.required = 1195;
3338
- else if (MREG != 0) \D.required = 2310;
3339
- else if (PREG != 0) \D.required = (USE_PATTERN_DETECT != "NO_PATDET" ? 3925 : 3635) ;
3340
- end
3341
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3342
- end
3343
- end
3344
- endfunction
3345
- function integer \P.arrival ;
3346
- begin
3347
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3348
- if (PREG != 0) \P.arrival = 329;
3349
- // Worst-case from CREG and MREG
3350
- else if (CREG != 0) \P.arrival = 1687;
3351
- else if (MREG != 0) \P.arrival = 1671;
3352
- // Worst-case from AREG and BREG
3353
- else if (AREG != 0) \P.arrival = 2952;
3354
- else if (BREG != 0) \P.arrival = 2813;
3355
- end
3356
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3357
- if (PREG != 0) \P.arrival = 329;
3358
- // Worst-case from CREG and MREG
3359
- else if (CREG != 0) \P.arrival = 1687;
3360
- else if (MREG != 0) \P.arrival = 1671;
3361
- // Worst-case from AREG, ADREG, BREG, DREG
3362
- else if (AREG != 0) \P.arrival = 3935;
3363
- else if (DREG != 0) \P.arrival = 3908;
3364
- else if (ADREG != 0) \P.arrival = 2958;
3365
- else if (BREG != 0) \P.arrival = 2813;
3366
- end
3367
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3368
- if (PREG != 0) \P.arrival = 329;
3369
- // Worst-case from AREG, BREG, CREG
3370
- else if (CREG != 0) \P.arrival = 1687;
3371
- else if (AREG != 0) \P.arrival = 1632;
3372
- else if (BREG != 0) \P.arrival = 1616;
3373
- end
3374
- end
3375
- endfunction
3376
- function integer \PCOUT.arrival ;
3377
- begin
3378
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin
3379
- if (PREG != 0) \PCOUT.arrival = 435;
3380
- // Worst-case from CREG and MREG
3381
- else if (CREG != 0) \PCOUT.arrival = 1835;
3382
- else if (MREG != 0) \PCOUT.arrival = 1819;
3383
- // Worst-case from AREG and BREG
3384
- else if (AREG != 0) \PCOUT.arrival = 3098;
3385
- else if (BREG != 0) \PCOUT.arrival = 2960;
3386
- end
3387
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin
3388
- if (PREG != 0) \PCOUT.arrival = 435;
3389
- // Worst-case from CREG and MREG
3390
- else if (CREG != 0) \PCOUT.arrival = 1835;
3391
- else if (MREG != 0) \PCOUT.arrival = 1819;
3392
- // Worst-case from AREG, ADREG, BREG, DREG
3393
- else if (AREG != 0) \PCOUT.arrival = 4083;
3394
- else if (DREG != 0) \PCOUT.arrival = 4056;
3395
- else if (BREG != 0) \PCOUT.arrival = 2960;
3396
- else if (ADREG != 0) \PCOUT.arrival = 2859;
3397
- end
3398
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin
3399
- if (PREG != 0) \PCOUT.arrival = 435;
3400
- // Worst-case from AREG, BREG, CREG
3401
- else if (CREG != 0) \PCOUT.arrival = 1835;
3402
- else if (AREG != 0) \PCOUT.arrival = 1780;
3403
- else if (BREG != 0) \PCOUT.arrival = 1765;
3404
- end
3405
- end
3406
- endfunction
3407
- function integer \A.P.comb ;
3408
- begin
3409
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \A.P.comb = 2823;
3410
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \A.P.comb = 3806;
3411
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \A.P.comb = 1523;
3412
- end
3413
- endfunction
3414
- function integer \A.PCOUT.comb ;
3415
- begin
3416
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \A.PCOUT.comb = 2970;
3417
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \A.PCOUT.comb = 3954;
3418
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \A.PCOUT.comb = 1671;
3419
- end
3420
- endfunction
3421
- function integer \B.P.comb ;
3422
- begin
3423
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \B.P.comb = 2690;
3424
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \B.P.comb = 2690;
3425
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \B.P.comb = 1509;
3426
- end
3427
- endfunction
3428
- function integer \B.PCOUT.comb ;
3429
- begin
3430
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \B.PCOUT.comb = 2838;
3431
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \B.PCOUT.comb = 2838;
3432
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \B.PCOUT.comb = 1658;
3433
- end
3434
- endfunction
3435
- function integer \C.P.comb ;
3436
- begin
3437
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \C.P.comb = 1325;
3438
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \C.P.comb = 1325;
3439
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \C.P.comb = 1325;
3440
- end
3441
- endfunction
3442
- function integer \C.PCOUT.comb ;
3443
- begin
3444
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") \C.PCOUT.comb = 1474;
3445
- else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \C.PCOUT.comb = 1474;
3446
- else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") \C.PCOUT.comb = 1474;
3447
- end
3448
- endfunction
3449
- function integer \D.P.comb ;
3450
- begin
3451
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \D.P.comb = 3717;
3452
- end
3453
- endfunction
3454
- function integer \D.PCOUT.comb ;
3455
- begin
3456
- if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") \D.PCOUT.comb = 3700;
3457
- end
3458
- endfunction
3459
-
3460
- generate
3461
- if (PREG == 0 && MREG == 0 && AREG == 0 && ADREG == 0)
3462
- specify
3463
- (A *> P) = \A.P.comb ();
3464
- (A *> PCOUT) = \A.PCOUT.comb ();
3465
- endspecify
3466
- else
3467
- specify
3468
- $setup(A, posedge CLK &&& !IS_CLK_INVERTED, \A.required () );
3469
- $setup(A, negedge CLK &&& IS_CLK_INVERTED, \A.required () );
3470
- endspecify
3471
-
3472
- if (PREG == 0 && MREG == 0 && BREG == 0)
3473
- specify
3474
- (B *> P) = \B.P.comb ();
3475
- (B *> PCOUT) = \B.PCOUT.comb ();
3476
- endspecify
3477
- else
3478
- specify
3479
- $setup(B, posedge CLK &&& !IS_CLK_INVERTED, \B.required () );
3480
- $setup(B, negedge CLK &&& IS_CLK_INVERTED, \B.required () );
3481
- endspecify
3482
-
3483
- if (PREG == 0 && CREG == 0)
3484
- specify
3485
- (C *> P) = \C.P.comb ();
3486
- (C *> PCOUT) = \C.PCOUT.comb ();
3487
- endspecify
3488
- else
3489
- specify
3490
- $setup(C, posedge CLK &&& !IS_CLK_INVERTED, \C.required () );
3491
- $setup(C, negedge CLK &&& IS_CLK_INVERTED, \C.required () );
3492
- endspecify
3493
-
3494
- if (PREG == 0 && MREG == 0 && ADREG == 0 && DREG == 0)
3495
- specify
3496
- (D *> P) = \D.P.comb ();
3497
- (D *> PCOUT) = \D.PCOUT.comb ();
3498
- endspecify
3499
- else
3500
- specify
3501
- $setup(D, posedge CLK &&& !IS_CLK_INVERTED, \D.required () );
3502
- $setup(D, negedge CLK &&& IS_CLK_INVERTED, \D.required () );
3503
- endspecify
3504
-
3505
- if (PREG == 0)
3506
- specify
3507
- (PCIN *> P) = 1107;
3508
- (PCIN *> PCOUT) = 1255;
3509
- endspecify
3510
- else
3511
- specify
3512
- $setup(PCIN, posedge CLK &&& !IS_CLK_INVERTED, USE_PATTERN_DETECT != "NO_PATDET" ? 1315 : 1025);
3513
- $setup(PCIN, negedge CLK &&& IS_CLK_INVERTED, USE_PATTERN_DETECT != "NO_PATDET" ? 1315 : 1025);
3514
- endspecify
3515
-
3516
- if (PREG || AREG || ADREG || BREG || CREG || DREG || MREG)
3517
- specify
3518
- if (!IS_CLK_INVERTED && CEP) (posedge CLK => (P : 48'bx)) = \P.arrival () ;
3519
- if ( IS_CLK_INVERTED && CEP) (negedge CLK => (P : 48'bx)) = \P.arrival () ;
3520
- if (!IS_CLK_INVERTED && CEP) (posedge CLK => (PCOUT : 48'bx)) = \PCOUT.arrival () ;
3521
- if ( IS_CLK_INVERTED && CEP) (negedge CLK => (PCOUT : 48'bx)) = \PCOUT.arrival () ;
3522
- endspecify
3523
- endgenerate
3524
- `endif
3525
-
3526
- initial begin
3527
- `ifndef YOSYS
3528
- if (AUTORESET_PATDET != "NO_RESET") $fatal(1, "Unsupported AUTORESET_PATDET value");
3529
- if (SEL_MASK != "MASK") $fatal(1, "Unsupported SEL_MASK value");
3530
- if (SEL_PATTERN != "PATTERN") $fatal(1, "Unsupported SEL_PATTERN value");
3531
- if (USE_SIMD != "ONE48" && USE_SIMD != "TWO24" && USE_SIMD != "FOUR12") $fatal(1, "Unsupported USE_SIMD value");
3532
- if (IS_ALUMODE_INVERTED != 4'b0) $fatal(1, "Unsupported IS_ALUMODE_INVERTED value");
3533
- if (IS_CARRYIN_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CARRYIN_INVERTED value");
3534
- if (IS_CLK_INVERTED != 1'b0) $fatal(1, "Unsupported IS_CLK_INVERTED value");
3535
- if (IS_INMODE_INVERTED != 5'b0) $fatal(1, "Unsupported IS_INMODE_INVERTED value");
3536
- if (IS_OPMODE_INVERTED != 7'b0) $fatal(1, "Unsupported IS_OPMODE_INVERTED value");
3537
- `endif
3538
- end
3539
-
3540
- wire signed [29:0] A_muxed;
3541
- wire signed [17:0] B_muxed;
3542
-
3543
- generate
3544
- if (A_INPUT == "CASCADE") assign A_muxed = ACIN;
3545
- else assign A_muxed = A;
3546
-
3547
- if (B_INPUT == "CASCADE") assign B_muxed = BCIN;
3548
- else assign B_muxed = B;
3549
- endgenerate
3550
-
3551
- reg signed [29:0] Ar1, Ar2;
3552
- reg signed [24:0] Dr;
3553
- reg signed [17:0] Br1, Br2;
3554
- reg signed [47:0] Cr;
3555
- reg [4:0] INMODEr;
3556
- reg [6:0] OPMODEr;
3557
- reg [3:0] ALUMODEr;
3558
- reg [2:0] CARRYINSELr;
3559
-
3560
- generate
3561
- // Configurable A register
3562
- if (AREG == 2) begin
3563
- initial Ar1 = 30'b0;
3564
- initial Ar2 = 30'b0;
3565
- always @(posedge CLK)
3566
- if (RSTA) begin
3567
- Ar1 <= 30'b0;
3568
- Ar2 <= 30'b0;
3569
- end else begin
3570
- if (CEA1) Ar1 <= A_muxed;
3571
- if (CEA2) Ar2 <= Ar1;
3572
- end
3573
- end else if (AREG == 1) begin
3574
- //initial Ar1 = 30'b0;
3575
- initial Ar2 = 30'b0;
3576
- always @(posedge CLK)
3577
- if (RSTA) begin
3578
- Ar1 <= 30'b0;
3579
- Ar2 <= 30'b0;
3580
- end else begin
3581
- if (CEA1) Ar1 <= A_muxed;
3582
- if (CEA2) Ar2 <= A_muxed;
3583
- end
3584
- end else begin
3585
- always @* Ar1 <= A_muxed;
3586
- always @* Ar2 <= A_muxed;
3587
- end
3588
-
3589
- // Configurable B register
3590
- if (BREG == 2) begin
3591
- initial Br1 = 25'b0;
3592
- initial Br2 = 25'b0;
3593
- always @(posedge CLK)
3594
- if (RSTB) begin
3595
- Br1 <= 18'b0;
3596
- Br2 <= 18'b0;
3597
- end else begin
3598
- if (CEB1) Br1 <= B_muxed;
3599
- if (CEB2) Br2 <= Br1;
3600
- end
3601
- end else if (BREG == 1) begin
3602
- //initial Br1 = 18'b0;
3603
- initial Br2 = 18'b0;
3604
- always @(posedge CLK)
3605
- if (RSTB) begin
3606
- Br1 <= 18'b0;
3607
- Br2 <= 18'b0;
3608
- end else begin
3609
- if (CEB1) Br1 <= B_muxed;
3610
- if (CEB2) Br2 <= B_muxed;
3611
- end
3612
- end else begin
3613
- always @* Br1 <= B_muxed;
3614
- always @* Br2 <= B_muxed;
3615
- end
3616
-
3617
- // C and D registers
3618
- if (CREG == 1) initial Cr = 48'b0;
3619
- if (CREG == 1) begin always @(posedge CLK) if (RSTC) Cr <= 48'b0; else if (CEC) Cr <= C; end
3620
- else always @* Cr <= C;
3621
-
3622
- if (DREG == 1) initial Dr = 25'b0;
3623
- if (DREG == 1) begin always @(posedge CLK) if (RSTD) Dr <= 25'b0; else if (CED) Dr <= D; end
3624
- else always @* Dr <= D;
3625
-
3626
- // Control registers
3627
- if (INMODEREG == 1) initial INMODEr = 5'b0;
3628
- if (INMODEREG == 1) begin always @(posedge CLK) if (RSTINMODE) INMODEr <= 5'b0; else if (CEINMODE) INMODEr <= INMODE; end
3629
- else always @* INMODEr <= INMODE;
3630
- if (OPMODEREG == 1) initial OPMODEr = 7'b0;
3631
- if (OPMODEREG == 1) begin always @(posedge CLK) if (RSTCTRL) OPMODEr <= 7'b0; else if (CECTRL) OPMODEr <= OPMODE; end
3632
- else always @* OPMODEr <= OPMODE;
3633
- if (ALUMODEREG == 1) initial ALUMODEr = 4'b0;
3634
- if (ALUMODEREG == 1) begin always @(posedge CLK) if (RSTALUMODE) ALUMODEr <= 4'b0; else if (CEALUMODE) ALUMODEr <= ALUMODE; end
3635
- else always @* ALUMODEr <= ALUMODE;
3636
- if (CARRYINSELREG == 1) initial CARRYINSELr = 3'b0;
3637
- if (CARRYINSELREG == 1) begin always @(posedge CLK) if (RSTCTRL) CARRYINSELr <= 3'b0; else if (CECTRL) CARRYINSELr <= CARRYINSEL; end
3638
- else always @* CARRYINSELr <= CARRYINSEL;
3639
- endgenerate
3640
-
3641
- // A and B cascade
3642
- generate
3643
- if (ACASCREG == 1 && AREG == 2) assign ACOUT = Ar1;
3644
- else assign ACOUT = Ar2;
3645
- if (BCASCREG == 1 && BREG == 2) assign BCOUT = Br1;
3646
- else assign BCOUT = Br2;
3647
- endgenerate
3648
-
3649
- // A/D input selection and pre-adder
3650
- wire signed [24:0] Ar12_muxed = INMODEr[0] ? Ar1 : Ar2;
3651
- wire signed [24:0] Ar12_gated = INMODEr[1] ? 25'b0 : Ar12_muxed;
3652
- wire signed [24:0] Dr_gated = INMODEr[2] ? Dr : 25'b0;
3653
- wire signed [24:0] AD_result = INMODEr[3] ? (Dr_gated - Ar12_gated) : (Dr_gated + Ar12_gated);
3654
- reg signed [24:0] ADr;
3655
-
3656
- generate
3657
- if (ADREG == 1) initial ADr = 25'b0;
3658
- if (ADREG == 1) begin always @(posedge CLK) if (RSTD) ADr <= 25'b0; else if (CEAD) ADr <= AD_result; end
3659
- else always @* ADr <= AD_result;
3660
- endgenerate
3661
-
3662
- // 25x18 multiplier
3663
- wire signed [24:0] A_MULT;
3664
- wire signed [17:0] B_MULT = INMODEr[4] ? Br1 : Br2;
3665
- generate
3666
- if (USE_DPORT == "TRUE") assign A_MULT = ADr;
3667
- else assign A_MULT = Ar12_gated;
3668
- endgenerate
3669
-
3670
- wire signed [42:0] M = A_MULT * B_MULT;
3671
- wire signed [42:0] Mx = (CARRYINSEL == 3'b010) ? 43'bx : M;
3672
- reg signed [42:0] Mr = 43'b0;
3673
-
3674
- // Multiplier result register
3675
- generate
3676
- if (MREG == 1) begin always @(posedge CLK) if (RSTM) Mr <= 43'b0; else if (CEM) Mr <= Mx; end
3677
- else always @* Mr <= Mx;
3678
- endgenerate
3679
-
3680
- wire signed [42:0] Mrx = (CARRYINSELr == 3'b010) ? 43'bx : Mr;
3681
-
3682
- // X, Y and Z ALU inputs
3683
- reg signed [47:0] X, Y, Z;
3684
-
3685
- always @* begin
3686
- // X multiplexer
3687
- case (OPMODEr[1:0])
3688
- 2'b00: X = 48'b0;
3689
- 2'b01: begin X = $signed(Mrx);
3690
- `ifndef YOSYS
3691
- if (OPMODEr[3:2] != 2'b01) $fatal(1, "OPMODEr[3:2] must be 2'b01 when OPMODEr[1:0] is 2'b01");
3692
- `endif
3693
- end
3694
- 2'b10:
3695
- if (PREG == 1)
3696
- X = P;
3697
- else begin
3698
- X = 48'bx;
3699
- `ifndef YOSYS
3700
- $fatal(1, "PREG must be 1 when OPMODEr[1:0] is 2'b10");
3701
- `endif
3702
- end
3703
- 2'b11: X = $signed({Ar2, Br2});
3704
- default: X = 48'bx;
3705
- endcase
3706
-
3707
- // Y multiplexer
3708
- case (OPMODEr[3:2])
3709
- 2'b00: Y = 48'b0;
3710
- 2'b01: begin Y = 48'b0; // FIXME: more accurate partial product modelling?
3711
- `ifndef YOSYS
3712
- if (OPMODEr[1:0] != 2'b01) $fatal(1, "OPMODEr[1:0] must be 2'b01 when OPMODEr[3:2] is 2'b01");
3713
- `endif
3714
- end
3715
- 2'b10: Y = {48{1'b1}};
3716
- 2'b11: Y = Cr;
3717
- default: Y = 48'bx;
3718
- endcase
3719
-
3720
- // Z multiplexer
3721
- case (OPMODEr[6:4])
3722
- 3'b000: Z = 48'b0;
3723
- 3'b001: Z = PCIN;
3724
- 3'b010:
3725
- if (PREG == 1)
3726
- Z = P;
3727
- else begin
3728
- Z = 48'bx;
3729
- `ifndef YOSYS
3730
- $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b010");
3731
- `endif
3732
- end
3733
- 3'b011: Z = Cr;
3734
- 3'b100:
3735
- if (PREG == 1 && OPMODEr[3:0] === 4'b1000)
3736
- Z = P;
3737
- else begin
3738
- Z = 48'bx;
3739
- `ifndef YOSYS
3740
- if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b100");
3741
- if (OPMODEr[3:0] != 4'b1000) $fatal(1, "OPMODEr[3:0] must be 4'b1000 when OPMODEr[6:4] i0s 3'b100");
3742
- `endif
3743
- end
3744
- 3'b101: Z = $signed(PCIN[47:17]);
3745
- 3'b110:
3746
- if (PREG == 1)
3747
- Z = $signed(P[47:17]);
3748
- else begin
3749
- Z = 48'bx;
3750
- `ifndef YOSYS
3751
- $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b110");
3752
- `endif
3753
- end
3754
- default: Z = 48'bx;
3755
- endcase
3756
- end
3757
-
3758
- // Carry in
3759
- wire A24_xnor_B17d = A_MULT[24] ~^ B_MULT[17];
3760
- reg CARRYINr, A24_xnor_B17;
3761
- generate
3762
- if (CARRYINREG == 1) initial CARRYINr = 1'b0;
3763
- if (CARRYINREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) CARRYINr <= 1'b0; else if (CECARRYIN) CARRYINr <= CARRYIN; end
3764
- else always @* CARRYINr = CARRYIN;
3765
-
3766
- if (MREG == 1) initial A24_xnor_B17 = 1'b0;
3767
- if (MREG == 1) begin always @(posedge CLK) if (RSTALLCARRYIN) A24_xnor_B17 <= 1'b0; else if (CEM) A24_xnor_B17 <= A24_xnor_B17d; end
3768
- else always @* A24_xnor_B17 = A24_xnor_B17d;
3769
- endgenerate
3770
-
3771
- reg cin_muxed;
3772
-
3773
- always @(*) begin
3774
- case (CARRYINSELr)
3775
- 3'b000: cin_muxed = CARRYINr;
3776
- 3'b001: cin_muxed = ~PCIN[47];
3777
- 3'b010: cin_muxed = CARRYCASCIN;
3778
- 3'b011: cin_muxed = PCIN[47];
3779
- 3'b100:
3780
- if (PREG == 1)
3781
- cin_muxed = CARRYCASCOUT;
3782
- else begin
3783
- cin_muxed = 1'bx;
3784
- `ifndef YOSYS
3785
- $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b100");
3786
- `endif
3787
- end
3788
- 3'b101:
3789
- if (PREG == 1)
3790
- cin_muxed = ~P[47];
3791
- else begin
3792
- cin_muxed = 1'bx;
3793
- `ifndef YOSYS
3794
- $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b101");
3795
- `endif
3796
- end
3797
- 3'b110: cin_muxed = A24_xnor_B17;
3798
- 3'b111:
3799
- if (PREG == 1)
3800
- cin_muxed = P[47];
3801
- else begin
3802
- cin_muxed = 1'bx;
3803
- `ifndef YOSYS
3804
- $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b111");
3805
- `endif
3806
- end
3807
- default: cin_muxed = 1'bx;
3808
- endcase
3809
- end
3810
-
3811
- wire alu_cin = (ALUMODEr[3] || ALUMODEr[2]) ? 1'b0 : cin_muxed;
3812
-
3813
- // ALU core
3814
- wire [47:0] Z_muxinv = ALUMODEr[0] ? ~Z : Z;
3815
- wire [47:0] xor_xyz = X ^ Y ^ Z_muxinv;
3816
- wire [47:0] maj_xyz = (X & Y) | (X & Z_muxinv) | (Y & Z_muxinv);
3817
-
3818
- wire [47:0] xor_xyz_muxed = ALUMODEr[3] ? maj_xyz : xor_xyz;
3819
- wire [47:0] maj_xyz_gated = ALUMODEr[2] ? 48'b0 : maj_xyz;
3820
-
3821
- wire [48:0] maj_xyz_simd_gated;
3822
- wire [3:0] int_carry_in, int_carry_out, ext_carry_out;
3823
- wire [47:0] alu_sum;
3824
- assign int_carry_in[0] = 1'b0;
3825
- wire [3:0] carryout_reset;
3826
-
3827
- generate
3828
- if (USE_SIMD == "FOUR12") begin
3829
- assign maj_xyz_simd_gated = {
3830
- maj_xyz_gated[47:36],
3831
- 1'b0, maj_xyz_gated[34:24],
3832
- 1'b0, maj_xyz_gated[22:12],
3833
- 1'b0, maj_xyz_gated[10:0],
3834
- alu_cin
3835
- };
3836
- assign int_carry_in[3:1] = 3'b000;
3837
- assign ext_carry_out = {
3838
- int_carry_out[3],
3839
- maj_xyz_gated[35] ^ int_carry_out[2],
3840
- maj_xyz_gated[23] ^ int_carry_out[1],
3841
- maj_xyz_gated[11] ^ int_carry_out[0]
3842
- };
3843
- assign carryout_reset = 4'b0000;
3844
- end else if (USE_SIMD == "TWO24") begin
3845
- assign maj_xyz_simd_gated = {
3846
- maj_xyz_gated[47:24],
3847
- 1'b0, maj_xyz_gated[22:0],
3848
- alu_cin
3849
- };
3850
- assign int_carry_in[3:1] = {int_carry_out[2], 1'b0, int_carry_out[0]};
3851
- assign ext_carry_out = {
3852
- int_carry_out[3],
3853
- 1'bx,
3854
- maj_xyz_gated[23] ^ int_carry_out[1],
3855
- 1'bx
3856
- };
3857
- assign carryout_reset = 4'b0x0x;
3858
- end else begin
3859
- assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
3860
- assign int_carry_in[3:1] = int_carry_out[2:0];
3861
- assign ext_carry_out = {
3862
- int_carry_out[3],
3863
- 3'bxxx
3864
- };
3865
- assign carryout_reset = 4'b0xxx;
3866
- end
3867
-
3868
- genvar i;
3869
- for (i = 0; i < 4; i = i + 1)
3870
- assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
3871
- + xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
3872
- endgenerate
3873
-
3874
- wire signed [47:0] Pd = ALUMODEr[1] ? ~alu_sum : alu_sum;
3875
- wire [3:0] CARRYOUTd = (OPMODEr[3:0] == 4'b0101 || ALUMODEr[3:2] != 2'b00) ? 4'bxxxx :
3876
- ((ALUMODEr[0] & ALUMODEr[1]) ? ~ext_carry_out : ext_carry_out);
3877
- wire CARRYCASCOUTd = ext_carry_out[3];
3878
- wire MULTSIGNOUTd = Mrx[42];
3879
-
3880
- generate
3881
- if (PREG == 1) begin
3882
- initial P = 48'b0;
3883
- initial CARRYOUT = carryout_reset;
3884
- initial CARRYCASCOUT = 1'b0;
3885
- initial MULTSIGNOUT = 1'b0;
3886
- always @(posedge CLK)
3887
- if (RSTP) begin
3888
- P <= 48'b0;
3889
- CARRYOUT <= carryout_reset;
3890
- CARRYCASCOUT <= 1'b0;
3891
- MULTSIGNOUT <= 1'b0;
3892
- end else if (CEP) begin
3893
- P <= Pd;
3894
- CARRYOUT <= CARRYOUTd;
3895
- CARRYCASCOUT <= CARRYCASCOUTd;
3896
- MULTSIGNOUT <= MULTSIGNOUTd;
3897
- end
3898
- end else begin
3899
- always @* begin
3900
- P = Pd;
3901
- CARRYOUT = CARRYOUTd;
3902
- CARRYCASCOUT = CARRYCASCOUTd;
3903
- MULTSIGNOUT = MULTSIGNOUTd;
3904
- end
3905
- end
3906
- endgenerate
3907
-
3908
- assign PCOUT = P;
3909
-
3910
- generate
3911
- wire PATTERNDETECTd, PATTERNBDETECTd;
3912
-
3913
- if (USE_PATTERN_DETECT == "PATDET") begin
3914
- // TODO: Support SEL_PATTERN != "PATTERN" and SEL_MASK != "MASK
3915
- assign PATTERNDETECTd = &(~(Pd ^ PATTERN) | MASK);
3916
- assign PATTERNBDETECTd = &((Pd ^ PATTERN) | MASK);
3917
- end else begin
3918
- assign PATTERNDETECTd = 1'b1;
3919
- assign PATTERNBDETECTd = 1'b1;
3920
- end
3921
-
3922
- if (PREG == 1) begin
3923
- reg PATTERNDETECTPAST, PATTERNBDETECTPAST;
3924
- initial PATTERNDETECT = 1'b0;
3925
- initial PATTERNBDETECT = 1'b0;
3926
- initial PATTERNDETECTPAST = 1'b0;
3927
- initial PATTERNBDETECTPAST = 1'b0;
3928
- always @(posedge CLK)
3929
- if (RSTP) begin
3930
- PATTERNDETECT <= 1'b0;
3931
- PATTERNBDETECT <= 1'b0;
3932
- PATTERNDETECTPAST <= 1'b0;
3933
- PATTERNBDETECTPAST <= 1'b0;
3934
- end else if (CEP) begin
3935
- PATTERNDETECT <= PATTERNDETECTd;
3936
- PATTERNBDETECT <= PATTERNBDETECTd;
3937
- PATTERNDETECTPAST <= PATTERNDETECT;
3938
- PATTERNBDETECTPAST <= PATTERNBDETECT;
3939
- end
3940
- assign OVERFLOW = &{PATTERNDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
3941
- assign UNDERFLOW = &{PATTERNBDETECTPAST, ~PATTERNBDETECT, ~PATTERNDETECT};
3942
- end else begin
3943
- always @* begin
3944
- PATTERNDETECT = PATTERNDETECTd;
3945
- PATTERNBDETECT = PATTERNBDETECTd;
3946
- end
3947
- assign OVERFLOW = 1'bx, UNDERFLOW = 1'bx;
3948
- end
3949
- endgenerate
3950
-
3951
- endmodule
3952
-
3953
- // TODO: DSP48E2 (Ultrascale).
3954
-
3955
- // Block RAM
3956
-
3957
- module RAMB18E1 (
3958
- (* clkbuf_sink *)
3959
- (* invertible_pin = "IS_CLKARDCLK_INVERTED" *)
3960
- input CLKARDCLK,
3961
- (* clkbuf_sink *)
3962
- (* invertible_pin = "IS_CLKBWRCLK_INVERTED" *)
3963
- input CLKBWRCLK,
3964
- (* invertible_pin = "IS_ENARDEN_INVERTED" *)
3965
- input ENARDEN,
3966
- (* invertible_pin = "IS_ENBWREN_INVERTED" *)
3967
- input ENBWREN,
3968
- input REGCEAREGCE,
3969
- input REGCEB,
3970
- (* invertible_pin = "IS_RSTRAMARSTRAM_INVERTED" *)
3971
- input RSTRAMARSTRAM,
3972
- (* invertible_pin = "IS_RSTRAMB_INVERTED" *)
3973
- input RSTRAMB,
3974
- (* invertible_pin = "IS_RSTREGARSTREG_INVERTED" *)
3975
- input RSTREGARSTREG,
3976
- (* invertible_pin = "IS_RSTREGB_INVERTED" *)
3977
- input RSTREGB,
3978
- input [13:0] ADDRARDADDR,
3979
- input [13:0] ADDRBWRADDR,
3980
- input [15:0] DIADI,
3981
- input [15:0] DIBDI,
3982
- input [1:0] DIPADIP,
3983
- input [1:0] DIPBDIP,
3984
- input [1:0] WEA,
3985
- input [3:0] WEBWE,
3986
- output [15:0] DOADO,
3987
- output [15:0] DOBDO,
3988
- output [1:0] DOPADOP,
3989
- output [1:0] DOPBDOP
3990
- );
3991
- parameter integer DOA_REG = 0;
3992
- parameter integer DOB_REG = 0;
3993
- parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3994
- parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3995
- parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3996
- parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3997
- parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3998
- parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
3999
- parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4000
- parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4001
- parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4002
- parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4003
- parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4004
- parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4005
- parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4006
- parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4007
- parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4008
- parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4009
- parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4010
- parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4011
- parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4012
- parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4013
- parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4014
- parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4015
- parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4016
- parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4017
- parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4018
- parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4019
- parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4020
- parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4021
- parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4022
- parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4023
- parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4024
- parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4025
- parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4026
- parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4027
- parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4028
- parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4029
- parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4030
- parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4031
- parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4032
- parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4033
- parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4034
- parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4035
- parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4036
- parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4037
- parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4038
- parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4039
- parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4040
- parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4041
- parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4042
- parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4043
- parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4044
- parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4045
- parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4046
- parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4047
- parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4048
- parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4049
- parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4050
- parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4051
- parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4052
- parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4053
- parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4054
- parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4055
- parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4056
- parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4057
- parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4058
- parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4059
- parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4060
- parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4061
- parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4062
- parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4063
- parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4064
- parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4065
- parameter INIT_A = 18'h0;
4066
- parameter INIT_B = 18'h0;
4067
- parameter INIT_FILE = "NONE";
4068
- parameter RAM_MODE = "TDP";
4069
- parameter RDADDR_COLLISION_HWCONFIG = "DELAYED_WRITE";
4070
- parameter integer READ_WIDTH_A = 0;
4071
- parameter integer READ_WIDTH_B = 0;
4072
- parameter RSTREG_PRIORITY_A = "RSTREG";
4073
- parameter RSTREG_PRIORITY_B = "RSTREG";
4074
- parameter SIM_COLLISION_CHECK = "ALL";
4075
- parameter SIM_DEVICE = "VIRTEX6";
4076
- parameter SRVAL_A = 18'h0;
4077
- parameter SRVAL_B = 18'h0;
4078
- parameter WRITE_MODE_A = "WRITE_FIRST";
4079
- parameter WRITE_MODE_B = "WRITE_FIRST";
4080
- parameter integer WRITE_WIDTH_A = 0;
4081
- parameter integer WRITE_WIDTH_B = 0;
4082
- parameter IS_CLKARDCLK_INVERTED = 1'b0;
4083
- parameter IS_CLKBWRCLK_INVERTED = 1'b0;
4084
- parameter IS_ENARDEN_INVERTED = 1'b0;
4085
- parameter IS_ENBWREN_INVERTED = 1'b0;
4086
- parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0;
4087
- parameter IS_RSTRAMB_INVERTED = 1'b0;
4088
- parameter IS_RSTREGARSTREG_INVERTED = 1'b0;
4089
- parameter IS_RSTREGB_INVERTED = 1'b0;
4090
-
4091
- specify
4092
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L13
4093
- $setup(ADDRARDADDR, posedge CLKARDCLK, 566);
4094
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L17
4095
- $setup(ADDRBWRADDR, posedge CLKBWRCLK, 566);
4096
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L19
4097
- $setup(WEA, posedge CLKARDCLK, 532);
4098
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L21
4099
- $setup(WEBWE, posedge CLKBWRCLK, 532);
4100
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L29
4101
- $setup(REGCEAREGCE, posedge CLKARDCLK, 360);
4102
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L31
4103
- $setup(RSTREGARSTREG, posedge CLKARDCLK, 342);
4104
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L49
4105
- $setup(REGCEB, posedge CLKBWRCLK, 360);
4106
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L59
4107
- $setup(RSTREGB, posedge CLKBWRCLK, 342);
4108
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L123
4109
- $setup(DIADI, posedge CLKARDCLK, 737);
4110
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L133
4111
- $setup(DIBDI, posedge CLKBWRCLK, 737);
4112
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L125
4113
- $setup(DIPADIP, posedge CLKARDCLK, 737);
4114
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L135
4115
- $setup(DIPBDIP, posedge CLKBWRCLK, 737);
4116
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L143
4117
- if (&DOA_REG) (posedge CLKARDCLK => (DOADO : 16'bx)) = 2454;
4118
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L144
4119
- if (&DOA_REG) (posedge CLKARDCLK => (DOPADOP : 2'bx)) = 2454;
4120
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L153
4121
- if (|DOA_REG) (posedge CLKARDCLK => (DOADO : 16'bx)) = 882;
4122
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L154
4123
- if (|DOA_REG) (posedge CLKARDCLK => (DOPADOP : 2'bx)) = 882;
4124
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L163
4125
- if (&DOB_REG) (posedge CLKBWRCLK => (DOBDO : 16'bx)) = 2454;
4126
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L164
4127
- if (&DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 2'bx)) = 2454;
4128
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L173
4129
- if (|DOB_REG) (posedge CLKBWRCLK => (DOBDO : 16'bx)) = 882;
4130
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L174
4131
- if (|DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 2'bx)) = 882;
4132
- endspecify
4133
- endmodule
4134
-
4135
- module RAMB36E1 (
4136
- output CASCADEOUTA,
4137
- output CASCADEOUTB,
4138
- output [31:0] DOADO,
4139
- output [31:0] DOBDO,
4140
- output [3:0] DOPADOP,
4141
- output [3:0] DOPBDOP,
4142
- output [7:0] ECCPARITY,
4143
- output [8:0] RDADDRECC,
4144
- output SBITERR,
4145
- output DBITERR,
4146
- (* invertible_pin = "IS_ENARDEN_INVERTED" *)
4147
- input ENARDEN,
4148
- (* clkbuf_sink *)
4149
- (* invertible_pin = "IS_CLKARDCLK_INVERTED" *)
4150
- input CLKARDCLK,
4151
- (* invertible_pin = "IS_RSTRAMARSTRAM_INVERTED" *)
4152
- input RSTRAMARSTRAM,
4153
- (* invertible_pin = "IS_RSTREGARSTREG_INVERTED" *)
4154
- input RSTREGARSTREG,
4155
- input CASCADEINA,
4156
- input REGCEAREGCE,
4157
- (* invertible_pin = "IS_ENBWREN_INVERTED" *)
4158
- input ENBWREN,
4159
- (* clkbuf_sink *)
4160
- (* invertible_pin = "IS_CLKBWRCLK_INVERTED" *)
4161
- input CLKBWRCLK,
4162
- (* invertible_pin = "IS_RSTRAMB_INVERTED" *)
4163
- input RSTRAMB,
4164
- (* invertible_pin = "IS_RSTREGB_INVERTED" *)
4165
- input RSTREGB,
4166
- input CASCADEINB,
4167
- input REGCEB,
4168
- input INJECTDBITERR,
4169
- input INJECTSBITERR,
4170
- input [15:0] ADDRARDADDR,
4171
- input [15:0] ADDRBWRADDR,
4172
- input [31:0] DIADI,
4173
- input [31:0] DIBDI,
4174
- input [3:0] DIPADIP,
4175
- input [3:0] DIPBDIP,
4176
- input [3:0] WEA,
4177
- input [7:0] WEBWE
4178
- );
4179
- parameter integer DOA_REG = 0;
4180
- parameter integer DOB_REG = 0;
4181
- parameter EN_ECC_READ = "FALSE";
4182
- parameter EN_ECC_WRITE = "FALSE";
4183
- parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4184
- parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4185
- parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4186
- parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4187
- parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4188
- parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4189
- parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4190
- parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4191
- parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4192
- parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4193
- parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4194
- parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4195
- parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4196
- parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4197
- parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4198
- parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4199
- parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4200
- parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4201
- parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4202
- parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4203
- parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4204
- parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4205
- parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4206
- parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4207
- parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4208
- parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4209
- parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4210
- parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4211
- parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4212
- parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4213
- parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4214
- parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4215
- parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4216
- parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4217
- parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4218
- parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4219
- parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4220
- parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4221
- parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4222
- parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4223
- parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4224
- parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4225
- parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4226
- parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4227
- parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4228
- parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4229
- parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4230
- parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4231
- parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4232
- parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4233
- parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4234
- parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4235
- parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4236
- parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4237
- parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4238
- parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4239
- parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4240
- parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4241
- parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4242
- parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4243
- parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4244
- parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4245
- parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4246
- parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4247
- parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4248
- parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4249
- parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4250
- parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4251
- parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4252
- parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4253
- parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4254
- parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4255
- parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4256
- parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4257
- parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4258
- parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4259
- parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4260
- parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4261
- parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4262
- parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4263
- parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4264
- parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4265
- parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4266
- parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4267
- parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4268
- parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4269
- parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4270
- parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4271
- parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4272
- parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4273
- parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4274
- parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4275
- parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4276
- parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4277
- parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4278
- parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4279
- parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4280
- parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4281
- parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4282
- parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4283
- parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4284
- parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4285
- parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4286
- parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4287
- parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4288
- parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4289
- parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4290
- parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4291
- parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4292
- parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4293
- parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4294
- parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4295
- parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4296
- parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4297
- parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4298
- parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4299
- parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4300
- parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4301
- parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4302
- parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4303
- parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4304
- parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4305
- parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4306
- parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4307
- parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4308
- parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4309
- parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4310
- parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4311
- parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4312
- parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4313
- parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4314
- parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4315
- parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4316
- parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4317
- parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4318
- parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4319
- parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4320
- parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4321
- parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4322
- parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4323
- parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4324
- parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4325
- parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4326
- parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
4327
- parameter INIT_A = 36'h0;
4328
- parameter INIT_B = 36'h0;
4329
- parameter INIT_FILE = "NONE";
4330
- parameter RAM_EXTENSION_A = "NONE";
4331
- parameter RAM_EXTENSION_B = "NONE";
4332
- parameter RAM_MODE = "TDP";
4333
- parameter RDADDR_COLLISION_HWCONFIG = "DELAYED_WRITE";
4334
- parameter integer READ_WIDTH_A = 0;
4335
- parameter integer READ_WIDTH_B = 0;
4336
- parameter RSTREG_PRIORITY_A = "RSTREG";
4337
- parameter RSTREG_PRIORITY_B = "RSTREG";
4338
- parameter SIM_COLLISION_CHECK = "ALL";
4339
- parameter SIM_DEVICE = "VIRTEX6";
4340
- parameter SRVAL_A = 36'h0;
4341
- parameter SRVAL_B = 36'h0;
4342
- parameter WRITE_MODE_A = "WRITE_FIRST";
4343
- parameter WRITE_MODE_B = "WRITE_FIRST";
4344
- parameter integer WRITE_WIDTH_A = 0;
4345
- parameter integer WRITE_WIDTH_B = 0;
4346
- parameter IS_CLKARDCLK_INVERTED = 1'b0;
4347
- parameter IS_CLKBWRCLK_INVERTED = 1'b0;
4348
- parameter IS_ENARDEN_INVERTED = 1'b0;
4349
- parameter IS_ENBWREN_INVERTED = 1'b0;
4350
- parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0;
4351
- parameter IS_RSTRAMB_INVERTED = 1'b0;
4352
- parameter IS_RSTREGARSTREG_INVERTED = 1'b0;
4353
- parameter IS_RSTREGB_INVERTED = 1'b0;
4354
-
4355
- specify
4356
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L13
4357
- $setup(ADDRARDADDR, posedge CLKARDCLK, 566);
4358
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L17
4359
- $setup(ADDRBWRADDR, posedge CLKBWRCLK, 566);
4360
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L19
4361
- $setup(WEA, posedge CLKARDCLK, 532);
4362
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L21
4363
- $setup(WEBWE, posedge CLKBWRCLK, 532);
4364
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L29
4365
- $setup(REGCEAREGCE, posedge CLKARDCLK, 360);
4366
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L31
4367
- $setup(RSTREGARSTREG, posedge CLKARDCLK, 342);
4368
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L49
4369
- $setup(REGCEB, posedge CLKBWRCLK, 360);
4370
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L59
4371
- $setup(RSTREGB, posedge CLKBWRCLK, 342);
4372
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L123
4373
- $setup(DIADI, posedge CLKARDCLK, 737);
4374
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L133
4375
- $setup(DIBDI, posedge CLKBWRCLK, 737);
4376
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L125
4377
- $setup(DIPADIP, posedge CLKARDCLK, 737);
4378
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L135
4379
- $setup(DIPBDIP, posedge CLKBWRCLK, 737);
4380
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L143
4381
- if (&DOA_REG) (posedge CLKARDCLK => (DOADO : 32'bx)) = 2454;
4382
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L144
4383
- if (&DOA_REG) (posedge CLKARDCLK => (DOPADOP : 4'bx)) = 2454;
4384
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L153
4385
- if (|DOA_REG) (posedge CLKARDCLK => (DOADO : 32'bx)) = 882;
4386
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L154
4387
- if (|DOA_REG) (posedge CLKARDCLK => (DOPADOP : 4'bx)) = 882;
4388
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L163
4389
- if (&DOB_REG) (posedge CLKBWRCLK => (DOBDO : 32'bx)) = 2454;
4390
- // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/BRAM_L.sdf#L164
4391
- if (&DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 4'bx)) = 2454;
4392
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L173
4393
- if (|DOB_REG) (posedge CLKBWRCLK => (DOBDO : 32'bx)) = 882;
4394
- // https://github.com/SymbiFlow/prjxray-db/blob/4bc6385ab300b1819848371f508185f57b649a0e/artix7/timings/BRAM_L.sdf#L174
4395
- if (|DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 4'bx)) = 882;
4396
- endspecify
4397
- endmodule