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_FULL_ADDER (
161 // I0: 1010 1010 1010 1010
162 // I1: 1100 1100 1100 1100
163 // I2: 1111 0000 1111 0000
164 // I3: 1111 1111 0000 0000
165 .LUT_INIT(16'b 0110_1001_1001_0110)
175 // Positive Edge SiliconBlue FF Cells
177 module SB_DFF (output `SB_DFF_REG, input C, D);
182 module SB_DFFE (output `SB_DFF_REG, input C, E, D);
188 module SB_DFFSR (output `SB_DFF_REG, input C, R, D);
196 module SB_DFFR (output `SB_DFF_REG, input C, R, D);
197 always @(posedge C, posedge R)
204 module SB_DFFSS (output `SB_DFF_REG, input C, S, D);
212 module SB_DFFS (output `SB_DFF_REG, input C, S, D);
213 always @(posedge C, posedge S)
220 module SB_DFFESR (output `SB_DFF_REG, input C, E, R, D);
230 module SB_DFFER (output `SB_DFF_REG, input C, E, R, D);
231 always @(posedge C, posedge R)
238 module SB_DFFESS (output `SB_DFF_REG, input C, E, S, D);
248 module SB_DFFES (output `SB_DFF_REG, input C, E, S, D);
249 always @(posedge C, posedge S)
256 // Negative Edge SiliconBlue FF Cells
258 module SB_DFFN (output `SB_DFF_REG, input C, D);
263 module SB_DFFNE (output `SB_DFF_REG, input C, E, D);
269 module SB_DFFNSR (output `SB_DFF_REG, input C, R, D);
277 module SB_DFFNR (output `SB_DFF_REG, input C, R, D);
278 always @(negedge C, posedge R)
285 module SB_DFFNSS (output `SB_DFF_REG, input C, S, D);
293 module SB_DFFNS (output `SB_DFF_REG, input C, S, D);
294 always @(negedge C, posedge S)
301 module SB_DFFNESR (output `SB_DFF_REG, input C, E, R, D);
311 module SB_DFFNER (output `SB_DFF_REG, input C, E, R, D);
312 always @(negedge C, posedge R)
319 module SB_DFFNESS (output `SB_DFF_REG, input C, E, S, D);
329 module SB_DFFNES (output `SB_DFF_REG, input C, E, S, D);
330 always @(negedge C, posedge S)
337 // SiliconBlue RAM Cells
341 input RCLK, RCLKE, RE,
343 input WCLK, WCLKE, WE,
345 input [15:0] MASK, WDATA
351 parameter WRITE_MODE = 0;
352 parameter READ_MODE = 0;
354 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
355 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
356 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
357 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
358 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
359 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
360 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
361 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
362 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
363 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
364 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
365 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
366 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
367 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
368 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
369 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
371 parameter INIT_FILE = "";
382 0: assign WMASK_I = MASK;
384 1: assign WMASK_I = WADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
385 WADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
387 2: assign WMASK_I = WADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
388 WADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
389 WADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
390 WADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
392 3: assign WMASK_I = WADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
393 WADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
394 WADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
395 WADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
396 WADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
397 WADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
398 WADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
399 WADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
403 0: assign RMASK_I = 16'b 0000_0000_0000_0000;
405 1: assign RMASK_I = RADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
406 RADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
408 2: assign RMASK_I = RADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
409 RADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
410 RADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
411 RADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
413 3: assign RMASK_I = RADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
414 RADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
415 RADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
416 RADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
417 RADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
418 RADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
419 RADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
420 RADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
424 0: assign WDATA_I = WDATA;
426 1: assign WDATA_I = {WDATA[14], WDATA[14], WDATA[12], WDATA[12],
427 WDATA[10], WDATA[10], WDATA[ 8], WDATA[ 8],
428 WDATA[ 6], WDATA[ 6], WDATA[ 4], WDATA[ 4],
429 WDATA[ 2], WDATA[ 2], WDATA[ 0], WDATA[ 0]};
431 2: assign WDATA_I = {WDATA[13], WDATA[13], WDATA[13], WDATA[13],
432 WDATA[ 9], WDATA[ 9], WDATA[ 9], WDATA[ 9],
433 WDATA[ 5], WDATA[ 5], WDATA[ 5], WDATA[ 5],
434 WDATA[ 1], WDATA[ 1], WDATA[ 1], WDATA[ 1]};
436 3: assign WDATA_I = {WDATA[11], WDATA[11], WDATA[11], WDATA[11],
437 WDATA[11], WDATA[11], WDATA[11], WDATA[11],
438 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3],
439 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3]};
443 0: assign RDATA = RDATA_I;
444 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],
445 1'b0, |RDATA_I[ 7: 6], 1'b0, |RDATA_I[ 5: 4], 1'b0, |RDATA_I[ 3: 2], 1'b0, |RDATA_I[ 1: 0]};
446 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};
447 3: assign RDATA = {4'b0, |RDATA_I[15: 8], 7'b0, |RDATA_I[ 7: 0], 3'b0};
452 reg [15:0] memory [0:255];
456 $readmemh(INIT_FILE, memory);
458 for (i=0; i<16; i=i+1) begin
459 memory[ 0*16 + i] = INIT_0[16*i +: 16];
460 memory[ 1*16 + i] = INIT_1[16*i +: 16];
461 memory[ 2*16 + i] = INIT_2[16*i +: 16];
462 memory[ 3*16 + i] = INIT_3[16*i +: 16];
463 memory[ 4*16 + i] = INIT_4[16*i +: 16];
464 memory[ 5*16 + i] = INIT_5[16*i +: 16];
465 memory[ 6*16 + i] = INIT_6[16*i +: 16];
466 memory[ 7*16 + i] = INIT_7[16*i +: 16];
467 memory[ 8*16 + i] = INIT_8[16*i +: 16];
468 memory[ 9*16 + i] = INIT_9[16*i +: 16];
469 memory[10*16 + i] = INIT_A[16*i +: 16];
470 memory[11*16 + i] = INIT_B[16*i +: 16];
471 memory[12*16 + i] = INIT_C[16*i +: 16];
472 memory[13*16 + i] = INIT_D[16*i +: 16];
473 memory[14*16 + i] = INIT_E[16*i +: 16];
474 memory[15*16 + i] = INIT_F[16*i +: 16];
478 always @(posedge WCLK) begin
479 if (WE && WCLKE) begin
480 if (!WMASK_I[ 0]) memory[WADDR[7:0]][ 0] <= WDATA_I[ 0];
481 if (!WMASK_I[ 1]) memory[WADDR[7:0]][ 1] <= WDATA_I[ 1];
482 if (!WMASK_I[ 2]) memory[WADDR[7:0]][ 2] <= WDATA_I[ 2];
483 if (!WMASK_I[ 3]) memory[WADDR[7:0]][ 3] <= WDATA_I[ 3];
484 if (!WMASK_I[ 4]) memory[WADDR[7:0]][ 4] <= WDATA_I[ 4];
485 if (!WMASK_I[ 5]) memory[WADDR[7:0]][ 5] <= WDATA_I[ 5];
486 if (!WMASK_I[ 6]) memory[WADDR[7:0]][ 6] <= WDATA_I[ 6];
487 if (!WMASK_I[ 7]) memory[WADDR[7:0]][ 7] <= WDATA_I[ 7];
488 if (!WMASK_I[ 8]) memory[WADDR[7:0]][ 8] <= WDATA_I[ 8];
489 if (!WMASK_I[ 9]) memory[WADDR[7:0]][ 9] <= WDATA_I[ 9];
490 if (!WMASK_I[10]) memory[WADDR[7:0]][10] <= WDATA_I[10];
491 if (!WMASK_I[11]) memory[WADDR[7:0]][11] <= WDATA_I[11];
492 if (!WMASK_I[12]) memory[WADDR[7:0]][12] <= WDATA_I[12];
493 if (!WMASK_I[13]) memory[WADDR[7:0]][13] <= WDATA_I[13];
494 if (!WMASK_I[14]) memory[WADDR[7:0]][14] <= WDATA_I[14];
495 if (!WMASK_I[15]) memory[WADDR[7:0]][15] <= WDATA_I[15];
499 always @(posedge RCLK) begin
500 if (RE && RCLKE) begin
501 RDATA_I <= memory[RADDR[7:0]] & ~RMASK_I;
507 module SB_RAM40_4KNR (
509 input RCLKN, RCLKE, RE,
511 input WCLK, WCLKE, WE,
513 input [15:0] MASK, WDATA
515 parameter WRITE_MODE = 0;
516 parameter READ_MODE = 0;
518 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
519 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
520 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
521 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
522 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
523 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
524 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
525 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
526 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
527 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
528 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
529 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
530 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
531 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
532 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
533 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
535 parameter INIT_FILE = "";
538 .WRITE_MODE(WRITE_MODE),
539 .READ_MODE (READ_MODE ),
556 .INIT_FILE (INIT_FILE )
572 module SB_RAM40_4KNW (
574 input RCLK, RCLKE, RE,
576 input WCLKN, WCLKE, WE,
578 input [15:0] MASK, WDATA
580 parameter WRITE_MODE = 0;
581 parameter READ_MODE = 0;
583 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
584 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
585 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
586 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
587 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
588 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
589 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
590 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
591 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
592 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
593 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
594 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
595 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
596 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
597 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
598 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
600 parameter INIT_FILE = "";
603 .WRITE_MODE(WRITE_MODE),
604 .READ_MODE (READ_MODE ),
621 .INIT_FILE (INIT_FILE )
637 module SB_RAM40_4KNRNW (
639 input RCLKN, RCLKE, RE,
641 input WCLKN, WCLKE, WE,
643 input [15:0] MASK, WDATA
645 parameter WRITE_MODE = 0;
646 parameter READ_MODE = 0;
648 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
649 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
650 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
651 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
652 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
653 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
654 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
655 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
656 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
657 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
658 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
659 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
660 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
661 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
662 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
663 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
665 parameter INIT_FILE = "";
668 .WRITE_MODE(WRITE_MODE),
669 .READ_MODE (READ_MODE ),
686 .INIT_FILE (INIT_FILE )
702 // Packed IceStorm Logic Cells
705 input I0, I1, I2, I3, CIN, CLK, CEN, SR,
708 parameter [15:0] LUT_INIT = 0;
710 parameter [0:0] NEG_CLK = 0;
711 parameter [0:0] CARRY_ENABLE = 0;
712 parameter [0:0] DFF_ENABLE = 0;
713 parameter [0:0] SET_NORESET = 0;
714 parameter [0:0] ASYNC_SR = 0;
716 parameter [0:0] CIN_CONST = 0;
717 parameter [0:0] CIN_SET = 0;
719 wire mux_cin = CIN_CONST ? CIN_SET : CIN;
721 assign COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && mux_cin) : 1'bx;
723 wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
724 wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0];
725 wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0];
726 wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0];
731 assign polarized_clk = CLK ^ NEG_CLK;
734 always @(posedge polarized_clk)
736 o_reg <= SR ? SET_NORESET : lut_o;
739 always @(posedge polarized_clk, posedge SR)
741 o_reg <= SET_NORESET;
745 assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o;
748 // SiliconBlue PLL Cells
751 module SB_PLL40_CORE (
756 input [7:0] DYNAMICDELAY,
760 input LATCHINPUTVALUE,
765 parameter FEEDBACK_PATH = "SIMPLE";
766 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
767 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
768 parameter SHIFTREG_DIV_MODE = 1'b0;
769 parameter FDA_FEEDBACK = 4'b0000;
770 parameter FDA_RELATIVE = 4'b0000;
771 parameter PLLOUT_SELECT = "GENCLK";
772 parameter DIVR = 4'b0000;
773 parameter DIVF = 7'b0000000;
774 parameter DIVQ = 3'b000;
775 parameter FILTER_RANGE = 3'b000;
776 parameter ENABLE_ICEGATE = 1'b0;
777 parameter TEST_MODE = 1'b0;
778 parameter EXTERNAL_DIVIDE_FACTOR = 1;
782 module SB_PLL40_PAD (
787 input [7:0] DYNAMICDELAY,
791 input LATCHINPUTVALUE,
796 parameter FEEDBACK_PATH = "SIMPLE";
797 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
798 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
799 parameter SHIFTREG_DIV_MODE = 1'b0;
800 parameter FDA_FEEDBACK = 4'b0000;
801 parameter FDA_RELATIVE = 4'b0000;
802 parameter PLLOUT_SELECT = "GENCLK";
803 parameter DIVR = 4'b0000;
804 parameter DIVF = 7'b0000000;
805 parameter DIVQ = 3'b000;
806 parameter FILTER_RANGE = 3'b000;
807 parameter ENABLE_ICEGATE = 1'b0;
808 parameter TEST_MODE = 1'b0;
809 parameter EXTERNAL_DIVIDE_FACTOR = 1;
813 module SB_PLL40_2_PAD (
816 output PLLOUTGLOBALA,
818 output PLLOUTGLOBALB,
820 input [7:0] DYNAMICDELAY,
824 input LATCHINPUTVALUE,
829 parameter FEEDBACK_PATH = "SIMPLE";
830 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
831 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
832 parameter SHIFTREG_DIV_MODE = 1'b0;
833 parameter FDA_FEEDBACK = 4'b0000;
834 parameter FDA_RELATIVE = 4'b0000;
835 parameter PLLOUT_SELECT_PORTB = "GENCLK";
836 parameter DIVR = 4'b0000;
837 parameter DIVF = 7'b0000000;
838 parameter DIVQ = 3'b000;
839 parameter FILTER_RANGE = 3'b000;
840 parameter ENABLE_ICEGATE_PORTA = 1'b0;
841 parameter ENABLE_ICEGATE_PORTB = 1'b0;
842 parameter TEST_MODE = 1'b0;
843 parameter EXTERNAL_DIVIDE_FACTOR = 1;
847 module SB_PLL40_2F_CORE (
850 output PLLOUTGLOBALA,
852 output PLLOUTGLOBALB,
854 input [7:0] DYNAMICDELAY,
858 input LATCHINPUTVALUE,
863 parameter FEEDBACK_PATH = "SIMPLE";
864 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
865 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
866 parameter SHIFTREG_DIV_MODE = 1'b0;
867 parameter FDA_FEEDBACK = 4'b0000;
868 parameter FDA_RELATIVE = 4'b0000;
869 parameter PLLOUT_SELECT_PORTA = "GENCLK";
870 parameter PLLOUT_SELECT_PORTB = "GENCLK";
871 parameter DIVR = 4'b0000;
872 parameter DIVF = 7'b0000000;
873 parameter DIVQ = 3'b000;
874 parameter FILTER_RANGE = 3'b000;
875 parameter ENABLE_ICEGATE_PORTA = 1'b0;
876 parameter ENABLE_ICEGATE_PORTB = 1'b0;
877 parameter TEST_MODE = 1'b0;
878 parameter EXTERNAL_DIVIDE_FACTOR = 1;
882 module SB_PLL40_2F_PAD (
885 output PLLOUTGLOBALA,
887 output PLLOUTGLOBALB,
889 input [7:0] DYNAMICDELAY,
893 input LATCHINPUTVALUE,
898 parameter FEEDBACK_PATH = "SIMPLE";
899 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
900 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
901 parameter SHIFTREG_DIV_MODE = 2'b00;
902 parameter FDA_FEEDBACK = 4'b0000;
903 parameter FDA_RELATIVE = 4'b0000;
904 parameter PLLOUT_SELECT_PORTA = "GENCLK";
905 parameter PLLOUT_SELECT_PORTB = "GENCLK";
906 parameter DIVR = 4'b0000;
907 parameter DIVF = 7'b0000000;
908 parameter DIVQ = 3'b000;
909 parameter FILTER_RANGE = 3'b000;
910 parameter ENABLE_ICEGATE_PORTA = 1'b0;
911 parameter ENABLE_ICEGATE_PORTB = 1'b0;
912 parameter TEST_MODE = 1'b0;
913 parameter EXTERNAL_DIVIDE_FACTOR = 1;
916 // SiliconBlue Device Configuration Cells
926 module SB_SPRAM256KA (
927 input [13:0] ADDRESS,
929 input [3:0] MASKWREN,
930 input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF,
931 output reg [15:0] DATAOUT
935 reg [15:0] mem [0:16383];
936 wire off = SLEEP || !POWEROFF;
939 always @(negedge POWEROFF) begin
940 for (i = 0; i <= 16383; i = i+1)
944 always @(posedge CLOCK, posedge off) begin
948 if (CHIPSELECT && !STANDBY && !WREN) begin
949 DATAOUT <= mem[ADDRESS];
951 if (CHIPSELECT && !STANDBY && WREN) begin
952 if (MASKWREN[0]) mem[ADDRESS][ 3: 0] = DATAIN[ 3: 0];
953 if (MASKWREN[1]) mem[ADDRESS][ 7: 4] = DATAIN[ 7: 4];
954 if (MASKWREN[2]) mem[ADDRESS][11: 8] = DATAIN[11: 8];
955 if (MASKWREN[3]) mem[ADDRESS][15:12] = DATAIN[15:12];
980 parameter TRIM_EN = "0b0";
981 parameter CLKHF_DIV = "0b00";
1003 parameter CURRENT_MODE = "0b0";
1004 parameter RGB0_CURRENT = "0b000000";
1005 parameter RGB1_CURRENT = "0b000000";
1006 parameter RGB2_CURRENT = "0b000000";
1010 module SB_LED_DRV_CUR(
1027 parameter CURRENT_MODE = "0b0";
1028 parameter RGB0_CURRENT = "0b000000";
1029 parameter RGB1_CURRENT = "0b000000";
1030 parameter RGB2_CURRENT = "0b000000";
1067 output SCLO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1072 parameter I2C_SLAVE_INIT_ADDR = "0b1111100001";
1073 parameter BUS_ADDR74 = "0b0001";
1116 output SCKO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1127 parameter BUS_ADDR74 = "0b0000";
1157 module SB_FILTER_50NS(
1165 input LATCH_INPUT_VALUE,
1169 input OUTPUT_ENABLE,
1177 parameter [5:0] PIN_TYPE = 6'b000000;
1178 parameter [0:0] PULLUP = 1'b0;
1179 parameter [0:0] WEAK_PULLUP = 1'b0;
1180 parameter [0:0] NEG_TRIGGER = 1'b0;
1181 parameter IO_STANDARD = "SB_LVCMOS";
1184 reg dout, din_0, din_1;
1185 reg din_q_0, din_q_1;
1186 reg dout_q_0, dout_q_1;
1189 generate if (!NEG_TRIGGER) begin
1190 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1191 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1192 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1193 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1194 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1196 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1197 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1198 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1199 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1200 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1204 if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE)
1205 din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0;
1209 // work around simulation glitches on dout in DDR mode
1210 reg outclk_delayed_1;
1211 reg outclk_delayed_2;
1212 always @* outclk_delayed_1 <= OUTPUT_CLK;
1213 always @* outclk_delayed_2 <= outclk_delayed_1;
1217 dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0;
1219 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1222 assign D_IN_0 = din_0, D_IN_1 = din_1;
1225 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout;
1226 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz;
1227 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
1234 input LATCHINPUTVALUE,
1244 parameter [5:0] PIN_TYPE = 6'b000000;
1245 parameter [0:0] NEG_TRIGGER = 1'b0;
1248 reg dout, din_0, din_1;
1249 reg din_q_0, din_q_1;
1250 reg dout_q_0, dout_q_1;
1253 generate if (!NEG_TRIGGER) begin
1254 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1255 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1256 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1257 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1258 always @(posedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1260 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1261 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1262 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1263 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1264 always @(negedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1268 if (!PIN_TYPE[1] || !LATCHINPUTVALUE)
1269 din_0 = PIN_TYPE[0] ? PACKAGEPIN : din_q_0;
1273 // work around simulation glitches on dout in DDR mode
1274 reg outclk_delayed_1;
1275 reg outclk_delayed_2;
1276 always @* outclk_delayed_1 <= OUTPUTCLK;
1277 always @* outclk_delayed_2 <= outclk_delayed_1;
1281 dout = PIN_TYPE[2] ? !dout_q_0 : DOUT0;
1283 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1286 assign DIN0 = din_0, DIN1 = din_1;
1289 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGEPIN = dout ? 1'bz : 1'b0;
1290 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGEPIN = OUTPUTENABLE ? (dout ? 1'bz : 1'b0) : 1'bz;
1291 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGEPIN = outena_q ? (dout ? 1'bz : 1'b0) : 1'bz;
1298 input [15:0] C, A, B, D,
1299 input AHOLD, BHOLD, CHOLD, DHOLD,
1300 input IRSTTOP, IRSTBOT,
1301 input ORSTTOP, ORSTBOT,
1302 input OLOADTOP, OLOADBOT,
1303 input ADDSUBTOP, ADDSUBBOT,
1304 input OHOLDTOP, OHOLDBOT,
1305 input CI, ACCUMCI, SIGNEXTIN,
1307 output CO, ACCUMCO, SIGNEXTOUT
1309 parameter [0:0] NEG_TRIGGER = 0;
1310 parameter [0:0] C_REG = 0;
1311 parameter [0:0] A_REG = 0;
1312 parameter [0:0] B_REG = 0;
1313 parameter [0:0] D_REG = 0;
1314 parameter [0:0] TOP_8x8_MULT_REG = 0;
1315 parameter [0:0] BOT_8x8_MULT_REG = 0;
1316 parameter [0:0] PIPELINE_16x16_MULT_REG1 = 0;
1317 parameter [0:0] PIPELINE_16x16_MULT_REG2 = 0;
1318 parameter [1:0] TOPOUTPUT_SELECT = 0;
1319 parameter [1:0] TOPADDSUB_LOWERINPUT = 0;
1320 parameter [0:0] TOPADDSUB_UPPERINPUT = 0;
1321 parameter [1:0] TOPADDSUB_CARRYSELECT = 0;
1322 parameter [1:0] BOTOUTPUT_SELECT = 0;
1323 parameter [1:0] BOTADDSUB_LOWERINPUT = 0;
1324 parameter [0:0] BOTADDSUB_UPPERINPUT = 0;
1325 parameter [1:0] BOTADDSUB_CARRYSELECT = 0;
1326 parameter [0:0] MODE_8x8 = 0;
1327 parameter [0:0] A_SIGNED = 0;
1328 parameter [0:0] B_SIGNED = 0;
1330 wire clock = CLK ^ NEG_TRIGGER;
1332 // internal wires, compare Figure on page 133 of ICE Technology Library 3.0 and Fig 2 on page 2 of Lattice TN1295-DSP
1333 // http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201608.pdf
1334 // https://www.latticesemi.com/-/media/LatticeSemi/Documents/ApplicationNotes/AD/DSPFunctionUsageGuideforICE40Devices.ashx
1335 wire [15:0] iA, iB, iC, iD;
1336 wire [15:0] iF, iJ, iK, iG;
1338 wire [15:0] iW, iX, iP, iQ;
1339 wire [15:0] iY, iZ, iR, iS;
1344 always @(posedge clock, posedge IRSTTOP) begin
1348 end else if (CE) begin
1349 if (!CHOLD) rC <= C;
1350 if (!AHOLD) rA <= A;
1353 assign iC = C_REG ? rC : C;
1354 assign iA = A_REG ? rA : A;
1358 always @(posedge clock, posedge IRSTBOT) begin
1362 end else if (CE) begin
1363 if (!BHOLD) rB <= B;
1364 if (!DHOLD) rD <= D;
1367 assign iB = B_REG ? rB : B;
1368 assign iD = D_REG ? rD : D;
1371 wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
1372 wire [15:0] Ah, Al, Bh, Bl;
1373 assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
1374 assign Al = {A_SIGNED && MODE_8x8 ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
1375 assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
1376 assign Bl = {B_SIGNED && MODE_8x8 ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
1377 assign p_Ah_Bh = Ah * Bh; // F
1378 assign p_Al_Bh = {8'b0, Al[7:0]} * Bh; // J
1379 assign p_Ah_Bl = Ah * {8'b0, Bl[7:0]}; // K
1380 assign p_Al_Bl = Al * Bl; // G
1384 always @(posedge clock, posedge IRSTTOP) begin
1388 end else if (CE) begin
1390 if (!MODE_8x8) rJ <= p_Al_Bh;
1393 assign iF = TOP_8x8_MULT_REG ? rF : p_Ah_Bh;
1394 assign iJ = PIPELINE_16x16_MULT_REG1 ? rJ : p_Al_Bh;
1398 always @(posedge clock, posedge IRSTBOT) begin
1402 end else if (CE) begin
1403 if (!MODE_8x8) rK <= p_Ah_Bl;
1407 assign iK = PIPELINE_16x16_MULT_REG1 ? rK : p_Ah_Bl;
1408 assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
1411 wire [23:0] iK_e = {A_SIGNED ? {8{iK[15]}} : 8'b0, iK};
1412 wire [23:0] iJ_e = {B_SIGNED ? {8{iJ[15]}} : 8'b0, iJ};
1413 assign iL = iG + (iK_e << 8) + (iJ_e << 8) + (iF << 16);
1417 always @(posedge clock, posedge IRSTBOT) begin
1420 end else if (CE) begin
1421 if (!MODE_8x8) rH <= iL;
1424 assign iH = PIPELINE_16x16_MULT_REG2 ? rH : iL;
1429 assign iW = TOPADDSUB_UPPERINPUT ? iC : iQ;
1430 assign iX = (TOPADDSUB_LOWERINPUT == 0) ? iA : (TOPADDSUB_LOWERINPUT == 1) ? iF : (TOPADDSUB_LOWERINPUT == 2) ? iH[31:16] : {16{iZ[15]}};
1431 assign {ACCUMCO, XW} = iX + (iW ^ {16{ADDSUBTOP}}) + HCI;
1432 assign CO = ACCUMCO ^ ADDSUBTOP;
1433 assign iP = OLOADTOP ? iC : XW ^ {16{ADDSUBTOP}};
1434 always @(posedge clock, posedge ORSTTOP) begin
1437 end else if (CE) begin
1438 if (!OHOLDTOP) rQ <= iP;
1442 assign Oh = (TOPOUTPUT_SELECT == 0) ? iP : (TOPOUTPUT_SELECT == 1) ? iQ : (TOPOUTPUT_SELECT == 2) ? iF : iH[31:16];
1443 assign HCI = (TOPADDSUB_CARRYSELECT == 0) ? 1'b0 : (TOPADDSUB_CARRYSELECT == 1) ? 1'b1 : (TOPADDSUB_CARRYSELECT == 2) ? LCO : LCO ^ ADDSUBBOT;
1444 assign SIGNEXTOUT = iX[15];
1449 assign iY = BOTADDSUB_UPPERINPUT ? iD : iS;
1450 assign iZ = (BOTADDSUB_LOWERINPUT == 0) ? iB : (BOTADDSUB_LOWERINPUT == 1) ? iG : (BOTADDSUB_LOWERINPUT == 2) ? iH[15:0] : {16{SIGNEXTIN}};
1451 assign {LCO, YZ} = iZ + (iY ^ {16{ADDSUBBOT}}) + LCI;
1452 assign iR = OLOADBOT ? iD : YZ ^ {16{ADDSUBBOT}};
1453 always @(posedge clock, posedge ORSTBOT) begin
1456 end else if (CE) begin
1457 if (!OHOLDBOT) rS <= iR;
1461 assign Ol = (BOTOUTPUT_SELECT == 0) ? iR : (BOTOUTPUT_SELECT == 1) ? iS : (BOTOUTPUT_SELECT == 2) ? iG : iH[15:0];
1462 assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
1463 assign O = {Oh, Ol};