2 `define SB_DFF_REG reg Q = 0
3 // `define SB_DFF_REG reg Q
5 // SiliconBlue IO Cells
9 input LATCH_INPUT_VALUE,
19 parameter [5:0] PIN_TYPE = 6'b000000;
20 parameter [0:0] PULLUP = 1'b0;
21 parameter [0:0] NEG_TRIGGER = 1'b0;
22 parameter IO_STANDARD = "SB_LVCMOS";
25 reg dout, din_0, din_1;
27 reg dout_q_0, dout_q_1;
30 // IO tile generates a constant 1'b1 internally if global_cen is not connected
31 wire clken_pulled = CLOCK_ENABLE || CLOCK_ENABLE === 1'bz;
35 generate if (!NEG_TRIGGER) begin
36 always @(posedge INPUT_CLK) clken_pulled_ri <= clken_pulled;
37 always @(posedge INPUT_CLK) if (clken_pulled) din_q_0 <= PACKAGE_PIN;
38 always @(negedge INPUT_CLK) if (clken_pulled_ri) din_q_1 <= PACKAGE_PIN;
39 always @(posedge OUTPUT_CLK) clken_pulled_ro <= clken_pulled;
40 always @(posedge OUTPUT_CLK) if (clken_pulled) dout_q_0 <= D_OUT_0;
41 always @(negedge OUTPUT_CLK) if (clken_pulled_ro) dout_q_1 <= D_OUT_1;
42 always @(posedge OUTPUT_CLK) if (clken_pulled) outena_q <= OUTPUT_ENABLE;
44 always @(negedge INPUT_CLK) clken_pulled_ri <= clken_pulled;
45 always @(negedge INPUT_CLK) if (clken_pulled) din_q_0 <= PACKAGE_PIN;
46 always @(posedge INPUT_CLK) if (clken_pulled_ri) din_q_1 <= PACKAGE_PIN;
47 always @(negedge OUTPUT_CLK) clken_pulled_ro <= clken_pulled;
48 always @(negedge OUTPUT_CLK) if (clken_pulled) dout_q_0 <= D_OUT_0;
49 always @(posedge OUTPUT_CLK) if (clken_pulled_ro) dout_q_1 <= D_OUT_1;
50 always @(negedge OUTPUT_CLK) if (clken_pulled) outena_q <= OUTPUT_ENABLE;
54 if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE)
55 din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0;
59 // work around simulation glitches on dout in DDR mode
62 always @* outclk_delayed_1 <= OUTPUT_CLK;
63 always @* outclk_delayed_2 <= outclk_delayed_1;
67 dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0;
69 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
72 assign D_IN_0 = din_0, D_IN_1 = din_1;
75 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout;
76 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz;
77 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
84 output GLOBAL_BUFFER_OUTPUT,
85 input LATCH_INPUT_VALUE,
95 parameter [5:0] PIN_TYPE = 6'b000000;
96 parameter [0:0] PULLUP = 1'b0;
97 parameter [0:0] NEG_TRIGGER = 1'b0;
98 parameter IO_STANDARD = "SB_LVCMOS";
100 assign GLOBAL_BUFFER_OUTPUT = PACKAGE_PIN;
105 .NEG_TRIGGER(NEG_TRIGGER),
106 .IO_STANDARD(IO_STANDARD)
108 .PACKAGE_PIN(PACKAGE_PIN),
109 .LATCH_INPUT_VALUE(LATCH_INPUT_VALUE),
110 .CLOCK_ENABLE(CLOCK_ENABLE),
111 .INPUT_CLK(INPUT_CLK),
112 .OUTPUT_CLK(OUTPUT_CLK),
113 .OUTPUT_ENABLE(OUTPUT_ENABLE),
122 input USER_SIGNAL_TO_GLOBAL_BUFFER,
123 output GLOBAL_BUFFER_OUTPUT
125 assign GLOBAL_BUFFER_OUTPUT = USER_SIGNAL_TO_GLOBAL_BUFFER;
128 // SiliconBlue Logic Cells
130 (* abc_box_id = 22 *)
131 module SB_LUT4 (output O, input I0, I1, I2, I3);
132 parameter [15:0] LUT_INIT = 0;
133 wire [7:0] s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
134 wire [3:0] s2 = I2 ? s3[ 7:4] : s3[3:0];
135 wire [1:0] s1 = I1 ? s2[ 3:2] : s2[1:0];
136 assign O = I0 ? s1[1] : s1[0];
139 (* abc_box_id = 21, lib_whitebox *)
140 module SB_CARRY (output CO, input I0, I1, CI);
141 assign CO = (I0 && I1) || ((I0 || I1) && CI);
144 // Positive Edge SiliconBlue FF Cells
146 (* abc_box_id = 1, abc_flop, lib_whitebox *)
147 module SB_DFF ((* abc_flop_q *) output `SB_DFF_REG, input C, (* abc_flop_d *) input D);
156 //(* abc_box_id = 2, abc_flop *)
157 module SB_DFFE ((* abc_flop_q *) output `SB_DFF_REG, input C, E, (* abc_flop_d *) input D);
163 //(* abc_box_id = 3, abc_flop *)
164 module SB_DFFSR ((* abc_flop_q *) output `SB_DFF_REG, input C, R, (* abc_flop_d *) input D);
172 //(* abc_box_id = 4, abc_flop *)
173 module SB_DFFR ((* abc_flop_q *) output `SB_DFF_REG, input C, R, (* abc_flop_d *) input D);
174 always @(posedge C, posedge R)
181 //(* abc_box_id = 5, abc_flop *)
182 module SB_DFFSS ((* abc_flop_q *) output `SB_DFF_REG, input C, S, (* abc_flop_d *) input D);
190 //(* abc_box_id = 6, abc_flop *)
191 module SB_DFFS ((* abc_flop_q *) output `SB_DFF_REG, input C, S, (* abc_flop_d *) input D);
192 always @(posedge C, posedge S)
199 //(* abc_box_id = 7, abc_flop *)
200 module SB_DFFESR ((* abc_flop_q *) output `SB_DFF_REG, input C, E, R, (* abc_flop_d *) input D);
210 //(* abc_box_id = 8, abc_flop *)
211 module SB_DFFER ((* abc_flop_q *) output `SB_DFF_REG, input C, E, R, (* abc_flop_d *) input D);
212 always @(posedge C, posedge R)
219 //(* abc_box_id = 9, abc_flop *)
220 module SB_DFFESS ((* abc_flop_q *) output `SB_DFF_REG, input C, E, S, (* abc_flop_d *) input D);
230 //(* abc_box_id = 10, abc_flop *)
231 module SB_DFFES ((* abc_flop_q *) output `SB_DFF_REG, input C, E, S, (* abc_flop_d *) input D);
232 always @(posedge C, posedge S)
239 // Negative Edge SiliconBlue FF Cells
241 //(* abc_box_id = 11, abc_flop *)
242 module SB_DFFN ((* abc_flop_q *) output `SB_DFF_REG, input C, (* abc_flop_d *) input D);
247 //(* abc_box_id = 12, abc_flop *)
248 module SB_DFFNE ((* abc_flop_q *) output `SB_DFF_REG, input C, E, (* abc_flop_d *) input D);
254 //(* abc_box_id = 13, abc_flop *)
255 module SB_DFFNSR ((* abc_flop_q *) output `SB_DFF_REG, input C, R, (* abc_flop_d *) input D);
263 //(* abc_box_id = 14, abc_flop *)
264 module SB_DFFNR ((* abc_flop_q *) output `SB_DFF_REG, input C, R, (* abc_flop_d *) input D);
265 always @(negedge C, posedge R)
272 //(* abc_box_id = 15, abc_flop *)
273 module SB_DFFNSS ((* abc_flop_q *) output `SB_DFF_REG, input C, S, (* abc_flop_d *) input D);
281 //(* abc_box_id = 16, abc_flop *)
282 module SB_DFFNS ((* abc_flop_q *) output `SB_DFF_REG, input C, S, (* abc_flop_d *) input D);
283 always @(negedge C, posedge S)
290 //(* abc_box_id = 17, abc_flop *)
291 module SB_DFFNESR ((* abc_flop_q *) output `SB_DFF_REG, input C, E, R, (* abc_flop_d *) input D);
301 //(* abc_box_id = 18, abc_flop *)
302 module SB_DFFNER ((* abc_flop_q *) output `SB_DFF_REG, input C, E, R, (* abc_flop_d *) input D);
303 always @(negedge C, posedge R)
310 //(* abc_box_id = 19, abc_flop *)
311 module SB_DFFNESS ((* abc_flop_q *) output `SB_DFF_REG, input C, E, S, (* abc_flop_d *) input D);
321 //(* abc_box_id = 20, abc_flop *)
322 module SB_DFFNES ((* abc_flop_q *) output `SB_DFF_REG, input C, E, S, (* abc_flop_d *) input D);
323 always @(negedge C, posedge S)
330 // SiliconBlue RAM Cells
333 (* abc_flop_q *) output [15:0] RDATA,
334 input RCLK, RCLKE, RE,
336 input WCLK, WCLKE, WE,
338 input [15:0] MASK, WDATA
344 parameter WRITE_MODE = 0;
345 parameter READ_MODE = 0;
347 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
348 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
349 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
350 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
351 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
352 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
353 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
354 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
355 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
356 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
357 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
358 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
359 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
360 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
361 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
362 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
364 parameter INIT_FILE = "";
375 0: assign WMASK_I = MASK;
377 1: assign WMASK_I = WADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
378 WADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
380 2: assign WMASK_I = WADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
381 WADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
382 WADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
383 WADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
385 3: assign WMASK_I = WADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
386 WADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
387 WADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
388 WADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
389 WADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
390 WADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
391 WADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
392 WADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
396 0: assign RMASK_I = 16'b 0000_0000_0000_0000;
398 1: assign RMASK_I = RADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
399 RADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
401 2: assign RMASK_I = RADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
402 RADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
403 RADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
404 RADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
406 3: assign RMASK_I = RADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
407 RADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
408 RADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
409 RADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
410 RADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
411 RADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
412 RADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
413 RADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
417 0: assign WDATA_I = WDATA;
419 1: assign WDATA_I = {WDATA[14], WDATA[14], WDATA[12], WDATA[12],
420 WDATA[10], WDATA[10], WDATA[ 8], WDATA[ 8],
421 WDATA[ 6], WDATA[ 6], WDATA[ 4], WDATA[ 4],
422 WDATA[ 2], WDATA[ 2], WDATA[ 0], WDATA[ 0]};
424 2: assign WDATA_I = {WDATA[13], WDATA[13], WDATA[13], WDATA[13],
425 WDATA[ 9], WDATA[ 9], WDATA[ 9], WDATA[ 9],
426 WDATA[ 5], WDATA[ 5], WDATA[ 5], WDATA[ 5],
427 WDATA[ 1], WDATA[ 1], WDATA[ 1], WDATA[ 1]};
429 3: assign WDATA_I = {WDATA[11], WDATA[11], WDATA[11], WDATA[11],
430 WDATA[11], WDATA[11], WDATA[11], WDATA[11],
431 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3],
432 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3]};
436 0: assign RDATA = RDATA_I;
437 1: assign RDATA = {1'b0, |RDATA_I[15:14], 1'b0, |RDATA_I[13:12], 1'b0, |RDATA_I[11:10], 1'b0, |RDATA_I[ 9: 8],
438 1'b0, |RDATA_I[ 7: 6], 1'b0, |RDATA_I[ 5: 4], 1'b0, |RDATA_I[ 3: 2], 1'b0, |RDATA_I[ 1: 0]};
439 2: assign RDATA = {2'b0, |RDATA_I[15:12], 3'b0, |RDATA_I[11: 8], 3'b0, |RDATA_I[ 7: 4], 3'b0, |RDATA_I[ 3: 0], 1'b0};
440 3: assign RDATA = {4'b0, |RDATA_I[15: 8], 7'b0, |RDATA_I[ 7: 0], 3'b0};
445 reg [15:0] memory [0:255];
449 $readmemh(INIT_FILE, memory);
451 for (i=0; i<16; i=i+1) begin
452 memory[ 0*16 + i] = INIT_0[16*i +: 16];
453 memory[ 1*16 + i] = INIT_1[16*i +: 16];
454 memory[ 2*16 + i] = INIT_2[16*i +: 16];
455 memory[ 3*16 + i] = INIT_3[16*i +: 16];
456 memory[ 4*16 + i] = INIT_4[16*i +: 16];
457 memory[ 5*16 + i] = INIT_5[16*i +: 16];
458 memory[ 6*16 + i] = INIT_6[16*i +: 16];
459 memory[ 7*16 + i] = INIT_7[16*i +: 16];
460 memory[ 8*16 + i] = INIT_8[16*i +: 16];
461 memory[ 9*16 + i] = INIT_9[16*i +: 16];
462 memory[10*16 + i] = INIT_A[16*i +: 16];
463 memory[11*16 + i] = INIT_B[16*i +: 16];
464 memory[12*16 + i] = INIT_C[16*i +: 16];
465 memory[13*16 + i] = INIT_D[16*i +: 16];
466 memory[14*16 + i] = INIT_E[16*i +: 16];
467 memory[15*16 + i] = INIT_F[16*i +: 16];
471 always @(posedge WCLK) begin
472 if (WE && WCLKE) begin
473 if (!WMASK_I[ 0]) memory[WADDR[7:0]][ 0] <= WDATA_I[ 0];
474 if (!WMASK_I[ 1]) memory[WADDR[7:0]][ 1] <= WDATA_I[ 1];
475 if (!WMASK_I[ 2]) memory[WADDR[7:0]][ 2] <= WDATA_I[ 2];
476 if (!WMASK_I[ 3]) memory[WADDR[7:0]][ 3] <= WDATA_I[ 3];
477 if (!WMASK_I[ 4]) memory[WADDR[7:0]][ 4] <= WDATA_I[ 4];
478 if (!WMASK_I[ 5]) memory[WADDR[7:0]][ 5] <= WDATA_I[ 5];
479 if (!WMASK_I[ 6]) memory[WADDR[7:0]][ 6] <= WDATA_I[ 6];
480 if (!WMASK_I[ 7]) memory[WADDR[7:0]][ 7] <= WDATA_I[ 7];
481 if (!WMASK_I[ 8]) memory[WADDR[7:0]][ 8] <= WDATA_I[ 8];
482 if (!WMASK_I[ 9]) memory[WADDR[7:0]][ 9] <= WDATA_I[ 9];
483 if (!WMASK_I[10]) memory[WADDR[7:0]][10] <= WDATA_I[10];
484 if (!WMASK_I[11]) memory[WADDR[7:0]][11] <= WDATA_I[11];
485 if (!WMASK_I[12]) memory[WADDR[7:0]][12] <= WDATA_I[12];
486 if (!WMASK_I[13]) memory[WADDR[7:0]][13] <= WDATA_I[13];
487 if (!WMASK_I[14]) memory[WADDR[7:0]][14] <= WDATA_I[14];
488 if (!WMASK_I[15]) memory[WADDR[7:0]][15] <= WDATA_I[15];
492 always @(posedge RCLK) begin
493 if (RE && RCLKE) begin
494 RDATA_I <= memory[RADDR[7:0]] & ~RMASK_I;
500 module SB_RAM40_4KNR (
501 (* abc_flop_q *) output [15:0] RDATA,
502 input RCLKN, RCLKE, RE,
504 input WCLK, WCLKE, WE,
506 input [15:0] MASK, WDATA
508 parameter WRITE_MODE = 0;
509 parameter READ_MODE = 0;
511 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
512 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
513 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
514 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
515 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
516 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
517 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
518 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
519 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
520 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
521 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
522 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
523 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
524 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
525 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
526 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
528 parameter INIT_FILE = "";
531 .WRITE_MODE(WRITE_MODE),
532 .READ_MODE (READ_MODE ),
549 .INIT_FILE (INIT_FILE )
565 module SB_RAM40_4KNW (
566 (* abc_flop_q *) output [15:0] RDATA,
567 input RCLK, RCLKE, RE,
569 input WCLKN, WCLKE, WE,
571 input [15:0] MASK, WDATA
573 parameter WRITE_MODE = 0;
574 parameter READ_MODE = 0;
576 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
577 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
578 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
579 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
580 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
581 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
582 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
583 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
584 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
585 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
586 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
587 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
588 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
589 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
590 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
591 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
593 parameter INIT_FILE = "";
596 .WRITE_MODE(WRITE_MODE),
597 .READ_MODE (READ_MODE ),
614 .INIT_FILE (INIT_FILE )
630 module SB_RAM40_4KNRNW (
631 (* abc_flop_q *) output [15:0] RDATA,
632 input RCLKN, RCLKE, RE,
634 input WCLKN, WCLKE, WE,
636 input [15:0] MASK, WDATA
638 parameter WRITE_MODE = 0;
639 parameter READ_MODE = 0;
641 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
642 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
643 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
644 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
645 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
646 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
647 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
648 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
649 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
650 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
651 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
652 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
653 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
654 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
655 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
656 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
658 parameter INIT_FILE = "";
661 .WRITE_MODE(WRITE_MODE),
662 .READ_MODE (READ_MODE ),
679 .INIT_FILE (INIT_FILE )
695 // Packed IceStorm Logic Cells
698 input I0, I1, I2, I3, CIN, CLK, CEN, SR,
701 parameter [15:0] LUT_INIT = 0;
703 parameter [0:0] NEG_CLK = 0;
704 parameter [0:0] CARRY_ENABLE = 0;
705 parameter [0:0] DFF_ENABLE = 0;
706 parameter [0:0] SET_NORESET = 0;
707 parameter [0:0] ASYNC_SR = 0;
709 parameter [0:0] CIN_CONST = 0;
710 parameter [0:0] CIN_SET = 0;
712 wire mux_cin = CIN_CONST ? CIN_SET : CIN;
714 assign COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && mux_cin) : 1'bx;
716 wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
717 wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0];
718 wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0];
719 wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0];
724 assign polarized_clk = CLK ^ NEG_CLK;
727 always @(posedge polarized_clk)
729 o_reg <= SR ? SET_NORESET : lut_o;
732 always @(posedge polarized_clk, posedge SR)
734 o_reg <= SET_NORESET;
738 assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o;
741 // SiliconBlue PLL Cells
744 module SB_PLL40_CORE (
749 input [7:0] DYNAMICDELAY,
753 input LATCHINPUTVALUE,
758 parameter FEEDBACK_PATH = "SIMPLE";
759 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
760 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
761 parameter SHIFTREG_DIV_MODE = 1'b0;
762 parameter FDA_FEEDBACK = 4'b0000;
763 parameter FDA_RELATIVE = 4'b0000;
764 parameter PLLOUT_SELECT = "GENCLK";
765 parameter DIVR = 4'b0000;
766 parameter DIVF = 7'b0000000;
767 parameter DIVQ = 3'b000;
768 parameter FILTER_RANGE = 3'b000;
769 parameter ENABLE_ICEGATE = 1'b0;
770 parameter TEST_MODE = 1'b0;
771 parameter EXTERNAL_DIVIDE_FACTOR = 1;
775 module SB_PLL40_PAD (
780 input [7:0] DYNAMICDELAY,
784 input LATCHINPUTVALUE,
789 parameter FEEDBACK_PATH = "SIMPLE";
790 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
791 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
792 parameter SHIFTREG_DIV_MODE = 1'b0;
793 parameter FDA_FEEDBACK = 4'b0000;
794 parameter FDA_RELATIVE = 4'b0000;
795 parameter PLLOUT_SELECT = "GENCLK";
796 parameter DIVR = 4'b0000;
797 parameter DIVF = 7'b0000000;
798 parameter DIVQ = 3'b000;
799 parameter FILTER_RANGE = 3'b000;
800 parameter ENABLE_ICEGATE = 1'b0;
801 parameter TEST_MODE = 1'b0;
802 parameter EXTERNAL_DIVIDE_FACTOR = 1;
806 module SB_PLL40_2_PAD (
809 output PLLOUTGLOBALA,
811 output PLLOUTGLOBALB,
813 input [7:0] DYNAMICDELAY,
817 input LATCHINPUTVALUE,
822 parameter FEEDBACK_PATH = "SIMPLE";
823 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
824 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
825 parameter SHIFTREG_DIV_MODE = 1'b0;
826 parameter FDA_FEEDBACK = 4'b0000;
827 parameter FDA_RELATIVE = 4'b0000;
828 parameter PLLOUT_SELECT_PORTB = "GENCLK";
829 parameter DIVR = 4'b0000;
830 parameter DIVF = 7'b0000000;
831 parameter DIVQ = 3'b000;
832 parameter FILTER_RANGE = 3'b000;
833 parameter ENABLE_ICEGATE_PORTA = 1'b0;
834 parameter ENABLE_ICEGATE_PORTB = 1'b0;
835 parameter TEST_MODE = 1'b0;
836 parameter EXTERNAL_DIVIDE_FACTOR = 1;
840 module SB_PLL40_2F_CORE (
843 output PLLOUTGLOBALA,
845 output PLLOUTGLOBALB,
847 input [7:0] DYNAMICDELAY,
851 input LATCHINPUTVALUE,
856 parameter FEEDBACK_PATH = "SIMPLE";
857 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
858 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
859 parameter SHIFTREG_DIV_MODE = 1'b0;
860 parameter FDA_FEEDBACK = 4'b0000;
861 parameter FDA_RELATIVE = 4'b0000;
862 parameter PLLOUT_SELECT_PORTA = "GENCLK";
863 parameter PLLOUT_SELECT_PORTB = "GENCLK";
864 parameter DIVR = 4'b0000;
865 parameter DIVF = 7'b0000000;
866 parameter DIVQ = 3'b000;
867 parameter FILTER_RANGE = 3'b000;
868 parameter ENABLE_ICEGATE_PORTA = 1'b0;
869 parameter ENABLE_ICEGATE_PORTB = 1'b0;
870 parameter TEST_MODE = 1'b0;
871 parameter EXTERNAL_DIVIDE_FACTOR = 1;
875 module SB_PLL40_2F_PAD (
878 output PLLOUTGLOBALA,
880 output PLLOUTGLOBALB,
882 input [7:0] DYNAMICDELAY,
886 input LATCHINPUTVALUE,
891 parameter FEEDBACK_PATH = "SIMPLE";
892 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
893 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
894 parameter SHIFTREG_DIV_MODE = 2'b00;
895 parameter FDA_FEEDBACK = 4'b0000;
896 parameter FDA_RELATIVE = 4'b0000;
897 parameter PLLOUT_SELECT_PORTA = "GENCLK";
898 parameter PLLOUT_SELECT_PORTB = "GENCLK";
899 parameter DIVR = 4'b0000;
900 parameter DIVF = 7'b0000000;
901 parameter DIVQ = 3'b000;
902 parameter FILTER_RANGE = 3'b000;
903 parameter ENABLE_ICEGATE_PORTA = 1'b0;
904 parameter ENABLE_ICEGATE_PORTB = 1'b0;
905 parameter TEST_MODE = 1'b0;
906 parameter EXTERNAL_DIVIDE_FACTOR = 1;
909 // SiliconBlue Device Configuration Cells
920 module SB_SPRAM256KA (
921 input [13:0] ADDRESS,
923 input [3:0] MASKWREN,
924 input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF,
925 (* abc_flop_q *) output reg [15:0] DATAOUT
929 reg [15:0] mem [0:16383];
930 wire off = SLEEP || !POWEROFF;
933 always @(negedge POWEROFF) begin
934 for (i = 0; i <= 16383; i = i+1)
938 always @(posedge CLOCK, posedge off) begin
942 if (CHIPSELECT && !STANDBY && !WREN) begin
943 DATAOUT <= mem[ADDRESS];
945 if (CHIPSELECT && !STANDBY && WREN) begin
946 if (MASKWREN[0]) mem[ADDRESS][ 3: 0] = DATAIN[ 3: 0];
947 if (MASKWREN[1]) mem[ADDRESS][ 7: 4] = DATAIN[ 7: 4];
948 if (MASKWREN[2]) mem[ADDRESS][11: 8] = DATAIN[11: 8];
949 if (MASKWREN[3]) mem[ADDRESS][15:12] = DATAIN[15:12];
974 parameter TRIM_EN = "0b0";
975 parameter CLKHF_DIV = "0b00";
997 parameter CURRENT_MODE = "0b0";
998 parameter RGB0_CURRENT = "0b000000";
999 parameter RGB1_CURRENT = "0b000000";
1000 parameter RGB2_CURRENT = "0b000000";
1037 output SCLO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1042 parameter I2C_SLAVE_INIT_ADDR = "0b1111100001";
1043 parameter BUS_ADDR74 = "0b0001";
1086 output SCKO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1097 parameter BUS_ADDR74 = "0b0000";
1127 module SB_FILTER_50NS(
1135 input LATCH_INPUT_VALUE,
1139 input OUTPUT_ENABLE,
1147 parameter [5:0] PIN_TYPE = 6'b000000;
1148 parameter [0:0] PULLUP = 1'b0;
1149 parameter [0:0] WEAK_PULLUP = 1'b0;
1150 parameter [0:0] NEG_TRIGGER = 1'b0;
1151 parameter IO_STANDARD = "SB_LVCMOS";
1154 reg dout, din_0, din_1;
1155 reg din_q_0, din_q_1;
1156 reg dout_q_0, dout_q_1;
1159 generate if (!NEG_TRIGGER) begin
1160 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1161 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1162 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1163 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1164 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1166 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1167 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1168 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1169 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1170 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1174 if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE)
1175 din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0;
1179 // work around simulation glitches on dout in DDR mode
1180 reg outclk_delayed_1;
1181 reg outclk_delayed_2;
1182 always @* outclk_delayed_1 <= OUTPUT_CLK;
1183 always @* outclk_delayed_2 <= outclk_delayed_1;
1187 dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0;
1189 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1192 assign D_IN_0 = din_0, D_IN_1 = din_1;
1195 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout;
1196 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz;
1197 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
1204 input LATCHINPUTVALUE,
1214 parameter [5:0] PIN_TYPE = 6'b000000;
1215 parameter [0:0] NEG_TRIGGER = 1'b0;
1218 reg dout, din_0, din_1;
1219 reg din_q_0, din_q_1;
1220 reg dout_q_0, dout_q_1;
1223 generate if (!NEG_TRIGGER) begin
1224 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1225 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1226 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1227 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1228 always @(posedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1230 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1231 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1232 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1233 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1234 always @(negedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1238 if (!PIN_TYPE[1] || !LATCHINPUTVALUE)
1239 din_0 = PIN_TYPE[0] ? PACKAGEPIN : din_q_0;
1243 // work around simulation glitches on dout in DDR mode
1244 reg outclk_delayed_1;
1245 reg outclk_delayed_2;
1246 always @* outclk_delayed_1 <= OUTPUTCLK;
1247 always @* outclk_delayed_2 <= outclk_delayed_1;
1251 dout = PIN_TYPE[2] ? !dout_q_0 : DOUT0;
1253 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1256 assign DIN0 = din_0, DIN1 = din_1;
1259 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGEPIN = dout ? 1'bz : 1'b0;
1260 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGEPIN = OUTPUTENABLE ? (dout ? 1'bz : 1'b0) : 1'bz;
1261 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGEPIN = outena_q ? (dout ? 1'bz : 1'b0) : 1'bz;
1268 input [15:0] C, A, B, D,
1269 input AHOLD, BHOLD, CHOLD, DHOLD,
1270 input IRSTTOP, IRSTBOT,
1271 input ORSTTOP, ORSTBOT,
1272 input OLOADTOP, OLOADBOT,
1273 input ADDSUBTOP, ADDSUBBOT,
1274 input OHOLDTOP, OHOLDBOT,
1275 input CI, ACCUMCI, SIGNEXTIN,
1277 output CO, ACCUMCO, SIGNEXTOUT
1279 parameter [0:0] NEG_TRIGGER = 0;
1280 parameter [0:0] C_REG = 0;
1281 parameter [0:0] A_REG = 0;
1282 parameter [0:0] B_REG = 0;
1283 parameter [0:0] D_REG = 0;
1284 parameter [0:0] TOP_8x8_MULT_REG = 0;
1285 parameter [0:0] BOT_8x8_MULT_REG = 0;
1286 parameter [0:0] PIPELINE_16x16_MULT_REG1 = 0;
1287 parameter [0:0] PIPELINE_16x16_MULT_REG2 = 0;
1288 parameter [1:0] TOPOUTPUT_SELECT = 0;
1289 parameter [1:0] TOPADDSUB_LOWERINPUT = 0;
1290 parameter [0:0] TOPADDSUB_UPPERINPUT = 0;
1291 parameter [1:0] TOPADDSUB_CARRYSELECT = 0;
1292 parameter [1:0] BOTOUTPUT_SELECT = 0;
1293 parameter [1:0] BOTADDSUB_LOWERINPUT = 0;
1294 parameter [0:0] BOTADDSUB_UPPERINPUT = 0;
1295 parameter [1:0] BOTADDSUB_CARRYSELECT = 0;
1296 parameter [0:0] MODE_8x8 = 0;
1297 parameter [0:0] A_SIGNED = 0;
1298 parameter [0:0] B_SIGNED = 0;
1300 wire clock = CLK ^ NEG_TRIGGER;
1302 // internal wires, compare Figure on page 133 of ICE Technology Library 3.0 and Fig 2 on page 2 of Lattice TN1295-DSP
1303 // http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201608.pdf
1304 // https://www.latticesemi.com/-/media/LatticeSemi/Documents/ApplicationNotes/AD/DSPFunctionUsageGuideforICE40Devices.ashx
1305 wire [15:0] iA, iB, iC, iD;
1306 wire [15:0] iF, iJ, iK, iG;
1308 wire [15:0] iW, iX, iP, iQ;
1309 wire [15:0] iY, iZ, iR, iS;
1314 always @(posedge clock, posedge IRSTTOP) begin
1318 end else if (CE) begin
1319 if (!CHOLD) rC <= C;
1320 if (!AHOLD) rA <= A;
1323 assign iC = C_REG ? rC : C;
1324 assign iA = A_REG ? rA : A;
1328 always @(posedge clock, posedge IRSTBOT) begin
1332 end else if (CE) begin
1333 if (!BHOLD) rB <= B;
1334 if (!DHOLD) rD <= D;
1337 assign iB = B_REG ? rB : B;
1338 assign iD = D_REG ? rD : D;
1341 wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
1342 wire [15:0] Ah, Al, Bh, Bl;
1343 assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
1344 assign Al = {A_SIGNED ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
1345 assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
1346 assign Bl = {B_SIGNED ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
1347 assign p_Ah_Bh = Ah * Bh;
1348 assign p_Al_Bh = Al * Bh;
1349 assign p_Ah_Bl = Ah * Bl;
1350 assign p_Al_Bl = Al * Bl;
1354 always @(posedge clock, posedge IRSTTOP) begin
1358 end else if (CE) begin
1360 if (!MODE_8x8) rJ <= p_Al_Bh;
1363 assign iF = TOP_8x8_MULT_REG ? rF : p_Ah_Bh;
1364 assign iJ = PIPELINE_16x16_MULT_REG1 ? rJ : p_Al_Bh;
1368 always @(posedge clock, posedge IRSTBOT) begin
1372 end else if (CE) begin
1373 if (!MODE_8x8) rK <= p_Ah_Bl;
1377 assign iK = PIPELINE_16x16_MULT_REG1 ? rK : p_Ah_Bl;
1378 assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
1381 assign iL = iG + (iK << 8) + (iJ << 8) + (iF << 16);
1385 always @(posedge clock, posedge IRSTBOT) begin
1388 end else if (CE) begin
1389 if (!MODE_8x8) rH <= iL;
1392 assign iH = PIPELINE_16x16_MULT_REG2 ? rH : iL;
1397 assign iW = TOPADDSUB_UPPERINPUT ? iC : iQ;
1398 assign iX = (TOPADDSUB_LOWERINPUT == 0) ? iA : (TOPADDSUB_LOWERINPUT == 1) ? iF : (TOPADDSUB_LOWERINPUT == 2) ? iH[31:16] : {16{iZ[15]}};
1399 assign {ACCUMCO, XW} = iX + (iW ^ {16{ADDSUBTOP}}) + HCI;
1400 assign CO = ACCUMCO ^ ADDSUBTOP;
1401 assign iP = OLOADTOP ? iC : XW ^ {16{ADDSUBTOP}};
1402 always @(posedge clock, posedge ORSTTOP) begin
1405 end else if (CE) begin
1406 if (!OHOLDTOP) rQ <= iP;
1410 assign Oh = (TOPOUTPUT_SELECT == 0) ? iP : (TOPOUTPUT_SELECT == 1) ? iQ : (TOPOUTPUT_SELECT == 2) ? iF : iH[31:16];
1411 assign HCI = (TOPADDSUB_CARRYSELECT == 0) ? 1'b0 : (TOPADDSUB_CARRYSELECT == 1) ? 1'b1 : (TOPADDSUB_CARRYSELECT == 2) ? LCO : LCO ^ ADDSUBBOT;
1412 assign SIGNEXTOUT = iX[15];
1417 assign iY = BOTADDSUB_UPPERINPUT ? iD : iS;
1418 assign iZ = (BOTADDSUB_LOWERINPUT == 0) ? iB : (BOTADDSUB_LOWERINPUT == 1) ? iG : (BOTADDSUB_LOWERINPUT == 2) ? iH[15:0] : {16{SIGNEXTIN}};
1419 assign {LCO, YZ} = iZ + (iY ^ {16{ADDSUBBOT}}) + LCI;
1420 assign iR = OLOADBOT ? iD : YZ ^ {16{ADDSUBBOT}};
1421 always @(posedge clock, posedge ORSTBOT) begin
1424 end else if (CE) begin
1425 if (!OHOLDBOT) rS <= iR;
1429 assign Ol = (BOTOUTPUT_SELECT == 0) ? iR : (BOTOUTPUT_SELECT == 1) ? iS : (BOTOUTPUT_SELECT == 2) ? iG : iH[15:0];
1430 assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
1431 assign O = {Oh, Ol};