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 module SB_LUT4 (output O, input I0, I1, I2, I3);
131 parameter [15:0] LUT_INIT = 0;
132 wire [7:0] s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
133 wire [3:0] s2 = I2 ? s3[ 7:4] : s3[3:0];
134 wire [1:0] s1 = I1 ? s2[ 3:2] : s2[1:0];
135 assign O = I0 ? s1[1] : s1[0];
138 module SB_CARRY (output CO, input I0, I1, CI);
139 assign CO = (I0 && I1) || ((I0 || I1) && CI);
142 // Positive Edge SiliconBlue FF Cells
144 module SB_DFF (output `SB_DFF_REG, input C, D);
149 module SB_DFFE (output `SB_DFF_REG, input C, E, D);
155 module SB_DFFSR (output `SB_DFF_REG, input C, R, D);
163 module SB_DFFR (output `SB_DFF_REG, input C, R, D);
164 always @(posedge C, posedge R)
171 module SB_DFFSS (output `SB_DFF_REG, input C, S, D);
179 module SB_DFFS (output `SB_DFF_REG, input C, S, D);
180 always @(posedge C, posedge S)
187 module SB_DFFESR (output `SB_DFF_REG, input C, E, R, D);
197 module SB_DFFER (output `SB_DFF_REG, input C, E, R, D);
198 always @(posedge C, posedge R)
205 module SB_DFFESS (output `SB_DFF_REG, input C, E, S, D);
215 module SB_DFFES (output `SB_DFF_REG, input C, E, S, D);
216 always @(posedge C, posedge S)
223 // Negative Edge SiliconBlue FF Cells
225 module SB_DFFN (output `SB_DFF_REG, input C, D);
230 module SB_DFFNE (output `SB_DFF_REG, input C, E, D);
236 module SB_DFFNSR (output `SB_DFF_REG, input C, R, D);
244 module SB_DFFNR (output `SB_DFF_REG, input C, R, D);
245 always @(negedge C, posedge R)
252 module SB_DFFNSS (output `SB_DFF_REG, input C, S, D);
260 module SB_DFFNS (output `SB_DFF_REG, input C, S, D);
261 always @(negedge C, posedge S)
268 module SB_DFFNESR (output `SB_DFF_REG, input C, E, R, D);
278 module SB_DFFNER (output `SB_DFF_REG, input C, E, R, D);
279 always @(negedge C, posedge R)
286 module SB_DFFNESS (output `SB_DFF_REG, input C, E, S, D);
296 module SB_DFFNES (output `SB_DFF_REG, input C, E, S, D);
297 always @(negedge C, posedge S)
304 // SiliconBlue RAM Cells
308 input RCLK, RCLKE, RE,
310 input WCLK, WCLKE, WE,
312 input [15:0] MASK, WDATA
318 parameter WRITE_MODE = 0;
319 parameter READ_MODE = 0;
321 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
322 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
323 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
324 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
325 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
326 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
327 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
328 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
329 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
330 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
331 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
332 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
333 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
334 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
335 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
336 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
338 parameter INIT_FILE = "";
349 0: assign WMASK_I = MASK;
351 1: assign WMASK_I = WADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
352 WADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
354 2: assign WMASK_I = WADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
355 WADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
356 WADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
357 WADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
359 3: assign WMASK_I = WADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
360 WADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
361 WADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
362 WADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
363 WADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
364 WADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
365 WADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
366 WADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
370 0: assign RMASK_I = 16'b 0000_0000_0000_0000;
372 1: assign RMASK_I = RADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 :
373 RADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx;
375 2: assign RMASK_I = RADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 :
376 RADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 :
377 RADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 :
378 RADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx;
380 3: assign RMASK_I = RADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 :
381 RADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 :
382 RADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 :
383 RADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 :
384 RADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 :
385 RADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 :
386 RADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 :
387 RADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx;
391 0: assign WDATA_I = WDATA;
393 1: assign WDATA_I = {WDATA[14], WDATA[14], WDATA[12], WDATA[12],
394 WDATA[10], WDATA[10], WDATA[ 8], WDATA[ 8],
395 WDATA[ 6], WDATA[ 6], WDATA[ 4], WDATA[ 4],
396 WDATA[ 2], WDATA[ 2], WDATA[ 0], WDATA[ 0]};
398 2: assign WDATA_I = {WDATA[13], WDATA[13], WDATA[13], WDATA[13],
399 WDATA[ 9], WDATA[ 9], WDATA[ 9], WDATA[ 9],
400 WDATA[ 5], WDATA[ 5], WDATA[ 5], WDATA[ 5],
401 WDATA[ 1], WDATA[ 1], WDATA[ 1], WDATA[ 1]};
403 3: assign WDATA_I = {WDATA[11], WDATA[11], WDATA[11], WDATA[11],
404 WDATA[11], WDATA[11], WDATA[11], WDATA[11],
405 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3],
406 WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3]};
410 0: assign RDATA = RDATA_I;
411 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],
412 1'b0, |RDATA_I[ 7: 6], 1'b0, |RDATA_I[ 5: 4], 1'b0, |RDATA_I[ 3: 2], 1'b0, |RDATA_I[ 1: 0]};
413 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};
414 3: assign RDATA = {4'b0, |RDATA_I[15: 8], 7'b0, |RDATA_I[ 7: 0], 3'b0};
419 reg [15:0] memory [0:255];
423 $readmemh(INIT_FILE, memory);
425 for (i=0; i<16; i=i+1) begin
426 memory[ 0*16 + i] = INIT_0[16*i +: 16];
427 memory[ 1*16 + i] = INIT_1[16*i +: 16];
428 memory[ 2*16 + i] = INIT_2[16*i +: 16];
429 memory[ 3*16 + i] = INIT_3[16*i +: 16];
430 memory[ 4*16 + i] = INIT_4[16*i +: 16];
431 memory[ 5*16 + i] = INIT_5[16*i +: 16];
432 memory[ 6*16 + i] = INIT_6[16*i +: 16];
433 memory[ 7*16 + i] = INIT_7[16*i +: 16];
434 memory[ 8*16 + i] = INIT_8[16*i +: 16];
435 memory[ 9*16 + i] = INIT_9[16*i +: 16];
436 memory[10*16 + i] = INIT_A[16*i +: 16];
437 memory[11*16 + i] = INIT_B[16*i +: 16];
438 memory[12*16 + i] = INIT_C[16*i +: 16];
439 memory[13*16 + i] = INIT_D[16*i +: 16];
440 memory[14*16 + i] = INIT_E[16*i +: 16];
441 memory[15*16 + i] = INIT_F[16*i +: 16];
445 always @(posedge WCLK) begin
446 if (WE && WCLKE) begin
447 if (!WMASK_I[ 0]) memory[WADDR[7:0]][ 0] <= WDATA_I[ 0];
448 if (!WMASK_I[ 1]) memory[WADDR[7:0]][ 1] <= WDATA_I[ 1];
449 if (!WMASK_I[ 2]) memory[WADDR[7:0]][ 2] <= WDATA_I[ 2];
450 if (!WMASK_I[ 3]) memory[WADDR[7:0]][ 3] <= WDATA_I[ 3];
451 if (!WMASK_I[ 4]) memory[WADDR[7:0]][ 4] <= WDATA_I[ 4];
452 if (!WMASK_I[ 5]) memory[WADDR[7:0]][ 5] <= WDATA_I[ 5];
453 if (!WMASK_I[ 6]) memory[WADDR[7:0]][ 6] <= WDATA_I[ 6];
454 if (!WMASK_I[ 7]) memory[WADDR[7:0]][ 7] <= WDATA_I[ 7];
455 if (!WMASK_I[ 8]) memory[WADDR[7:0]][ 8] <= WDATA_I[ 8];
456 if (!WMASK_I[ 9]) memory[WADDR[7:0]][ 9] <= WDATA_I[ 9];
457 if (!WMASK_I[10]) memory[WADDR[7:0]][10] <= WDATA_I[10];
458 if (!WMASK_I[11]) memory[WADDR[7:0]][11] <= WDATA_I[11];
459 if (!WMASK_I[12]) memory[WADDR[7:0]][12] <= WDATA_I[12];
460 if (!WMASK_I[13]) memory[WADDR[7:0]][13] <= WDATA_I[13];
461 if (!WMASK_I[14]) memory[WADDR[7:0]][14] <= WDATA_I[14];
462 if (!WMASK_I[15]) memory[WADDR[7:0]][15] <= WDATA_I[15];
466 always @(posedge RCLK) begin
467 if (RE && RCLKE) begin
468 RDATA_I <= memory[RADDR[7:0]] & ~RMASK_I;
474 module SB_RAM40_4KNR (
476 input RCLKN, RCLKE, RE,
478 input WCLK, WCLKE, WE,
480 input [15:0] MASK, WDATA
482 parameter WRITE_MODE = 0;
483 parameter READ_MODE = 0;
485 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
486 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
487 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
488 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
489 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
490 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
491 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
492 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
493 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
494 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
495 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
496 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
497 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
498 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
499 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
500 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
502 parameter INIT_FILE = "";
505 .WRITE_MODE(WRITE_MODE),
506 .READ_MODE (READ_MODE ),
523 .INIT_FILE (INIT_FILE )
539 module SB_RAM40_4KNW (
541 input RCLK, RCLKE, RE,
543 input WCLKN, WCLKE, WE,
545 input [15:0] MASK, WDATA
547 parameter WRITE_MODE = 0;
548 parameter READ_MODE = 0;
550 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
551 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
552 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
553 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
554 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
555 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
556 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
557 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
558 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
559 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
560 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
561 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
562 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
563 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
564 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
565 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
567 parameter INIT_FILE = "";
570 .WRITE_MODE(WRITE_MODE),
571 .READ_MODE (READ_MODE ),
588 .INIT_FILE (INIT_FILE )
604 module SB_RAM40_4KNRNW (
606 input RCLKN, RCLKE, RE,
608 input WCLKN, WCLKE, WE,
610 input [15:0] MASK, WDATA
612 parameter WRITE_MODE = 0;
613 parameter READ_MODE = 0;
615 parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
616 parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
617 parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
618 parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
619 parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
620 parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
621 parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
622 parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
623 parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
624 parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
625 parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
626 parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
627 parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
628 parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
629 parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
630 parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
632 parameter INIT_FILE = "";
635 .WRITE_MODE(WRITE_MODE),
636 .READ_MODE (READ_MODE ),
653 .INIT_FILE (INIT_FILE )
669 // Packed IceStorm Logic Cells
672 input I0, I1, I2, I3, CIN, CLK, CEN, SR,
675 parameter [15:0] LUT_INIT = 0;
677 parameter [0:0] NEG_CLK = 0;
678 parameter [0:0] CARRY_ENABLE = 0;
679 parameter [0:0] DFF_ENABLE = 0;
680 parameter [0:0] SET_NORESET = 0;
681 parameter [0:0] ASYNC_SR = 0;
683 parameter [0:0] CIN_CONST = 0;
684 parameter [0:0] CIN_SET = 0;
686 wire mux_cin = CIN_CONST ? CIN_SET : CIN;
688 assign COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && mux_cin) : 1'bx;
690 wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
691 wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0];
692 wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0];
693 wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0];
698 assign polarized_clk = CLK ^ NEG_CLK;
701 always @(posedge polarized_clk)
703 o_reg <= SR ? SET_NORESET : lut_o;
706 always @(posedge polarized_clk, posedge SR)
708 o_reg <= SET_NORESET;
712 assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o;
715 // SiliconBlue PLL Cells
718 module SB_PLL40_CORE (
723 input [7:0] DYNAMICDELAY,
727 input LATCHINPUTVALUE,
732 parameter FEEDBACK_PATH = "SIMPLE";
733 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
734 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
735 parameter SHIFTREG_DIV_MODE = 1'b0;
736 parameter FDA_FEEDBACK = 4'b0000;
737 parameter FDA_RELATIVE = 4'b0000;
738 parameter PLLOUT_SELECT = "GENCLK";
739 parameter DIVR = 4'b0000;
740 parameter DIVF = 7'b0000000;
741 parameter DIVQ = 3'b000;
742 parameter FILTER_RANGE = 3'b000;
743 parameter ENABLE_ICEGATE = 1'b0;
744 parameter TEST_MODE = 1'b0;
745 parameter EXTERNAL_DIVIDE_FACTOR = 1;
749 module SB_PLL40_PAD (
754 input [7:0] DYNAMICDELAY,
758 input LATCHINPUTVALUE,
763 parameter FEEDBACK_PATH = "SIMPLE";
764 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
765 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
766 parameter SHIFTREG_DIV_MODE = 1'b0;
767 parameter FDA_FEEDBACK = 4'b0000;
768 parameter FDA_RELATIVE = 4'b0000;
769 parameter PLLOUT_SELECT = "GENCLK";
770 parameter DIVR = 4'b0000;
771 parameter DIVF = 7'b0000000;
772 parameter DIVQ = 3'b000;
773 parameter FILTER_RANGE = 3'b000;
774 parameter ENABLE_ICEGATE = 1'b0;
775 parameter TEST_MODE = 1'b0;
776 parameter EXTERNAL_DIVIDE_FACTOR = 1;
780 module SB_PLL40_2_PAD (
783 output PLLOUTGLOBALA,
785 output PLLOUTGLOBALB,
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_PORTB = "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_PORTA = 1'b0;
808 parameter ENABLE_ICEGATE_PORTB = 1'b0;
809 parameter TEST_MODE = 1'b0;
810 parameter EXTERNAL_DIVIDE_FACTOR = 1;
814 module SB_PLL40_2F_CORE (
817 output PLLOUTGLOBALA,
819 output PLLOUTGLOBALB,
821 input [7:0] DYNAMICDELAY,
825 input LATCHINPUTVALUE,
830 parameter FEEDBACK_PATH = "SIMPLE";
831 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
832 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
833 parameter SHIFTREG_DIV_MODE = 1'b0;
834 parameter FDA_FEEDBACK = 4'b0000;
835 parameter FDA_RELATIVE = 4'b0000;
836 parameter PLLOUT_SELECT_PORTA = "GENCLK";
837 parameter PLLOUT_SELECT_PORTB = "GENCLK";
838 parameter DIVR = 4'b0000;
839 parameter DIVF = 7'b0000000;
840 parameter DIVQ = 3'b000;
841 parameter FILTER_RANGE = 3'b000;
842 parameter ENABLE_ICEGATE_PORTA = 1'b0;
843 parameter ENABLE_ICEGATE_PORTB = 1'b0;
844 parameter TEST_MODE = 1'b0;
845 parameter EXTERNAL_DIVIDE_FACTOR = 1;
849 module SB_PLL40_2F_PAD (
852 output PLLOUTGLOBALA,
854 output PLLOUTGLOBALB,
856 input [7:0] DYNAMICDELAY,
860 input LATCHINPUTVALUE,
865 parameter FEEDBACK_PATH = "SIMPLE";
866 parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED";
867 parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED";
868 parameter SHIFTREG_DIV_MODE = 2'b00;
869 parameter FDA_FEEDBACK = 4'b0000;
870 parameter FDA_RELATIVE = 4'b0000;
871 parameter PLLOUT_SELECT_PORTA = "GENCLK";
872 parameter PLLOUT_SELECT_PORTB = "GENCLK";
873 parameter DIVR = 4'b0000;
874 parameter DIVF = 7'b0000000;
875 parameter DIVQ = 3'b000;
876 parameter FILTER_RANGE = 3'b000;
877 parameter ENABLE_ICEGATE_PORTA = 1'b0;
878 parameter ENABLE_ICEGATE_PORTB = 1'b0;
879 parameter TEST_MODE = 1'b0;
880 parameter EXTERNAL_DIVIDE_FACTOR = 1;
883 // SiliconBlue Device Configuration Cells
893 module SB_SPRAM256KA (
894 input [13:0] ADDRESS,
896 input [3:0] MASKWREN,
897 input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF,
898 output reg [15:0] DATAOUT
902 reg [15:0] mem [0:16383];
903 wire off = SLEEP || !POWEROFF;
906 always @(negedge POWEROFF) begin
907 for (i = 0; i <= 16383; i = i+1)
911 always @(posedge CLOCK, posedge off) begin
915 if (CHIPSELECT && !STANDBY && !WREN) begin
916 DATAOUT <= mem[ADDRESS];
918 if (CHIPSELECT && !STANDBY && WREN) begin
919 if (MASKWREN[0]) mem[ADDRESS][ 3: 0] = DATAIN[ 3: 0];
920 if (MASKWREN[1]) mem[ADDRESS][ 7: 4] = DATAIN[ 7: 4];
921 if (MASKWREN[2]) mem[ADDRESS][11: 8] = DATAIN[11: 8];
922 if (MASKWREN[3]) mem[ADDRESS][15:12] = DATAIN[15:12];
947 parameter TRIM_EN = "0b0";
948 parameter CLKHF_DIV = "0b00";
970 parameter CURRENT_MODE = "0b0";
971 parameter RGB0_CURRENT = "0b000000";
972 parameter RGB1_CURRENT = "0b000000";
973 parameter RGB2_CURRENT = "0b000000";
977 module SB_LED_DRV_CUR(
994 parameter CURRENT_MODE = "0b0";
995 parameter RGB0_CURRENT = "0b000000";
996 parameter RGB1_CURRENT = "0b000000";
997 parameter RGB2_CURRENT = "0b000000";
1034 output SCLO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1039 parameter I2C_SLAVE_INIT_ADDR = "0b1111100001";
1040 parameter BUS_ADDR74 = "0b0001";
1083 output SCKO, //inout in the SB verilog library, but output in the VHDL and PDF libs and seemingly in the HW itself
1094 parameter BUS_ADDR74 = "0b0000";
1124 module SB_FILTER_50NS(
1132 input LATCH_INPUT_VALUE,
1136 input OUTPUT_ENABLE,
1144 parameter [5:0] PIN_TYPE = 6'b000000;
1145 parameter [0:0] PULLUP = 1'b0;
1146 parameter [0:0] WEAK_PULLUP = 1'b0;
1147 parameter [0:0] NEG_TRIGGER = 1'b0;
1148 parameter IO_STANDARD = "SB_LVCMOS";
1151 reg dout, din_0, din_1;
1152 reg din_q_0, din_q_1;
1153 reg dout_q_0, dout_q_1;
1156 generate if (!NEG_TRIGGER) begin
1157 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1158 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1159 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1160 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1161 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1163 always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN;
1164 always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN;
1165 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0;
1166 always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1;
1167 always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE;
1171 if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE)
1172 din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0;
1176 // work around simulation glitches on dout in DDR mode
1177 reg outclk_delayed_1;
1178 reg outclk_delayed_2;
1179 always @* outclk_delayed_1 <= OUTPUT_CLK;
1180 always @* outclk_delayed_2 <= outclk_delayed_1;
1184 dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0;
1186 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1189 assign D_IN_0 = din_0, D_IN_1 = din_1;
1192 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout;
1193 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz;
1194 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
1201 input LATCHINPUTVALUE,
1211 parameter [5:0] PIN_TYPE = 6'b000000;
1212 parameter [0:0] NEG_TRIGGER = 1'b0;
1215 reg dout, din_0, din_1;
1216 reg din_q_0, din_q_1;
1217 reg dout_q_0, dout_q_1;
1220 generate if (!NEG_TRIGGER) begin
1221 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1222 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1223 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1224 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1225 always @(posedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1227 always @(negedge INPUTCLK) if (CLOCKENABLE) din_q_0 <= PACKAGEPIN;
1228 always @(posedge INPUTCLK) if (CLOCKENABLE) din_q_1 <= PACKAGEPIN;
1229 always @(negedge OUTPUTCLK) if (CLOCKENABLE) dout_q_0 <= DOUT0;
1230 always @(posedge OUTPUTCLK) if (CLOCKENABLE) dout_q_1 <= DOUT1;
1231 always @(negedge OUTPUTCLK) if (CLOCKENABLE) outena_q <= OUTPUTENABLE;
1235 if (!PIN_TYPE[1] || !LATCHINPUTVALUE)
1236 din_0 = PIN_TYPE[0] ? PACKAGEPIN : din_q_0;
1240 // work around simulation glitches on dout in DDR mode
1241 reg outclk_delayed_1;
1242 reg outclk_delayed_2;
1243 always @* outclk_delayed_1 <= OUTPUTCLK;
1244 always @* outclk_delayed_2 <= outclk_delayed_1;
1248 dout = PIN_TYPE[2] ? !dout_q_0 : DOUT0;
1250 dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1;
1253 assign DIN0 = din_0, DIN1 = din_1;
1256 if (PIN_TYPE[5:4] == 2'b01) assign PACKAGEPIN = dout ? 1'bz : 1'b0;
1257 if (PIN_TYPE[5:4] == 2'b10) assign PACKAGEPIN = OUTPUTENABLE ? (dout ? 1'bz : 1'b0) : 1'bz;
1258 if (PIN_TYPE[5:4] == 2'b11) assign PACKAGEPIN = outena_q ? (dout ? 1'bz : 1'b0) : 1'bz;
1265 input [15:0] C, A, B, D,
1266 input AHOLD, BHOLD, CHOLD, DHOLD,
1267 input IRSTTOP, IRSTBOT,
1268 input ORSTTOP, ORSTBOT,
1269 input OLOADTOP, OLOADBOT,
1270 input ADDSUBTOP, ADDSUBBOT,
1271 input OHOLDTOP, OHOLDBOT,
1272 input CI, ACCUMCI, SIGNEXTIN,
1274 output CO, ACCUMCO, SIGNEXTOUT
1276 parameter [0:0] NEG_TRIGGER = 0;
1277 parameter [0:0] C_REG = 0;
1278 parameter [0:0] A_REG = 0;
1279 parameter [0:0] B_REG = 0;
1280 parameter [0:0] D_REG = 0;
1281 parameter [0:0] TOP_8x8_MULT_REG = 0;
1282 parameter [0:0] BOT_8x8_MULT_REG = 0;
1283 parameter [0:0] PIPELINE_16x16_MULT_REG1 = 0;
1284 parameter [0:0] PIPELINE_16x16_MULT_REG2 = 0;
1285 parameter [1:0] TOPOUTPUT_SELECT = 0;
1286 parameter [1:0] TOPADDSUB_LOWERINPUT = 0;
1287 parameter [0:0] TOPADDSUB_UPPERINPUT = 0;
1288 parameter [1:0] TOPADDSUB_CARRYSELECT = 0;
1289 parameter [1:0] BOTOUTPUT_SELECT = 0;
1290 parameter [1:0] BOTADDSUB_LOWERINPUT = 0;
1291 parameter [0:0] BOTADDSUB_UPPERINPUT = 0;
1292 parameter [1:0] BOTADDSUB_CARRYSELECT = 0;
1293 parameter [0:0] MODE_8x8 = 0;
1294 parameter [0:0] A_SIGNED = 0;
1295 parameter [0:0] B_SIGNED = 0;
1297 wire clock = CLK ^ NEG_TRIGGER;
1299 // internal wires, compare Figure on page 133 of ICE Technology Library 3.0 and Fig 2 on page 2 of Lattice TN1295-DSP
1300 // http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201608.pdf
1301 // https://www.latticesemi.com/-/media/LatticeSemi/Documents/ApplicationNotes/AD/DSPFunctionUsageGuideforICE40Devices.ashx
1302 wire [15:0] iA, iB, iC, iD;
1303 wire [15:0] iF, iJ, iK, iG;
1305 wire [15:0] iW, iX, iP, iQ;
1306 wire [15:0] iY, iZ, iR, iS;
1311 always @(posedge clock, posedge IRSTTOP) begin
1315 end else if (CE) begin
1316 if (!CHOLD) rC <= C;
1317 if (!AHOLD) rA <= A;
1320 assign iC = C_REG ? rC : C;
1321 assign iA = A_REG ? rA : A;
1325 always @(posedge clock, posedge IRSTBOT) begin
1329 end else if (CE) begin
1330 if (!BHOLD) rB <= B;
1331 if (!DHOLD) rD <= D;
1334 assign iB = B_REG ? rB : B;
1335 assign iD = D_REG ? rD : D;
1338 wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;
1339 wire [15:0] Ah, Al, Bh, Bl;
1340 assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]};
1341 assign Al = {A_SIGNED ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};
1342 assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]};
1343 assign Bl = {B_SIGNED ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]};
1344 assign p_Ah_Bh = Ah * Bh;
1345 assign p_Al_Bh = Al * Bh;
1346 assign p_Ah_Bl = Ah * Bl;
1347 assign p_Al_Bl = Al * Bl;
1351 always @(posedge clock, posedge IRSTTOP) begin
1355 end else if (CE) begin
1357 if (!MODE_8x8) rJ <= p_Al_Bh;
1360 assign iF = TOP_8x8_MULT_REG ? rF : p_Ah_Bh;
1361 assign iJ = PIPELINE_16x16_MULT_REG1 ? rJ : p_Al_Bh;
1365 always @(posedge clock, posedge IRSTBOT) begin
1369 end else if (CE) begin
1370 if (!MODE_8x8) rK <= p_Ah_Bl;
1374 assign iK = PIPELINE_16x16_MULT_REG1 ? rK : p_Ah_Bl;
1375 assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;
1378 assign iL = iG + (iK << 8) + (iJ << 8) + (iF << 16);
1382 always @(posedge clock, posedge IRSTBOT) begin
1385 end else if (CE) begin
1386 if (!MODE_8x8) rH <= iL;
1389 assign iH = PIPELINE_16x16_MULT_REG2 ? rH : iL;
1394 assign iW = TOPADDSUB_UPPERINPUT ? iC : iQ;
1395 assign iX = (TOPADDSUB_LOWERINPUT == 0) ? iA : (TOPADDSUB_LOWERINPUT == 1) ? iF : (TOPADDSUB_LOWERINPUT == 2) ? iH[31:16] : {16{iZ[15]}};
1396 assign {ACCUMCO, XW} = iX + (iW ^ {16{ADDSUBTOP}}) + HCI;
1397 assign CO = ACCUMCO ^ ADDSUBTOP;
1398 assign iP = OLOADTOP ? iC : XW ^ {16{ADDSUBTOP}};
1399 always @(posedge clock, posedge ORSTTOP) begin
1402 end else if (CE) begin
1403 if (!OHOLDTOP) rQ <= iP;
1407 assign Oh = (TOPOUTPUT_SELECT == 0) ? iP : (TOPOUTPUT_SELECT == 1) ? iQ : (TOPOUTPUT_SELECT == 2) ? iF : iH[31:16];
1408 assign HCI = (TOPADDSUB_CARRYSELECT == 0) ? 1'b0 : (TOPADDSUB_CARRYSELECT == 1) ? 1'b1 : (TOPADDSUB_CARRYSELECT == 2) ? LCO : LCO ^ ADDSUBBOT;
1409 assign SIGNEXTOUT = iX[15];
1414 assign iY = BOTADDSUB_UPPERINPUT ? iD : iS;
1415 assign iZ = (BOTADDSUB_LOWERINPUT == 0) ? iB : (BOTADDSUB_LOWERINPUT == 1) ? iG : (BOTADDSUB_LOWERINPUT == 2) ? iH[15:0] : {16{SIGNEXTIN}};
1416 assign {LCO, YZ} = iZ + (iY ^ {16{ADDSUBBOT}}) + LCI;
1417 assign iR = OLOADBOT ? iD : YZ ^ {16{ADDSUBBOT}};
1418 always @(posedge clock, posedge ORSTBOT) begin
1421 end else if (CE) begin
1422 if (!OHOLDBOT) rS <= iR;
1426 assign Ol = (BOTOUTPUT_SELECT == 0) ? iR : (BOTOUTPUT_SELECT == 1) ? iS : (BOTOUTPUT_SELECT == 2) ? iG : iH[15:0];
1427 assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
1428 assign O = {Oh, Ol};