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