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
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];
140 module SB_CARRY (output CO, input I0, I1, CI);
141 assign CO = (I0 && I1) || ((I0 || I1) && CI);
144 (* abc_box_id = 1, lib_whitebox *)
145 module \$__ICE40_CARRY_WRAPPER (
172 // Positive Edge SiliconBlue FF Cells
174 module SB_DFF (output `SB_DFF_REG, input C, D);
179 module SB_DFFE (output `SB_DFF_REG, input C, E, D);
185 module SB_DFFSR (output `SB_DFF_REG, input C, R, D);
193 module SB_DFFR (output `SB_DFF_REG, input C, R, D);
194 always @(posedge C, posedge R)
201 module SB_DFFSS (output `SB_DFF_REG, input C, S, D);
209 module SB_DFFS (output `SB_DFF_REG, input C, S, D);
210 always @(posedge C, posedge S)
217 module SB_DFFESR (output `SB_DFF_REG, input C, E, R, D);
227 module SB_DFFER (output `SB_DFF_REG, input C, E, R, D);
228 always @(posedge C, posedge R)
235 module SB_DFFESS (output `SB_DFF_REG, input C, E, S, D);
245 module SB_DFFES (output `SB_DFF_REG, input C, E, S, D);
246 always @(posedge C, posedge S)
253 // Negative Edge SiliconBlue FF Cells
255 module SB_DFFN (output `SB_DFF_REG, input C, D);
260 module SB_DFFNE (output `SB_DFF_REG, input C, E, D);
266 module SB_DFFNSR (output `SB_DFF_REG, input C, R, D);
274 module SB_DFFNR (output `SB_DFF_REG, input C, R, D);
275 always @(negedge C, posedge R)
282 module SB_DFFNSS (output `SB_DFF_REG, input C, S, D);
290 module SB_DFFNS (output `SB_DFF_REG, input C, S, D);
291 always @(negedge C, posedge S)
298 module SB_DFFNESR (output `SB_DFF_REG, input C, E, R, D);
308 module SB_DFFNER (output `SB_DFF_REG, input C, E, R, D);
309 always @(negedge C, posedge R)
316 module SB_DFFNESS (output `SB_DFF_REG, input C, E, S, D);
326 module SB_DFFNES (output `SB_DFF_REG, input C, E, S, D);
327 always @(negedge C, posedge S)
334 // SiliconBlue RAM Cells
338 input RCLK, RCLKE, RE,
340 input WCLK, WCLKE, WE,
342 input [15:0] MASK, WDATA
348 parameter WRITE_MODE = 0;
349 parameter READ_MODE = 0;
351 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
352 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
353 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
354 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
355 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
356 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
357 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
358 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
359 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
360 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
361 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
362 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
363 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
364 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
365 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
366 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
368 parameter INIT_FILE = "";
379 0: assign WMASK_I = MASK;
381 1: assign WMASK_I = WADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
382 WADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
384 2: assign WMASK_I = WADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
385 WADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
386 WADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
387 WADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
389 3: assign WMASK_I = WADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
390 WADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
391 WADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
392 WADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
393 WADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
394 WADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
395 WADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
396 WADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
400 0: assign RMASK_I = 16'b 0000_0000_0000_0000;
402 1: assign RMASK_I = RADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
403 RADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
405 2: assign RMASK_I = RADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
406 RADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
407 RADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
408 RADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
410 3: assign RMASK_I = RADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
411 RADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
412 RADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
413 RADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
414 RADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
415 RADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
416 RADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
417 RADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
421 0: assign WDATA_I = WDATA;
423 1: assign WDATA_I = {WDATA[14], WDATA[14], WDATA[12], WDATA[12],
424 WDATA[10], WDATA[10], WDATA[ 8], WDATA[ 8],
425 WDATA[ 6], WDATA[ 6], WDATA[ 4], WDATA[ 4],
426 WDATA[ 2], WDATA[ 2], WDATA[ 0], WDATA[ 0]};
428 2: assign WDATA_I = {WDATA[13], WDATA[13], WDATA[13], WDATA[13],
429 WDATA[ 9], WDATA[ 9], WDATA[ 9], WDATA[ 9],
430 WDATA[ 5], WDATA[ 5], WDATA[ 5], WDATA[ 5],
431 WDATA[ 1], WDATA[ 1], WDATA[ 1], WDATA[ 1]};
433 3: assign WDATA_I = {WDATA[11], WDATA[11], WDATA[11], WDATA[11],
434 WDATA[11], WDATA[11], WDATA[11], WDATA[11],
435 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3],
436 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3]};
440 0: assign RDATA = RDATA_I;
441 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],
442 1'b0, |RDATA_I[ 7: 6], 1'b0, |RDATA_I[ 5: 4], 1'b0, |RDATA_I[ 3: 2], 1'b0, |RDATA_I[ 1: 0]};
443 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};
444 3: assign RDATA = {4'b0, |RDATA_I[15: 8], 7'b0, |RDATA_I[ 7: 0], 3'b0};
449 reg [15:0] memory [0:255];
453 $readmemh(INIT_FILE, memory);
455 for (i=0; i<16; i=i+1) begin
456 memory[ 0*16 + i] = INIT_0[16*i +: 16];
457 memory[ 1*16 + i] = INIT_1[16*i +: 16];
458 memory[ 2*16 + i] = INIT_2[16*i +: 16];
459 memory[ 3*16 + i] = INIT_3[16*i +: 16];
460 memory[ 4*16 + i] = INIT_4[16*i +: 16];
461 memory[ 5*16 + i] = INIT_5[16*i +: 16];
462 memory[ 6*16 + i] = INIT_6[16*i +: 16];
463 memory[ 7*16 + i] = INIT_7[16*i +: 16];
464 memory[ 8*16 + i] = INIT_8[16*i +: 16];
465 memory[ 9*16 + i] = INIT_9[16*i +: 16];
466 memory[10*16 + i] = INIT_A[16*i +: 16];
467 memory[11*16 + i] = INIT_B[16*i +: 16];
468 memory[12*16 + i] = INIT_C[16*i +: 16];
469 memory[13*16 + i] = INIT_D[16*i +: 16];
470 memory[14*16 + i] = INIT_E[16*i +: 16];
471 memory[15*16 + i] = INIT_F[16*i +: 16];
475 always @(posedge WCLK) begin
476 if (WE && WCLKE) begin
477 if (!WMASK_I[ 0]) memory[WADDR[7:0]][ 0] <= WDATA_I[ 0];
478 if (!WMASK_I[ 1]) memory[WADDR[7:0]][ 1] <= WDATA_I[ 1];
479 if (!WMASK_I[ 2]) memory[WADDR[7:0]][ 2] <= WDATA_I[ 2];
480 if (!WMASK_I[ 3]) memory[WADDR[7:0]][ 3] <= WDATA_I[ 3];
481 if (!WMASK_I[ 4]) memory[WADDR[7:0]][ 4] <= WDATA_I[ 4];
482 if (!WMASK_I[ 5]) memory[WADDR[7:0]][ 5] <= WDATA_I[ 5];
483 if (!WMASK_I[ 6]) memory[WADDR[7:0]][ 6] <= WDATA_I[ 6];
484 if (!WMASK_I[ 7]) memory[WADDR[7:0]][ 7] <= WDATA_I[ 7];
485 if (!WMASK_I[ 8]) memory[WADDR[7:0]][ 8] <= WDATA_I[ 8];
486 if (!WMASK_I[ 9]) memory[WADDR[7:0]][ 9] <= WDATA_I[ 9];
487 if (!WMASK_I[10]) memory[WADDR[7:0]][10] <= WDATA_I[10];
488 if (!WMASK_I[11]) memory[WADDR[7:0]][11] <= WDATA_I[11];
489 if (!WMASK_I[12]) memory[WADDR[7:0]][12] <= WDATA_I[12];
490 if (!WMASK_I[13]) memory[WADDR[7:0]][13] <= WDATA_I[13];
491 if (!WMASK_I[14]) memory[WADDR[7:0]][14] <= WDATA_I[14];
492 if (!WMASK_I[15]) memory[WADDR[7:0]][15] <= WDATA_I[15];
496 always @(posedge RCLK) begin
497 if (RE && RCLKE) begin
498 RDATA_I <= memory[RADDR[7:0]] & ~RMASK_I;
504 module SB_RAM40_4KNR (
506 input RCLKN, RCLKE, RE,
508 input WCLK, WCLKE, WE,
510 input [15:0] MASK, WDATA
512 parameter WRITE_MODE = 0;
513 parameter READ_MODE = 0;
515 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
516 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
517 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
518 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
519 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
520 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
521 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
522 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
523 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
524 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
525 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
526 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
527 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
528 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
529 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
530 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
532 parameter INIT_FILE = "";
535 .WRITE_MODE(WRITE_MODE),
536 .READ_MODE (READ_MODE ),
553 .INIT_FILE (INIT_FILE )
569 module SB_RAM40_4KNW (
571 input RCLK, RCLKE, RE,
573 input WCLKN, WCLKE, WE,
575 input [15:0] MASK, WDATA
577 parameter WRITE_MODE = 0;
578 parameter READ_MODE = 0;
580 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
581 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
582 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
583 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
584 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
585 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
586 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
587 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
588 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
589 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
590 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
591 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
592 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
593 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
594 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
595 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
597 parameter INIT_FILE = "";
600 .WRITE_MODE(WRITE_MODE),
601 .READ_MODE (READ_MODE ),
618 .INIT_FILE (INIT_FILE )
634 module SB_RAM40_4KNRNW (
636 input RCLKN, RCLKE, RE,
638 input WCLKN, WCLKE, WE,
640 input [15:0] MASK, WDATA
642 parameter WRITE_MODE = 0;
643 parameter READ_MODE = 0;
645 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
646 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
647 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
648 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
649 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
650 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
651 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
652 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
653 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
654 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
655 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
656 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
657 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
658 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
659 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
660 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
662 parameter INIT_FILE = "";
665 .WRITE_MODE(WRITE_MODE),
666 .READ_MODE (READ_MODE ),
683 .INIT_FILE (INIT_FILE )
699 // Packed IceStorm Logic Cells
702 input I0, I1, I2, I3, CIN, CLK, CEN, SR,
705 parameter [15:0] LUT_INIT = 0;
707 parameter [0:0] NEG_CLK = 0;
708 parameter [0:0] CARRY_ENABLE = 0;
709 parameter [0:0] DFF_ENABLE = 0;
710 parameter [0:0] SET_NORESET = 0;
711 parameter [0:0] ASYNC_SR = 0;
713 parameter [0:0] CIN_CONST = 0;
714 parameter [0:0] CIN_SET = 0;
716 wire mux_cin = CIN_CONST ? CIN_SET : CIN;
718 assign COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && mux_cin) : 1'bx;
720 wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
721 wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0];
722 wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0];
723 wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0];
728 assign polarized_clk = CLK ^ NEG_CLK;
731 always @(posedge polarized_clk)
733 o_reg <= SR ? SET_NORESET : lut_o;
736 always @(posedge polarized_clk, posedge SR)
738 o_reg <= SET_NORESET;
742 assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o;
745 // SiliconBlue PLL Cells
748 module SB_PLL40_CORE (
753 input [7:0] DYNAMICDELAY,
757 input LATCHINPUTVALUE,
762 parameter FEEDBACK_PATH = "SIMPLE";
763 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
764 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
765 parameter SHIFTREG_DIV_MODE = 1'b0;
766 parameter FDA_FEEDBACK = 4'b0000;
767 parameter FDA_RELATIVE = 4'b0000;
768 parameter PLLOUT_SELECT = "GENCLK";
769 parameter DIVR = 4'b0000;
770 parameter DIVF = 7'b0000000;
771 parameter DIVQ = 3'b000;
772 parameter FILTER_RANGE = 3'b000;
773 parameter ENABLE_ICEGATE = 1'b0;
774 parameter TEST_MODE = 1'b0;
775 parameter EXTERNAL_DIVIDE_FACTOR = 1;
779 module SB_PLL40_PAD (
784 input [7:0] DYNAMICDELAY,
788 input LATCHINPUTVALUE,
793 parameter FEEDBACK_PATH = "SIMPLE";
794 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
795 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
796 parameter SHIFTREG_DIV_MODE = 1'b0;
797 parameter FDA_FEEDBACK = 4'b0000;
798 parameter FDA_RELATIVE = 4'b0000;
799 parameter PLLOUT_SELECT = "GENCLK";
800 parameter DIVR = 4'b0000;
801 parameter DIVF = 7'b0000000;
802 parameter DIVQ = 3'b000;
803 parameter FILTER_RANGE = 3'b000;
804 parameter ENABLE_ICEGATE = 1'b0;
805 parameter TEST_MODE = 1'b0;
806 parameter EXTERNAL_DIVIDE_FACTOR = 1;
810 module SB_PLL40_2_PAD (
813 output PLLOUTGLOBALA,
815 output PLLOUTGLOBALB,
817 input [7:0] DYNAMICDELAY,
821 input LATCHINPUTVALUE,
826 parameter FEEDBACK_PATH = "SIMPLE";
827 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
828 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
829 parameter SHIFTREG_DIV_MODE = 1'b0;
830 parameter FDA_FEEDBACK = 4'b0000;
831 parameter FDA_RELATIVE = 4'b0000;
832 parameter PLLOUT_SELECT_PORTB = "GENCLK";
833 parameter DIVR = 4'b0000;
834 parameter DIVF = 7'b0000000;
835 parameter DIVQ = 3'b000;
836 parameter FILTER_RANGE = 3'b000;
837 parameter ENABLE_ICEGATE_PORTA = 1'b0;
838 parameter ENABLE_ICEGATE_PORTB = 1'b0;
839 parameter TEST_MODE = 1'b0;
840 parameter EXTERNAL_DIVIDE_FACTOR = 1;
844 module SB_PLL40_2F_CORE (
847 output PLLOUTGLOBALA,
849 output PLLOUTGLOBALB,
851 input [7:0] DYNAMICDELAY,
855 input LATCHINPUTVALUE,
860 parameter FEEDBACK_PATH = "SIMPLE";
861 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
862 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
863 parameter SHIFTREG_DIV_MODE = 1'b0;
864 parameter FDA_FEEDBACK = 4'b0000;
865 parameter FDA_RELATIVE = 4'b0000;
866 parameter PLLOUT_SELECT_PORTA = "GENCLK";
867 parameter PLLOUT_SELECT_PORTB = "GENCLK";
868 parameter DIVR = 4'b0000;
869 parameter DIVF = 7'b0000000;
870 parameter DIVQ = 3'b000;
871 parameter FILTER_RANGE = 3'b000;
872 parameter ENABLE_ICEGATE_PORTA = 1'b0;
873 parameter ENABLE_ICEGATE_PORTB = 1'b0;
874 parameter TEST_MODE = 1'b0;
875 parameter EXTERNAL_DIVIDE_FACTOR = 1;
879 module SB_PLL40_2F_PAD (
882 output PLLOUTGLOBALA,
884 output PLLOUTGLOBALB,
886 input [7:0] DYNAMICDELAY,
890 input LATCHINPUTVALUE,
895 parameter FEEDBACK_PATH = "SIMPLE";
896 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
897 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
898 parameter SHIFTREG_DIV_MODE = 2'b00;
899 parameter FDA_FEEDBACK = 4'b0000;
900 parameter FDA_RELATIVE = 4'b0000;
901 parameter PLLOUT_SELECT_PORTA = "GENCLK";
902 parameter PLLOUT_SELECT_PORTB = "GENCLK";
903 parameter DIVR = 4'b0000;
904 parameter DIVF = 7'b0000000;
905 parameter DIVQ = 3'b000;
906 parameter FILTER_RANGE = 3'b000;
907 parameter ENABLE_ICEGATE_PORTA = 1'b0;
908 parameter ENABLE_ICEGATE_PORTB = 1'b0;
909 parameter TEST_MODE = 1'b0;
910 parameter EXTERNAL_DIVIDE_FACTOR = 1;
913 // SiliconBlue Device Configuration Cells
923 module SB_SPRAM256KA (
924 input [13:0] ADDRESS,
926 input [3:0] MASKWREN,
927 input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF,
928 output reg [15:0] DATAOUT
932 reg [15:0] mem [0:16383];
933 wire off = SLEEP || !POWEROFF;
936 always @(negedge POWEROFF) begin
937 for (i = 0; i <= 16383; i = i+1)
941 always @(posedge CLOCK, posedge off) begin
945 if (CHIPSELECT && !STANDBY && !WREN) begin
946 DATAOUT <= mem[ADDRESS];
948 if (CHIPSELECT && !STANDBY && WREN) begin
949 if (MASKWREN[0]) mem[ADDRESS][ 3: 0] = DATAIN[ 3: 0];
950 if (MASKWREN[1]) mem[ADDRESS][ 7: 4] = DATAIN[ 7: 4];
951 if (MASKWREN[2]) mem[ADDRESS][11: 8] = DATAIN[11: 8];
952 if (MASKWREN[3]) mem[ADDRESS][15:12] = DATAIN[15:12];
977 parameter TRIM_EN = "0b0";
978 parameter CLKHF_DIV = "0b00";
1000 parameter CURRENT_MODE = "0b0";
1001 parameter RGB0_CURRENT = "0b000000";
1002 parameter RGB1_CURRENT = "0b000000";
1003 parameter RGB2_CURRENT = "0b000000";
1007 module SB_LED_DRV_CUR(
1024 parameter CURRENT_MODE = "0b0";
1025 parameter RGB0_CURRENT = "0b000000";
1026 parameter RGB1_CURRENT = "0b000000";
1027 parameter RGB2_CURRENT = "0b000000";
1064 output SCLO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1069 parameter I2C_SLAVE_INIT_ADDR = "0b1111100001";
1070 parameter BUS_ADDR74 = "0b0001";
1113 output SCKO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1124 parameter BUS_ADDR74 = "0b0000";
1154 module SB_FILTER_50NS(
1162 input LATCH_INPUT_VALUE,
1166 input OUTPUT_ENABLE,
1174 parameter [5:0] PIN_TYPE = 6'b000000;
1175 parameter [0:0] PULLUP = 1'b0;
1176 parameter [0:0] WEAK_PULLUP = 1'b0;
1177 parameter [0:0] NEG_TRIGGER = 1'b0;
1178 parameter IO_STANDARD = "SB_LVCMOS";
1181 reg dout, din_0, din_1;
1182 reg din_q_0, din_q_1;
1183 reg dout_q_0, dout_q_1;
1186 generate if (!NEG_TRIGGER) begin
1187 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1188 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1189 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1190 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1191 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1193 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1194 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1195 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1196 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1197 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1201 if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE)
1202 din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0;
1206 // work around simulation glitches on dout in DDR mode
1207 reg outclk_delayed_1;
1208 reg outclk_delayed_2;
1209 always @* outclk_delayed_1 <= OUTPUT_CLK;
1210 always @* outclk_delayed_2 <= outclk_delayed_1;
1214 dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0;
1216 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1219 assign D_IN_0 = din_0, D_IN_1 = din_1;
1222 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout;
1223 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz;
1224 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
1231 input LATCHINPUTVALUE,
1241 parameter [5:0] PIN_TYPE = 6'b000000;
1242 parameter [0:0] NEG_TRIGGER = 1'b0;
1245 reg dout, din_0, din_1;
1246 reg din_q_0, din_q_1;
1247 reg dout_q_0, dout_q_1;
1250 generate if (!NEG_TRIGGER) begin
1251 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1252 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1253 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1254 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1255 always @(posedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1257 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1258 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1259 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1260 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1261 always @(negedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1265 if (!PIN_TYPE[1] || !LATCHINPUTVALUE)
1266 din_0 = PIN_TYPE[0] ? PACKAGEPIN : din_q_0;
1270 // work around simulation glitches on dout in DDR mode
1271 reg outclk_delayed_1;
1272 reg outclk_delayed_2;
1273 always @* outclk_delayed_1 <= OUTPUTCLK;
1274 always @* outclk_delayed_2 <= outclk_delayed_1;
1278 dout = PIN_TYPE[2] ? !dout_q_0 : DOUT0;
1280 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1283 assign DIN0 = din_0, DIN1 = din_1;
1286 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGEPIN = dout ? 1'bz : 1'b0;
1287 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGEPIN = OUTPUTENABLE ? (dout ? 1'bz : 1'b0) : 1'bz;
1288 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGEPIN = outena_q ? (dout ? 1'bz : 1'b0) : 1'bz;
1295 input [15:0] C, A, B, D,
1296 input AHOLD, BHOLD, CHOLD, DHOLD,
1297 input IRSTTOP, IRSTBOT,
1298 input ORSTTOP, ORSTBOT,
1299 input OLOADTOP, OLOADBOT,
1300 input ADDSUBTOP, ADDSUBBOT,
1301 input OHOLDTOP, OHOLDBOT,
1302 input CI, ACCUMCI, SIGNEXTIN,
1304 output CO, ACCUMCO, SIGNEXTOUT
1306 parameter [0:0] NEG_TRIGGER = 0;
1307 parameter [0:0] C_REG = 0;
1308 parameter [0:0] A_REG = 0;
1309 parameter [0:0] B_REG = 0;
1310 parameter [0:0] D_REG = 0;
1311 parameter [0:0] TOP_8x8_MULT_REG = 0;
1312 parameter [0:0] BOT_8x8_MULT_REG = 0;
1313 parameter [0:0] PIPELINE_16x16_MULT_REG1 = 0;
1314 parameter [0:0] PIPELINE_16x16_MULT_REG2 = 0;
1315 parameter [1:0] TOPOUTPUT_SELECT = 0;
1316 parameter [1:0] TOPADDSUB_LOWERINPUT = 0;
1317 parameter [0:0] TOPADDSUB_UPPERINPUT = 0;
1318 parameter [1:0] TOPADDSUB_CARRYSELECT = 0;
1319 parameter [1:0] BOTOUTPUT_SELECT = 0;
1320 parameter [1:0] BOTADDSUB_LOWERINPUT = 0;
1321 parameter [0:0] BOTADDSUB_UPPERINPUT = 0;
1322 parameter [1:0] BOTADDSUB_CARRYSELECT = 0;
1323 parameter [0:0] MODE_8x8 = 0;
1324 parameter [0:0] A_SIGNED = 0;
1325 parameter [0:0] B_SIGNED = 0;
1327 wire clock = CLK ^ NEG_TRIGGER;
1329 // internal wires, compare Figure on page 133 of ICE Technology Library 3.0 and Fig 2 on page 2 of Lattice TN1295-DSP
1330 // http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201608.pdf
1331 // https://www.latticesemi.com/-/media/LatticeSemi/Documents/ApplicationNotes/AD/DSPFunctionUsageGuideforICE40Devices.ashx
1332 wire [15:0] iA, iB, iC, iD;
1333 wire [15:0] iF, iJ, iK, iG;
1335 wire [15:0] iW, iX, iP, iQ;
1336 wire [15:0] iY, iZ, iR, iS;
1341 always @(posedge clock, posedge IRSTTOP) begin
1345 end else if (CE) begin
1346 if (!CHOLD) rC <= C;
1347 if (!AHOLD) rA <= A;
1350 assign iC = C_REG ? rC : C;
1351 assign iA = A_REG ? rA : A;
1355 always @(posedge clock, posedge IRSTBOT) begin
1359 end else if (CE) begin
1360 if (!BHOLD) rB <= B;
1361 if (!DHOLD) rD <= D;
1364 assign iB = B_REG ? rB : B;
1365 assign iD = D_REG ? rD : D;
1368 wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
1369 wire [15:0] Ah, Al, Bh, Bl;
1370 assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
1371 assign Al = {A_SIGNED && MODE_8x8 ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
1372 assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
1373 assign Bl = {B_SIGNED && MODE_8x8 ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
1374 assign p_Ah_Bh = Ah * Bh; // F
1375 assign p_Al_Bh = {8'b0, Al[7:0]} * Bh; // J
1376 assign p_Ah_Bl = Ah * {8'b0, Bl[7:0]}; // K
1377 assign p_Al_Bl = Al * Bl; // G
1381 always @(posedge clock, posedge IRSTTOP) begin
1385 end else if (CE) begin
1387 if (!MODE_8x8) rJ <= p_Al_Bh;
1390 assign iF = TOP_8x8_MULT_REG ? rF : p_Ah_Bh;
1391 assign iJ = PIPELINE_16x16_MULT_REG1 ? rJ : p_Al_Bh;
1395 always @(posedge clock, posedge IRSTBOT) begin
1399 end else if (CE) begin
1400 if (!MODE_8x8) rK <= p_Ah_Bl;
1404 assign iK = PIPELINE_16x16_MULT_REG1 ? rK : p_Ah_Bl;
1405 assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
1408 wire [23:0] iK_e = {A_SIGNED ? {8{iK[15]}} : 8'b0, iK};
1409 wire [23:0] iJ_e = {B_SIGNED ? {8{iJ[15]}} : 8'b0, iJ};
1410 assign iL = iG + (iK_e << 8) + (iJ_e << 8) + (iF << 16);
1414 always @(posedge clock, posedge IRSTBOT) begin
1417 end else if (CE) begin
1418 if (!MODE_8x8) rH <= iL;
1421 assign iH = PIPELINE_16x16_MULT_REG2 ? rH : iL;
1426 assign iW = TOPADDSUB_UPPERINPUT ? iC : iQ;
1427 assign iX = (TOPADDSUB_LOWERINPUT == 0) ? iA : (TOPADDSUB_LOWERINPUT == 1) ? iF : (TOPADDSUB_LOWERINPUT == 2) ? iH[31:16] : {16{iZ[15]}};
1428 assign {ACCUMCO, XW} = iX + (iW ^ {16{ADDSUBTOP}}) + HCI;
1429 assign CO = ACCUMCO ^ ADDSUBTOP;
1430 assign iP = OLOADTOP ? iC : XW ^ {16{ADDSUBTOP}};
1431 always @(posedge clock, posedge ORSTTOP) begin
1434 end else if (CE) begin
1435 if (!OHOLDTOP) rQ <= iP;
1439 assign Oh = (TOPOUTPUT_SELECT == 0) ? iP : (TOPOUTPUT_SELECT == 1) ? iQ : (TOPOUTPUT_SELECT == 2) ? iF : iH[31:16];
1440 assign HCI = (TOPADDSUB_CARRYSELECT == 0) ? 1'b0 : (TOPADDSUB_CARRYSELECT == 1) ? 1'b1 : (TOPADDSUB_CARRYSELECT == 2) ? LCO : LCO ^ ADDSUBBOT;
1441 assign SIGNEXTOUT = iX[15];
1446 assign iY = BOTADDSUB_UPPERINPUT ? iD : iS;
1447 assign iZ = (BOTADDSUB_LOWERINPUT == 0) ? iB : (BOTADDSUB_LOWERINPUT == 1) ? iG : (BOTADDSUB_LOWERINPUT == 2) ? iH[15:0] : {16{SIGNEXTIN}};
1448 assign {LCO, YZ} = iZ + (iY ^ {16{ADDSUBBOT}}) + LCI;
1449 assign iR = OLOADBOT ? iD : YZ ^ {16{ADDSUBBOT}};
1450 always @(posedge clock, posedge ORSTBOT) begin
1453 end else if (CE) begin
1454 if (!OHOLDBOT) rS <= iR;
1458 assign Ol = (BOTOUTPUT_SELECT == 0) ? iR : (BOTOUTPUT_SELECT == 1) ? iS : (BOTOUTPUT_SELECT == 2) ? iG : iH[15:0];
1459 assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
1460 assign O = {Oh, Ol};